diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index ff98d8e8f6e..2f068019a35 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -70,6 +70,7 @@ jobs: if [ -n "${{ env.platform_files }}" ]; then pylint ${{ env.platform_files }} mypy ${{ env.platform_files }} --ignore-missing-imports --scripts-are-modules --check-untyped-defs + pydocstyle ${{ env.platform_files }} else echo "No Python files changed in openbb_platform" fi diff --git a/.github/workflows/platform-api-integration-test.yml b/.github/workflows/platform-api-integration-test.yml index 92b7073045b..11b4c9c5d40 100644 --- a/.github/workflows/platform-api-integration-test.yml +++ b/.github/workflows/platform-api-integration-test.yml @@ -2,6 +2,9 @@ name: API Integration Tests on: workflow_dispatch: + pull_request: + branches: + - release/* concurrency: group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.gitignore b/.gitignore index e92f1407831..bdd736b86dc 100644 --- a/.gitignore +++ b/.gitignore @@ -85,3 +85,9 @@ lightning_logs/ # Platform auto generated files openbb_platform/openbb/package/* + +# Reference files +website/content/excel/reference/* +website/content/excel/reference/*/* +website/content/platform/data_models/* +website/content/platform/reference/* diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 51e9141e239..62f9111ca92 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1716,8 +1716,6 @@ The `develop` branch is only merged to `main` right before a new release, but so 3. merge `docs/[my-update]` into `main` -> website deployment triggered 4. merge `docs/[my-update]` into `develop` -> NO website deployment, just to sync branches -The `docs/docs-name` branch is used to update documentation in-between releases, it will trigger the website deployment to GitHub pages. - ## Installers When implementing a new feature or fixing something within the codebase, it is necessary to ensure that it is working diff --git a/build/README.md b/build/README.md deleted file mode 100644 index 0d9dcc1b1b2..00000000000 --- a/build/README.md +++ /dev/null @@ -1,69 +0,0 @@ -# Building Installers -This guide serves to assist developers construct OpenBB Terminal installers on macOS and Windows. - -## Overview -Building an installer takes source code as input and produces deployable software as an output. For MacOS the output is a DMG while for Windows it is an EXE. This process utilizes two major modules: Pyinstaller & Create-dmg. Windows additionally recruits the service of NSIS. There are two ways to build an installer: locally or through Github. - -## Local -In this section we detail the steps necessary to construct an installer locally on a Windows machine and Mac machine. These steps can be performed on either one of these operating systems so long as they have the OpenBBTerminal repository codebase. This process assumes you already have a working conda environment. Building locally usually takes anywhere from 10-20 minutes. - -### MacOS Steps -1. `brew install create-dmg` - - This installs create-dmg and its dependencies onto your system through brew. - -1. `poetry install -E installer` - - This install pyinstaller and its dependencies onto your environment. - -3. `build/pyinstaller/build4mac.sh` - - This runs a shell script that auto-builds the DMG and stores it on the root of your repository. - -4. (Optional) `/Full/Path/To/OpenBB\ Terminal/.OpenBB/OpenBBTerminal /Full/Path/To/OpenBBTerminal/OpenBBTerminal/scripts/*.openbb -t` - - This runs integration tests on your newly created installer. - -### Windows Steps -1. `poetry install -E installer` - - This install pyinstaller and its dependencies onto your environment. - -2. `pyinstaller build/pyinstaller/terminal.spec` - - This runs a shell script that auto-builds the DMG and stores it on the root of your repository. - -3. `cp -r .\dist\OpenBBTerminal\ .\build\nsis\app\` - - This copies over the contents of the newly dist folder into the app folder so that NSIS can utilize them. - -4. Compile NSIS Scripts - - Open *NSIS*, click on the "Compile NSI scripts", and then drag the `setup.nsi` file in build\nsis to the window. This creates the EXE installer. - -4. (Optional) `Full\Path\To\OpenBBTerminal.exe Full\Path\To\OpenBBTerminal\OpenBBTerminal\scripts -t` - - This runs integration tests on your newly created installer. - - -## Github -In order to utilize the automated build workflow on the OpenBBTerminal repo, the branch in which you would like to build an installer from must already be a branch on the repo. You can also utilize the automated build workflow on a PR that is from a branch on the repo. You cannot run an automated build on a forked branch or even a PR from a forked branch. - -If you are using this method to create an installer, there is a limitation where only one build automation can occur at a time per workflow. For example if there is already an installer being created on the ‘Intel MacOS Build’ workflow, any subsequent requests for building will be queued. Additionally, the ‘Windows10 Build’ workflow runs relatively slowly because of the size of the EC2 instance it is currently on. As such, if you are interested in a quick build, then I would suggest building locally. Furthermore, building an installer this way also automatically runs integration tests on the installer. - -If you run into a circumstance where a requested build is queued for a long period of time, this might mean that the EC2 instance is not connected to github. If something like this arises, please create an issue. - -### Steps -1. Navigate to `Actions` -2. Navigate to your desired build system workflow -3. Choose your desired branch & click Run Workflow -4. Download your installer artifact - - Each build system produces a single installer which can be subsequently downloaded. - -5. Investigate the success/failure of your Build - - You can click on the build to delve into the steps it takes to construct an installer. This is where you can investigate the success of integration tests, identify if/where the build failed, etc. - - -Note: Intel Mac installers are signed and notarized. During this step you can identify if notarization has succeeded or failed and if all of the binaries have been signed in correctly. diff --git a/build/docker/api.dockerfile b/build/docker/api.dockerfile index 430b8511d5b..c384555f9f8 100644 --- a/build/docker/api.dockerfile +++ b/build/docker/api.dockerfile @@ -1,5 +1,5 @@ # ---- Base Python ---- -FROM python:3.10-slim-buster AS base +FROM python:3.11-slim-bullseye AS base # set work directory WORKDIR /openbb @@ -10,19 +10,33 @@ ENV PYTHONUNBUFFERED 1 # install dependencies RUN apt-get update \ - && apt-get install -y --no-install-recommends build-essential openssh-client \ + && apt-get install -y --no-install-recommends build-essential openssh-client curl \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* +# install toml and poetry +RUN pip install toml poetry + # ---- Copy Files/Build ---- FROM base AS builder WORKDIR /openbb +# install Rust +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y \ + && apt-get update \ + && apt-get install -y --no-install-recommends libwebkit2gtk-4.0-dev \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/* + +# add Rust to PATH +ENV PATH="/root/.cargo/bin:${PATH}" + COPY ./openbb_platform ./openbb_platform # Install the SDK -RUN pip install /openbb/openbb_platform +RUN pip install /openbb/openbb_platform[all] +RUN pip install openbb-devtools # ---- Copy Files ---- FROM base diff --git a/build/docker/build.sh b/build/docker/build.sh deleted file mode 100644 index a61148f313b..00000000000 --- a/build/docker/build.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/sh - -echo "Building docker release" - -if [ -z "$OPENBBTERMINAL_DOCKER_RELEASE_VERSION" ] -then - read -p "Version number (X.Y.Z format): " OPENBBTERMINAL_DOCKER_RELEASE_VERSION -fi - -# SET DEFAULT PARAMETERS IF EMPTY -OPENBBTERMINAL_DOCKER_REGISTRY="${OPENBBTERMINAL_DOCKER_REGISTRY:-ghcr.io}" -OPENBBTERMINAL_DOCKER_GITHUB_REPOSITORY="${OPENBBTERMINAL_DOCKER_GITHUB_REPOSITORY:-openbb-finance/openbbterminal}" -OPENBBTERMINAL_DOCKER_RELEASE_VERSION="${OPENBBTERMINAL_DOCKER_RELEASE_VERSION:-0.0.0}" -# SET IMAGES NAMES -OPENBBTERMINAL_DOCKER_POETRY_IMAGE=${OPENBBTERMINAL_DOCKER_REGISTRY,,}/${OPENBBTERMINAL_DOCKER_GITHUB_REPOSITORY,,}/openbb:${OPENBBTERMINAL_DOCKER_RELEASE_VERSION,,} -OPENBBTERMINAL_DOCKER_POETRY_IMAGE_LATEST=${OPENBBTERMINAL_DOCKER_REGISTRY,,}/${OPENBBTERMINAL_DOCKER_GITHUB_REPOSITORY,,}/openbb:latest - -# DISPLAY PARAMETERS -echo "OPENBBTERMINAL_DOCKER_REGISTRY = $OPENBBTERMINAL_DOCKER_REGISTRY" -echo "OPENBBTERMINAL_DOCKER_GITHUB_REPOSITORY = $OPENBBTERMINAL_DOCKER_GITHUB_REPOSITORY" -echo "OPENBBTERMINAL_DOCKER_RELEASE_VERSION = $OPENBBTERMINAL_DOCKER_RELEASE_VERSION" -# DISPLAY IMAGES NAMES -echo "OPENBBTERMINAL_DOCKER_POETRY_IMAGE = $OPENBBTERMINAL_DOCKER_POETRY_IMAGE" - -# Docker command to build image -docker build -f build/docker/openbb.dockerfile -t "${OPENBBTERMINAL_DOCKER_POETRY_IMAGE}" -t "${OPENBBTERMINAL_DOCKER_POETRY_IMAGE_LATEST}" . \ No newline at end of file diff --git a/build/docker/compose.env b/build/docker/compose.env deleted file mode 100644 index bc8a9bcb697..00000000000 --- a/build/docker/compose.env +++ /dev/null @@ -1,2 +0,0 @@ -OPENBBTERMINAL_DOCKER_REGISTRY="ghcr.io" -OPENBBTERMINAL_DOCKER_RELEASE_VERSION="3.2.5" diff --git a/build/docker/docker-compose.x11.yaml b/build/docker/docker-compose.x11.yaml deleted file mode 100644 index a10f5594d5a..00000000000 --- a/build/docker/docker-compose.x11.yaml +++ /dev/null @@ -1,6 +0,0 @@ -services: - openbb: - environment: - DISPLAY: ${DISPLAY} - volumes: - - /tmp/.X11-unix:/tmp/.X11-unix diff --git a/build/docker/docker-compose.yaml b/build/docker/docker-compose.yaml deleted file mode 100644 index c4193a96b7c..00000000000 --- a/build/docker/docker-compose.yaml +++ /dev/null @@ -1,12 +0,0 @@ -version: '3.8' -services: - openbb: - environment: - DISPLAY: host.docker.internal:0.0 - volumes: - - ~/OpenBBUserData:/home/python/OpenBBUserData - - ~/.openbb_terminal:/home/python/.openbb_terminal - platform: linux/amd64 - image: ghcr.io/openbb-finance/openbbterminal/openbb:latest - stdin_open: true # docker run -i - tty: true # docker run -t diff --git a/build/docker/openbb.dockerfile b/build/docker/openbb.dockerfile deleted file mode 100644 index 81731b5197a..00000000000 --- a/build/docker/openbb.dockerfile +++ /dev/null @@ -1,75 +0,0 @@ -# SETUP PYTHON IMAGE -FROM --platform=linux/amd64 python:3.10-slim-bullseye as python - -LABEL org.opencontainers.image.source https://github.com/OpenBB-finance/OpenBBTerminal - -# SETUP DEBIAN IMAGE -FROM python as debian - -RUN apt-get update - -RUN apt-get -y install --no-install-recommends \ - gcc \ - g++ \ - make - -RUN apt-get -y install --no-install-recommends \ - git - -RUN apt-get -y install --no-install-recommends \ - curl \ - wget - -RUN apt-get -y install --no-install-recommends \ - libsm6 \ - libxt6 \ - libgl1-mesa-glx \ - libpng16-16 \ - libwebkit2gtk-4.0-dev \ - build-essential \ - libssl-dev \ - librsvg2-dev \ - ffmpeg \ - python3-tk - -RUN apt-get clean - -RUN useradd --create-home --shell /bin/bash python - -USER python -WORKDIR /home/python - -# SETUP POETRY IMAGE -FROM debian as poetry - -ENV PATH="/home/python/.local/bin:${PATH}" - -RUN pip install --upgrade pip wheel -RUN pip install poetry==1.4.0 - -# SETUP OPENBB IMAGE -FROM poetry as repository - -COPY --chown=python:python pyproject.toml poetry.lock terminal.py ./ - -RUN mkdir openbb_terminal -COPY --chown=python:python openbb_terminal openbb_terminal - -RUN mkdir -p website/content/sdk -COPY --chown=python:python ./website/content/sdk/installation.md ./website/content/sdk - -RUN mkdir OpenBBUserData -RUN chown python:python OpenBBUserData - -RUN mkdir .openbb_terminal -RUN chown python:python .openbb_terminal - -# SETUP OPENBB IMAGE -FROM repository as dependencies - -RUN poetry install --no-root --no-dev --extras optimization --extras forecast - -# SETUP OPENBB IMAGE -FROM dependencies as openbb - -CMD ["poetry", "run", "python", "terminal.py"] diff --git a/build/nsis/assets/Installer_horizontal.bmp b/build/nsis/assets/Installer_horizontal.bmp deleted file mode 100644 index 7de27025699..00000000000 Binary files a/build/nsis/assets/Installer_horizontal.bmp and /dev/null differ diff --git a/build/nsis/assets/Installer_horizontal2.png b/build/nsis/assets/Installer_horizontal2.png deleted file mode 100644 index 2261c710255..00000000000 Binary files a/build/nsis/assets/Installer_horizontal2.png and /dev/null differ diff --git a/build/nsis/assets/Installer_horizontall.png b/build/nsis/assets/Installer_horizontall.png deleted file mode 100644 index bddba4ab947..00000000000 Binary files a/build/nsis/assets/Installer_horizontall.png and /dev/null differ diff --git a/build/nsis/assets/Installer_vertical#2.png b/build/nsis/assets/Installer_vertical#2.png deleted file mode 100644 index f722988ffa2..00000000000 Binary files a/build/nsis/assets/Installer_vertical#2.png and /dev/null differ diff --git a/build/nsis/assets/Installer_vertical.png b/build/nsis/assets/Installer_vertical.png deleted file mode 100644 index 078721b00d1..00000000000 Binary files a/build/nsis/assets/Installer_vertical.png and /dev/null differ diff --git a/build/nsis/assets/Installer_vertical2.bmp b/build/nsis/assets/Installer_vertical2.bmp deleted file mode 100644 index 54f9b618845..00000000000 Binary files a/build/nsis/assets/Installer_vertical2.bmp and /dev/null differ diff --git a/build/nsis/assets/Splashscreen #2.png b/build/nsis/assets/Splashscreen #2.png deleted file mode 100644 index 0f95c376fb2..00000000000 Binary files a/build/nsis/assets/Splashscreen #2.png and /dev/null differ diff --git a/build/nsis/assets/Splashscreen.png b/build/nsis/assets/Splashscreen.png deleted file mode 100644 index a0c18bd195f..00000000000 Binary files a/build/nsis/assets/Splashscreen.png and /dev/null differ diff --git a/build/nsis/assets/openbb_icon.ico b/build/nsis/assets/openbb_icon.ico deleted file mode 100644 index ec1a7d484f4..00000000000 Binary files a/build/nsis/assets/openbb_icon.ico and /dev/null differ diff --git a/build/nsis/license.txt b/build/nsis/license.txt deleted file mode 100644 index 5ef8d0820f7..00000000000 --- a/build/nsis/license.txt +++ /dev/null @@ -1,3 +0,0 @@ -The information provided by OpenBB Terminal ("application") is for general informational purposes only. All information on the application is provided in good faith, however we make no representation or warranty of any kind, express or implied, regarding the accuracy, adequacy, validity, reliability, availability or completeness of any information on the application. - -Under no circumstance shall we have any liability to you for any loss or damage of any kind incurred as a result of the use of the application or reliance on any information provided on the application. Your use of the application and your reliance on any information on it is solely at your own risk. \ No newline at end of file diff --git a/build/nsis/setup.nsi b/build/nsis/setup.nsi deleted file mode 100644 index c3f23890cd6..00000000000 --- a/build/nsis/setup.nsi +++ /dev/null @@ -1,277 +0,0 @@ -;-------------------------------- -; Includes - - !include "MUI2.nsh" - !include "logiclib.nsh" - - -;-------------------------------- -; Custom defines - !define NAME "OpenBB Terminal" - !define COMPANY "OpenBB" - !define APPFILE "OpenBBTerminal.exe" - !define VERSION "3.2.5" - !define SLUG "${NAME} v${VERSION}" - -;-------------------------------- -; Info for Installer.exe - VIProductVersion 3.2.5.0 - VIAddVersionKey ProductName "OpenBB Terminal" - VIAddVersionKey Comments "An installer for OpenBB Terminal. For additional details, visit OpenBB.co" - VIAddVersionKey CompanyName OpenBB.co - VIAddVersionKey FileDescription "OpenBB Terminal Program" - VIAddVersionKey FileVersion 3.2.5.0 - VIAddVersionKey ProductVersion 3.2.5.0 - VIAddVersionKey InternalName "OpenBB Terminal" - -;-------------------------------- -; General - Name "${NAME}" - OutFile "${NAME} Setup.exe" - InstallDir $PROFILE\OpenBB - RequestExecutionLevel user - -;-------------------------------- -; UI - - !define MUI_ICON "assets\openbb_icon.ico" - !define MUI_UNICON "assets\openbb_icon.ico" - !define MUI_HEADERIMAGE - !define MUI_WELCOMEFINISHPAGE_BITMAP "assets\installer_vertical2.bmp" - !define MUI_HEADERIMAGE_BITMAP "assets\installer_horizontal.bmp" - !define MUI_ABORTWARNING - !define MUI_WELCOMEPAGE_TITLE "${SLUG} Setup" - !define UninstId "OpenBBTerminal" ; You might want to use a GUID here - !define MUI_FINISHPAGE_RUN - !define MUI_FINISHPAGE_RUN_NOTCHECKED - !define MUI_FINISHPAGE_RUN_TEXT "Start OpenBB Terminal" - !define MUI_FINISHPAGE_RUN_FUNCTION "StartOpenBB" - -;-------------------------------- -; Pages - - ; Installer pages - !insertmacro MUI_PAGE_WELCOME - !insertmacro MUI_PAGE_LICENSE "license.txt" -; !insertmacro MUI_PAGE_COMPONENTS - !insertmacro MUI_PAGE_DIRECTORY - !insertmacro MUI_PAGE_INSTFILES - !insertmacro MUI_PAGE_FINISH - - ; Uninstaller pages - !insertmacro MUI_UNPAGE_CONFIRM - !insertmacro MUI_UNPAGE_INSTFILES - - ; Set UI language - !insertmacro MUI_LANGUAGE "English" - - - Var /GLOBAL installerPath - - - - - -; StrContains -; This function does a case sensitive searches for an occurrence of a substring in a string. -; It returns the substring if it is found. -; Otherwise it returns null(""). -; Written by kenglish_hi -; Adapted from StrReplace written by dandaman32 - - -Var STR_HAYSTACK -Var STR_NEEDLE -Var STR_CONTAINS_VAR_1 -Var STR_CONTAINS_VAR_2 -Var STR_CONTAINS_VAR_3 -Var STR_CONTAINS_VAR_4 -Var STR_RETURN_VAR - - -Function StartOpenBB - Exec "$InstDir\OpenBBTerminal.exe" -FunctionEnd - - -Function StrContains - Exch $STR_NEEDLE - Exch 1 - Exch $STR_HAYSTACK - ; Uncomment to debug - ;MessageBox MB_OK 'STR_NEEDLE = $STR_NEEDLE STR_HAYSTACK = $STR_HAYSTACK ' - StrCpy $STR_RETURN_VAR "" - StrCpy $STR_CONTAINS_VAR_1 -1 - StrLen $STR_CONTAINS_VAR_2 $STR_NEEDLE - StrLen $STR_CONTAINS_VAR_4 $STR_HAYSTACK - loop: - IntOp $STR_CONTAINS_VAR_1 $STR_CONTAINS_VAR_1 + 1 - StrCpy $STR_CONTAINS_VAR_3 $STR_HAYSTACK $STR_CONTAINS_VAR_2 $STR_CONTAINS_VAR_1 - StrCmp $STR_CONTAINS_VAR_3 $STR_NEEDLE found - StrCmp $STR_CONTAINS_VAR_1 $STR_CONTAINS_VAR_4 done - Goto loop - found: - StrCpy $STR_RETURN_VAR $STR_NEEDLE - Goto done - done: - Pop $STR_NEEDLE ;Prevent "invalid opcode" errors and keep the - Exch $STR_RETURN_VAR -FunctionEnd - -!macro _StrContainsConstructor OUT NEEDLE HAYSTACK - Push `${HAYSTACK}` - Push `${NEEDLE}` - Call StrContains - Pop `${OUT}` -!macroend - -!define StrContains '!insertmacro "_StrContainsConstructor"' - - -;------------------------------- -; Uninstall Previous Version if exists - -!macro UninstallExisting exitcode uninstcommand -Push `${uninstcommand}` -Call UninstallExisting -Pop ${exitcode} -!macroend -Function UninstallExisting -Exch $1 ; uninstcommand -Push $2 ; Uninstaller -Push $3 ; Len -StrCpy $3 "" -StrCpy $2 $1 1 -StrCmp $2 '"' qloop sloop -sloop: - StrCpy $2 $1 1 $3 - IntOp $3 $3 + 1 - StrCmp $2 "" +2 - StrCmp $2 ' ' 0 sloop - IntOp $3 $3 - 1 - Goto run -qloop: - StrCmp $3 "" 0 +2 - StrCpy $1 $1 "" 1 ; Remove initial quote - IntOp $3 $3 + 1 - StrCpy $2 $1 1 $3 - StrCmp $2 "" +2 - StrCmp $2 '"' 0 qloop -run: - StrCpy $2 $1 $3 ; Path to uninstaller - StrCpy $1 161 ; ERROR_BAD_PATHNAME - GetFullPathName $3 "$2\.." ; $InstDir - IfFileExists "$2" 0 +4 - ExecWait '"$2" /S _?=$3' $1 ; This assumes the existing uninstaller is a NSIS uninstaller, other uninstallers don't support /S nor _?= - IntCmp $1 0 "" +2 +2 ; Don't delete the installer if it was aborted - Delete "$2" ; Delete the uninstaller - RMDir "$3" ; Try to delete $InstDir - RMDir "$3\.." ; (Optional) Try to delete the parent of $InstDir -Pop $3 -Pop $2 -Exch $1 ; exitcode -FunctionEnd - - -Function .onInit -ReadRegStr $0 HKCU "Software\Software\Microsoft\Windows\CurrentVersion\Uninstall\${UninstId}" "UninstallString" -${If} $0 != "" -${AndIf} ${Cmd} `MessageBox MB_YESNO|MB_ICONQUESTION "It is highly recommended to uninstall the previous version of OpenBB Terminal - Please click Yes to proceed (Note - You will not lose your custom settings) - Or you can uninstall manually. " /SD IDYES IDYES` - !insertmacro UninstallExisting $0 $0 - ${If} $0 <> 0 - MessageBox MB_YESNO|MB_ICONSTOP "Failed to uninstall, continue anyway?" /SD IDYES IDYES +2 - Abort - ${EndIf} -${EndIf} -FunctionEnd - -;-------------------------------- -; Section - Install App - - Section "-hidden app" - SectionIn RO - ${StrContains} $0 "\OpenBB" "$INSTDIR" - ; Making sure here if user manually removes \openbb from their path that it still installs there - ; so we dont have issues with uninstaller later. - StrCmp $0 "" notfound - ; MessageBox MB_OK 'Found string $0 $INSTDIR' - SetOutPath "$INSTDIR" - Goto done - notfound: - ; MessageBox MB_OK "$INSTDIR is 'bla'" - SetOutPath "$INSTDIR\OpenBB" - StrCpy $InstDir "$INSTDIR\OpenBB" - ; MessageBox MB_OK 'Did not find string "$INSTDIR\OpenBB" "$installerPath"' - done: - - File /r "app\*.*" - WriteRegStr HKCU "Software\${NAME}" "" $INSTDIR - WriteUninstaller "$INSTDIR\Uninstall.exe" - WriteRegStr HKCU "Software\Software\Microsoft\Windows\CurrentVersion\Uninstall\${UninstId}" "OpenBBTerminal" "OpenBB" - WriteRegStr HKCU "Software\Software\Microsoft\Windows\CurrentVersion\Uninstall\${UninstId}" "UninstallString" '"$InstDir\Uninstall.exe"' - WriteRegStr HKCU "Software\Software\Microsoft\Windows\CurrentVersion\Uninstall\${UninstId}" "QuietUninstallString" '"$InstDir\Uninstall.exe" /S' - SectionEnd - - -;-------------------------------- -; Section - Shortcut - - Section "Desktop Shortcut" DeskShort - CreateShortCut "$DESKTOP\${NAME}.lnk" "$INSTDIR\${APPFILE}" - CreateDirectory '$SMPROGRAMS\${Company}\${NAME}' - CreateShortCut '$SMPROGRAMS\${Company}\${NAME}\${NAME}.lnk' '$INSTDIR\${APPFILE}' "" '$INSTDIR\${APPFILE}' 0 - CreateShortCut '$SMPROGRAMS\${Company}\${NAME}\Uninstall ${NAME}.lnk' '$INSTDIR\Uninstall.exe' "" '$INSTDIR\Uninstall.exe' 0 - SectionEnd - - -;-------------------------------- -; Remove empty parent directories - - Function un.RMDirUP - !define RMDirUP '!insertmacro RMDirUPCall' - - !macro RMDirUPCall _PATH - push '${_PATH}' - Call un.RMDirUP - !macroend - - ; $0 - current folder - ClearErrors - - Exch $0 - ;DetailPrint "ASDF - $0\.." - RMDir "$0\.." - - IfErrors Skip - ${RMDirUP} "$0\.." - Skip: - - Pop $0 - - FunctionEnd - -;-------------------------------- -; Section - Uninstaller - -Section "Uninstall" - - ;Delete Shortcut - Delete "$DESKTOP\${NAME}.lnk" - - ;Delete Directory - Delete '$SMPROGRAMS\${Company}\${NAME}' - - ;Delete Reg Key - DeleteRegKey HKCU "Software\Software\Microsoft\Windows\CurrentVersion\Uninstall\${UninstId}" - - ;Delete Uninstall - Delete "$INSTDIR\Uninstall.exe" - - - ;Delete Folder - RMDir /r "$INSTDIR" - ${RMDirUP} "$INSTDIR" - - DeleteRegKey /ifempty HKCU "Software\${NAME}" - -SectionEnd diff --git a/build/pyinstaller/.env b/build/pyinstaller/.env deleted file mode 100644 index 58e3640f467..00000000000 --- a/build/pyinstaller/.env +++ /dev/null @@ -1,26 +0,0 @@ -OPENBB_LOGGING_APP_NAME=gst_packaged -OPENBB_LOGGING_COMMIT_HASH=sha:a7c3d29 -OPENBB_ENABLE_PREDICT=false -OPENBB_ENABLE_CHECK_API=true -OPENBB_ENABLE_THOUGHTS_DAY=false -OPENBB_REMEMBER_CONTEXTS=true -OPENBB_USE_FLAIR=:openbb -OPENBB_USE_WATERMARK=true -OPENBB_USE_CMD_LOCATION_FIGURE=true -OPENBB_USE_PROMPT_TOOLKIT=true -OPENBB_USE_COLOR=true -OPENBB_USE_ION=true -OPENBB_USE_PLOT_AUTOSCALING=false -OPENBB_ENABLE_RICH=true -OPENBB_ENABLE_RICH_PANEL=true -OPENBB_MPLSTYLE=dark -OPENBB_MPFSTYLE=dark -OPENBB_RICHSTYLE=dark -OPENBB_DEBUG_MODE=false -OPENBB_USE_TABULATE_DF=true -OPENBB_USE_INTERACTIVE_DF=true -OPENBB_USE_CLEAR_AFTER_CMD=false -OPENBB_USE_DATETIME=true -OPENBB_OPEN_REPORT_AS_HTML=true -OPENBB_ENABLE_QUICK_EXIT=false -OPENBB_ENABLE_EXIT_AUTO_HELP=false diff --git a/build/pyinstaller/build4mac.sh b/build/pyinstaller/build4mac.sh deleted file mode 100755 index 5f6758be10f..00000000000 --- a/build/pyinstaller/build4mac.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash - -DISK_IMAGE_NAME="OpenBB Terminal" -SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" -BUNDLER_PATH="$SCRIPTPATH/macOS/build-macos.sh" - -# exit when any command fails -set -e - -# Clean Up artifacts from previous builds -rm -rf build/terminal && rm -rf dist && rm -rf DMG - -# Clean up local logging id -rm -rf openbb_terminal/logs - -# Running build -pyinstaller build/pyinstaller/terminal.spec # --clean - -# Assign icons to the built folder and launcher -osascript build/pyinstaller/setup_icons.applescript - -# Create the folder that is used for packaging -mkdir DMG - -# Copy relevant artifacts to the packaging folder -cp -r build/pyinstaller/macOS_package_assets/* DMG/ -mv dist/OpenBBTerminal DMG/"$DISK_IMAGE_NAME"/.OpenBB diff --git a/build/pyinstaller/entitlements.plist b/build/pyinstaller/entitlements.plist deleted file mode 100644 index 1d765f1a827..00000000000 --- a/build/pyinstaller/entitlements.plist +++ /dev/null @@ -1,18 +0,0 @@ - - - - - com.apple.security.cs.disable-library-validation - - com.apple.security.cs.allow-dyld-environment-variables - - com.apple.security.cs.allow-jit - - com.apple.security.cs.allow-unsigned-executable-memory - - com.apple.security.cs.disable-executable-page-protection - - com.apple.security.cs.debugger - - - diff --git a/build/pyinstaller/hooks/hook-debugpy.py b/build/pyinstaller/hooks/hook-debugpy.py deleted file mode 100644 index 42438ae0300..00000000000 --- a/build/pyinstaller/hooks/hook-debugpy.py +++ /dev/null @@ -1,8 +0,0 @@ -import os - -# This environment variable suppresses the warning: -# 0.00s - Debugger warning: The os.path.realpath.__code__.co_filename (posixpath.py) -# 0.00s - is not absolute, which may make the debugger miss breakpoints. -# 0.00s - Note: Debugging will proceed. Set PYDEVD_DISABLE_FILE_VALIDATION=1 to disable this validation. - -os.environ["PYDEVD_DISABLE_FILE_VALIDATION"] = "1" diff --git a/build/pyinstaller/hooks/hook-pytrends.py b/build/pyinstaller/hooks/hook-pytrends.py deleted file mode 100644 index 7209e9b024a..00000000000 --- a/build/pyinstaller/hooks/hook-pytrends.py +++ /dev/null @@ -1,3 +0,0 @@ -from PyInstaller.utils.hooks import collect_all - -datas, binaries, hiddenimports = collect_all("pytrends") diff --git a/build/pyinstaller/hooks/hook-rich.py b/build/pyinstaller/hooks/hook-rich.py deleted file mode 100644 index 392b324ac0f..00000000000 --- a/build/pyinstaller/hooks/hook-rich.py +++ /dev/null @@ -1,3 +0,0 @@ -from PyInstaller.utils.hooks import collect_data_files, copy_metadata - -datas = copy_metadata("rich") + collect_data_files("rich") diff --git a/build/pyinstaller/hooks/hook-streamlit.py b/build/pyinstaller/hooks/hook-streamlit.py deleted file mode 100644 index 05080f9a1fe..00000000000 --- a/build/pyinstaller/hooks/hook-streamlit.py +++ /dev/null @@ -1,3 +0,0 @@ -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata("streamlit") diff --git a/build/pyinstaller/hooks/hook-whisper.py b/build/pyinstaller/hooks/hook-whisper.py deleted file mode 100644 index 184d234339e..00000000000 --- a/build/pyinstaller/hooks/hook-whisper.py +++ /dev/null @@ -1,35 +0,0 @@ -import importlib - -import importlib_metadata -from PyInstaller.utils.hooks import copy_metadata - -datas = copy_metadata("transformers") -datas += copy_metadata("tokenizers") -datas += copy_metadata("tqdm") -datas += copy_metadata("regex") -datas += copy_metadata("requests") -datas += copy_metadata("packaging") -datas += copy_metadata("filelock") -datas += copy_metadata("numpy") -datas += copy_metadata("torch") - -candidates = [ - "tensorflow", - "tensorflow-cpu", - "tensorflow-gpu", - "tf-nightly", - "tf-nightly-cpu", - "tf-nightly-gpu", - "intel-tensorflow", - "intel-tensorflow-avx512", - "tensorflow-rocm", - "tensorflow-macos", - "tensorflow-aarch64", -] -for candidate in candidates: - try: - if importlib.util.find_spec(candidate): - datas += copy_metadata(candidate) - break - except importlib_metadata.PackageNotFoundError: - pass diff --git a/build/pyinstaller/hooks/hook-xgboost.py b/build/pyinstaller/hooks/hook-xgboost.py deleted file mode 100644 index 4274e6e0aa7..00000000000 --- a/build/pyinstaller/hooks/hook-xgboost.py +++ /dev/null @@ -1,3 +0,0 @@ -from PyInstaller.utils.hooks import collect_all - -datas, binaries, hiddenimports = collect_all("xgboost") diff --git a/build/pyinstaller/hooks/pyi_rth_inspect.py b/build/pyinstaller/hooks/pyi_rth_inspect.py deleted file mode 100644 index 718972baf50..00000000000 --- a/build/pyinstaller/hooks/pyi_rth_inspect.py +++ /dev/null @@ -1,39 +0,0 @@ -# Runtime hook copied from pyinstaller - - -import inspect -import os -import sys - -# pylint:disable=W0622,W0212,E1101 - -_orig_inspect_getsourcefile = inspect.getsourcefile - - -# Provide custom implementation of inspect.getsourcefile() for frozen applications that properly resolves relative -# filenames obtained from object (e.g., inspect stack-frames). See #5963. -def _pyi_getsourcefile(object): - filename = inspect.getfile(object) - if not os.path.isabs(filename): - # Check if given filename matches the basename of __main__'s __file__. - if hasattr(sys.modules["__main__"], "__file__"): - main_file = sys.modules["__main__"].__file__ - if filename == os.path.basename(main_file): - return main_file - - # If filename ends with .py suffix and does not correspond to frozen entry-point script, convert it to - # corresponding .pyc in sys._MEIPASS. - if filename.endswith(".py"): - filename = os.path.normpath(os.path.join(sys._MEIPASS, filename + "c")) - # Ensure the relative path did not try to jump out of sys._MEIPASS, just in case... - if filename.startswith(sys._MEIPASS): - return filename - elif filename.startswith(sys._MEIPASS) and filename.endswith(".pyc"): - # If filename is already PyInstaller-compatible, prevent any further processing (i.e., with original - # implementation). - return filename - # Use original implementation as a fallback. - return _orig_inspect_getsourcefile(object) - - -inspect.getsourcefile = _pyi_getsourcefile diff --git a/build/pyinstaller/macOS/.gitignore b/build/pyinstaller/macOS/.gitignore deleted file mode 100644 index 2f7896d1d13..00000000000 --- a/build/pyinstaller/macOS/.gitignore +++ /dev/null @@ -1 +0,0 @@ -target/ diff --git a/build/pyinstaller/macOS/build-macos.sh b/build/pyinstaller/macOS/build-macos.sh deleted file mode 100755 index b187ee58fe7..00000000000 --- a/build/pyinstaller/macOS/build-macos.sh +++ /dev/null @@ -1,216 +0,0 @@ -#!/bin/bash - -#Parameters -SCRIPTPATH="$( cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P )" -TARGET_DIRECTORY="$SCRIPTPATH/target" -BASE_DIRECTORY="$( cd -- "$(dirname "$1")" >/dev/null 2>&1 ; pwd -P )" -APP_DIRECTORY="$BASE_DIRECTORY/DMG/OpenBB Terminal" -BINARIES="$BASE_DIRECTORY/DMG/OpenBB\ Terminal/.OpenBB" -ENTITLEMENTS="$BASE_DIRECTORY/build/pyinstaller/entitlements.plist" -PRODUCT=${1} -VERSION=${2} -DATE=`date +%Y-%m-%d` -TIME=`date +%H:%M:%S` -LOG_PREFIX="[$DATE $TIME]" - - -function printUsage() { - echo -e "\033[1mUsage:\033[0m" - echo "$0 [APPLICATION_NAME] [APPLICATION_VERSION]" - echo - echo -e "\033[1mOptions:\033[0m" - echo " -h (--help)" - echo - echo -e "\033[1mExample::\033[0m" - echo "$0 openbbpro 0.0.1" - -} - -#Argument validation -if [ -z "$APPLE_DEVELOPER_CERTIFICATE_ID" ]; then - echo "APPLE_DEVELOPER_CERTIFICATE_ID environment variable is not set" - echo "Please run 'security find-identity -v', and then use the value for" - echo "the developer ID Installer (and NOT the Developer ID Application)" - exit 1 -fi -if [[ "$1" == "-h" || "$1" == "--help" ]]; then - printUsage - exit 1 -fi -if [ -z "$1" ]; then - echo "Please enter a valid application name for your application" - echo - printUsage - exit 1 -else - echo "Application Name : $1" -fi -if [[ "$2" =~ [0-9]+.[0-9]+.[0-9]+ ]]; then - echo "Application Version : $2" -else - echo "Please enter a valid version for your application (format [0-9].[0-9].[0-9])" - echo - printUsage - exit 1 -fi -if [ -z "$APPLE_SIGNING_IDENTITY" ]; then - echo "Please set the APPLE_SIGNING_IDENTITY environment variable" - exit 1 -fi - -#Functions -go_to_dir() { - pushd $1 >/dev/null 2>&1 -} - -log_info() { - echo "${LOG_PREFIX}[INFO]" $1 -} - -log_warn() { - echo "${LOG_PREFIX}[WARN]" $1 -} - -log_error() { - echo "${LOG_PREFIX}[ERROR]" $1 -} - -deleteInstallationDirectory() { - log_info "Cleaning $TARGET_DIRECTORY directory." - rm -rf "$TARGET_DIRECTORY" - - if [[ $? != 0 ]]; then - log_error "Failed to clean $TARGET_DIRECTORY directory" $? - exit 1 - fi -} - -signFiles() { - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/*.so - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/*/*.so - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/*/*/*.so - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/*/*/*/*.so - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/*/*/*/*/*.so - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/*/*/*/*/*/*.so - echo "Code Signing DYLIB Files" - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/*.dylib - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/*.dylib - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/*/*/*.dylib - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/*/*/*/*/*.dylib - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/pyarrow/*.dylib - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/prophet/.dylibs/*.dylib - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/scipy/.dylibs/*.dylib - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/xgboost/.dylibs/*.dylib - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/prophet/stan_model/cmdstan-2.26.1/stan/lib/stan_math/lib/tbb/*.dylib - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/torch/.dylibs/*.dylib - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/sklearn/.dylibs/*.dylib - echo "Coce Signing LIB Files" - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/*.lib - echo "Code Signing Other Files" - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/prophet/stan_model/prophet_model.bin - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/prophet/stan_model/cmdstan-2.26.1/bin/diagnose - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/prophet/stan_model/cmdstan-2.26.1/bin/print - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/prophet/stan_model/cmdstan-2.26.1/bin/stanc - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/prophet/stan_model/cmdstan-2.26.1/bin/stansummary - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/pyarrow/plasma-store-server - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/torch/bin/protoc - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/torch/bin/protoc-3.13.0.0 - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/torch/bin/torch_shm_manager - echo "Code Sign OpenBB Executable File" - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/OpenBBTerminal - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/OpenBBPlotsBackend - codesign --deep --force --verify --verbose --options runtime --entitlements "$ENTITLEMENTS" -s "$APPLE_SIGNING_IDENTITY" build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/pywry -} - -createInstallationDirectory() { - if [ -d "${TARGET_DIRECTORY}" ]; then - deleteInstallationDirectory - fi - mkdir -pv "$TARGET_DIRECTORY" - - if [[ $? != 0 ]]; then - log_error "Failed to create $TARGET_DIRECTORY directory" $? - exit 1 - fi -} - -copyDarwinDirectory(){ - createInstallationDirectory - cp -r "$SCRIPTPATH/darwin" "${TARGET_DIRECTORY}/" - chmod -R 755 "${TARGET_DIRECTORY}/darwin/scripts" - chmod -R 755 "${TARGET_DIRECTORY}/darwin/Resources" - chmod 755 "${TARGET_DIRECTORY}/darwin/Distribution" -} - -# This creates the target/darwin folder which contains the contents for formatting the installer -# It also created the target/darkwinpkg folder which has the .app to install -copyBuildDirectory() { - sed -i '' -e 's/__VERSION__/'${VERSION}'/g' "${TARGET_DIRECTORY}/darwin/scripts/postinstall" - sed -i '' -e 's/__PRODUCT__/'${PRODUCT}'/g' "${TARGET_DIRECTORY}/darwin/scripts/postinstall" - chmod -R 755 "${TARGET_DIRECTORY}/darwin/scripts/postinstall" - - sed -i '' -e 's/__VERSION__/'${VERSION}'/g' "${TARGET_DIRECTORY}/darwin/Distribution" - sed -i '' -e 's/__PRODUCT__/'${PRODUCT}'/g' "${TARGET_DIRECTORY}/darwin/Distribution" - chmod -R 755 "${TARGET_DIRECTORY}/darwin/Distribution" - - sed -i '' -e 's/__VERSION__/'${VERSION}'/g' "${TARGET_DIRECTORY}"/darwin/Resources/*.html - sed -i '' -e 's/__PRODUCT__/'${PRODUCT}'/g' "${TARGET_DIRECTORY}"/darwin/Resources/*.html - chmod -R 755 "${TARGET_DIRECTORY}/darwin/Resources/" - - rm -rf "${TARGET_DIRECTORY}/darwinpkg" - mkdir -p "${TARGET_DIRECTORY}/darwinpkg" - - mkdir -p "${TARGET_DIRECTORY}"/darwinpkg/Applications - cp -a "${APP_DIRECTORY}" "${TARGET_DIRECTORY}"/darwinpkg/Applications - - rm -rf "${TARGET_DIRECTORY}/package" - mkdir -p "${TARGET_DIRECTORY}/package" - chmod -R 755 "${TARGET_DIRECTORY}/package" - - rm -rf "${TARGET_DIRECTORY}/pkg" - mkdir -p "${TARGET_DIRECTORY}/pkg" - chmod -R 755 "${TARGET_DIRECTORY}/pkg" -} - -# Creates the target/package folder. This includes a basic.pkg file with no formatting -function buildPackage() { - log_info "Application installer package building started.(1/3)" - # For now I removed the --identifier - pkgbuild --version "${VERSION}" \ - --scripts "${TARGET_DIRECTORY}/darwin/scripts" \ - --root "${TARGET_DIRECTORY}/darwinpkg" \ - --identifier "OpenBB Terminal" \ - --ownership preserve \ - "${TARGET_DIRECTORY}/package/${PRODUCT}.pkg" -} - -# Creates the target/pkg folder. This includes the finished pkg file to let users download -function buildProduct() { - log_info "Application installer product building started.(2/3)" - productbuild --distribution "${TARGET_DIRECTORY}/darwin/Distribution" \ - --resources "${TARGET_DIRECTORY}/darwin/Resources" \ - --package-path "${TARGET_DIRECTORY}/package" \ - --sign "${APPLE_DEVELOPER_CERTIFICATE_ID}" \ - "${TARGET_DIRECTORY}/pkg/$1" -} - -function createInstaller() { - log_info "Application installer generation process started.(3 Steps)" - buildPackage - chmod -R 754 "${TARGET_DIRECTORY}/darwinpkg" - buildProduct OpenBBTerminalM1.pkg - log_info "Application installer generation steps finished." -} - -#Main script -log_info "Installer generating process started." - -copyDarwinDirectory -copyBuildDirectory -signFiles -chmod 755 build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/.env -# chmod -R 755 build/pyinstaller/macOS/target/darwinpkg/Applications/OpenBB\ Terminal/.OpenBB/ -createInstaller - -log_info "Installer generating process finished" -exit 0 diff --git a/build/pyinstaller/macOS/darwin/Distribution b/build/pyinstaller/macOS/darwin/Distribution deleted file mode 100644 index 9e328d8662c..00000000000 --- a/build/pyinstaller/macOS/darwin/Distribution +++ /dev/null @@ -1,36 +0,0 @@ - - - __PRODUCT__ - - - - - - - - - - - - - - __PRODUCT__.pkg - - __PRODUCT__.pkg - diff --git a/build/pyinstaller/macOS/darwin/Resources/LICENSE.txt b/build/pyinstaller/macOS/darwin/Resources/LICENSE.txt deleted file mode 100644 index b86fa3e85d2..00000000000 --- a/build/pyinstaller/macOS/darwin/Resources/LICENSE.txt +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2021-2024 OpenBB Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/build/pyinstaller/macOS/darwin/Resources/background-light.png b/build/pyinstaller/macOS/darwin/Resources/background-light.png deleted file mode 100644 index 29b0d7c410a..00000000000 Binary files a/build/pyinstaller/macOS/darwin/Resources/background-light.png and /dev/null differ diff --git a/build/pyinstaller/macOS/darwin/Resources/background.png b/build/pyinstaller/macOS/darwin/Resources/background.png deleted file mode 100644 index 46a9ac8e48b..00000000000 Binary files a/build/pyinstaller/macOS/darwin/Resources/background.png and /dev/null differ diff --git a/build/pyinstaller/macOS/darwin/Resources/banner.png b/build/pyinstaller/macOS/darwin/Resources/banner.png deleted file mode 100644 index 3290b6063ea..00000000000 Binary files a/build/pyinstaller/macOS/darwin/Resources/banner.png and /dev/null differ diff --git a/build/pyinstaller/macOS/darwin/Resources/conclusion.html b/build/pyinstaller/macOS/darwin/Resources/conclusion.html deleted file mode 100644 index b8e90473469..00000000000 --- a/build/pyinstaller/macOS/darwin/Resources/conclusion.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - -
-

WSO2 API Manager

-

Thank you for installing WSO2 API MAnager.

-
Run API Manager
-

Open a new terminal and run the following command to get started with APIM server:

-   $ wso2am-2.6.0 [command] -
-
-
-
Resources
-

Go through following links for additional information.

- -
-
-
-
Uninstall WSO2 API Manager
-

Run the following command to uninstall WSO2 API Manager.
-
  $ sudo bash /Library/__PRODUCT__/__VERSION__/uninstall.sh
-

-
-

-

Copyright © 2019 WSO2 Inc. All rights reserved. API Manager and its use subject to a license agreement and are also subject to copyright, trademark patent and/or other laws.

-
- - diff --git a/build/pyinstaller/macOS/darwin/Resources/uninstall.sh b/build/pyinstaller/macOS/darwin/Resources/uninstall.sh deleted file mode 100644 index 09e364e9019..00000000000 --- a/build/pyinstaller/macOS/darwin/Resources/uninstall.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/bash - -#Generate application uninstallers for macOS. - -#Parameters -DATE=`date +%Y-%m-%d` -TIME=`date +%H:%M:%S` -LOG_PREFIX="[$DATE $TIME]" - -#Functions -log_info() { - echo "${LOG_PREFIX}[INFO]" $1 -} - -log_warn() { - echo "${LOG_PREFIX}[WARN]" $1 -} - -log_error() { - echo "${LOG_PREFIX}[ERROR]" $1 -} - -#Check running user -if (( $EUID != 0 )); then - echo "Please run as root." - exit -fi - -echo "Welcome to Application Uninstaller" -echo "The following packages will be REMOVED:" -echo " __PRODUCT__-__VERSION__" -while true; do - read -p "Do you wish to continue [Y/n]?" answer - [[ $answer == "y" || $answer == "Y" || $answer == "" ]] && break - [[ $answer == "n" || $answer == "N" ]] && exit 0 - echo "Please answer with 'y' or 'n'" -done - - -#Need to replace these with install preparation script -VERSION=__VERSION__ -PRODUCT=__PRODUCT__ - -echo "Application uninstalling process started" -# remove link to shortcut file -find "/usr/local/bin/" -name "__PRODUCT__-__VERSION__" | xargs rm -if [ $? -eq 0 ] -then - echo "[1/3] [DONE] Successfully deleted shortcut links" -else - echo "[1/3] [ERROR] Could not delete shortcut links" >&2 -fi - -#forget from pkgutil -pkgutil --forget "org.$PRODUCT.$VERSION" > /dev/null 2>&1 -if [ $? -eq 0 ] -then - echo "[2/3] [DONE] Successfully deleted application informations" -else - echo "[2/3] [ERROR] Could not delete application informations" >&2 -fi - -#remove application source distribution -[ -e "/Library/${PRODUCT}/${VERSION}" ] && rm -rf "/Library/${PRODUCT}/${VERSION}" -if [ $? -eq 0 ] -then - echo "[3/3] [DONE] Successfully deleted application" -else - echo "[3/3] [ERROR] Could not delete application" >&2 -fi - -echo "Application uninstall process finished" -exit 0 diff --git a/build/pyinstaller/macOS/darwin/Resources/welcome.html b/build/pyinstaller/macOS/darwin/Resources/welcome.html deleted file mode 100644 index 393d21d1799..00000000000 --- a/build/pyinstaller/macOS/darwin/Resources/welcome.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - -
-
-

OpenBB is a leading open source investment research software platform for accessing and analyzing financial market data. We represent millions of investors who want to leverage state-of-the-art data science and machine learning technologies to make sense of raw unrefined data. Our mission is to make investment research effective, powerful and accessible to everyone.

-

This installation procedure will install the OpenBB Terminal.

-

-
- - diff --git a/build/pyinstaller/macOS/darwin/scripts/postinstall b/build/pyinstaller/macOS/darwin/scripts/postinstall deleted file mode 100644 index 8c3cbfc39d9..00000000000 --- a/build/pyinstaller/macOS/darwin/scripts/postinstall +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/bash - -exit 0 diff --git a/build/pyinstaller/macOS_package_assets/OpenBB Terminal/OpenBB Terminal b/build/pyinstaller/macOS_package_assets/OpenBB Terminal/OpenBB Terminal deleted file mode 100755 index 455e34ab2fb..00000000000 --- a/build/pyinstaller/macOS_package_assets/OpenBB Terminal/OpenBB Terminal +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash - -clear - -SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" - -echo " _ _ _ " -echo " | | | (_) " -echo " | | ___ __ _ __| |_ _ __ __ _ " -echo " | | / _ \ / _\` |/ _\` | | '_ \ / _\` | " -echo " | |___| (_) | (_| | (_| | | | | | (_| |_ _ _ " -echo " |______\___/ \__,_|\__,_|_|_| |_|\__, (_|_|_)" -echo " __/ | " -echo " |___/ " - -BOOTUP_MESSAGE=" -The boot up process might take a while. Please be patient... - -OpenBB Terminal v3.2.5 will be the last version of this Terminal. - -To continue our mission of democratizing investment research, we are working on a new open-source CLI tool built on top of the OpenBB Platform that will soon be available to everyone for free on my.openbb.co. - -Join us on social media to be among the first to hear the news. - -Discord: openbb.co/discord -Twitter: openbb.co/twitter -LinkedIn: openbb.co/linkedin -" -echo "$BOOTUP_MESSAGE" - -"$SCRIPTDIR"/.OpenBB/OpenBBTerminal diff --git a/build/pyinstaller/macOS_package_assets/README.TXT b/build/pyinstaller/macOS_package_assets/README.TXT deleted file mode 100644 index a4911975f0c..00000000000 --- a/build/pyinstaller/macOS_package_assets/README.TXT +++ /dev/null @@ -1 +0,0 @@ -MOVE THE OpenBB Terminal FOLDER TO THE APPLICATIONS FOLDER diff --git a/build/pyinstaller/setup_icons.applescript b/build/pyinstaller/setup_icons.applescript deleted file mode 100644 index 8bbce2b5471..00000000000 --- a/build/pyinstaller/setup_icons.applescript +++ /dev/null @@ -1,20 +0,0 @@ -use framework "Foundation" -use framework "AppKit" -use scripting additions - --- Get script location -tell application "Finder" - set current_path to POSIX path of (container of (path to me) as alias) -end tell - --- Set OpenBB Terminal folder icon relative to script location -set sourcePath to current_path & "../../images/openbb_folder_icon.icns" -set destPath to current_path & "macOS_package_assets/OpenBB Terminal" -set imageData to (current application's NSImage's alloc()'s initWithContentsOfFile:sourcePath) -(current application's NSWorkspace's sharedWorkspace()'s setIcon:imageData forFile:destPath options:2) - --- Set OpenBB Terminal launcher icon relative to script location -set sourcePath to current_path & "../../images/openbb.icns" -set destPath to current_path & "macOS_package_assets/OpenBB Terminal/OpenBB Terminal" -set imageData to (current application's NSImage's alloc()'s initWithContentsOfFile:sourcePath) -(current application's NSWorkspace's sharedWorkspace()'s setIcon:imageData forFile:destPath options:2) diff --git a/build/pyinstaller/setup_icons_post.applescript b/build/pyinstaller/setup_icons_post.applescript deleted file mode 100644 index 73587aca012..00000000000 --- a/build/pyinstaller/setup_icons_post.applescript +++ /dev/null @@ -1,20 +0,0 @@ -use framework "Foundation" -use framework "AppKit" -use scripting additions - --- Get script location -tell application "Finder" - set current_path to POSIX path of (container of (path to me) as alias) -end tell - --- Set OpenBB Terminal launcher icon in folder relative to script location -set sourcePath to current_path & "../../images/openbb.icns" -set destPath to current_path & "../../DMG/OpenBB Terminal/.OpenBB/OpenBBTerminal" -set imageData to (current application's NSImage's alloc()'s initWithContentsOfFile:sourcePath) -(current application's NSWorkspace's sharedWorkspace()'s setIcon:imageData forFile:destPath options:2) - --- Set OpenBB pywry icon relative to script location -set sourcePath to current_path & "../../images/openbb.icns" -set destPath to current_path & "../../DMG/OpenBB Terminal/.OpenBB/pywry" -set imageData to (current application's NSImage's alloc()'s initWithContentsOfFile:sourcePath) -(current application's NSWorkspace's sharedWorkspace()'s setIcon:imageData forFile:destPath options:2) diff --git a/build/pyinstaller/terminal.spec b/build/pyinstaller/terminal.spec deleted file mode 100644 index 35d0b300995..00000000000 --- a/build/pyinstaller/terminal.spec +++ /dev/null @@ -1,217 +0,0 @@ -# -*- mode: python ; coding: utf-8 -*- # noqa -import os -from shutil import which -import subprocess -import sys -from pathlib import Path -import matplotlib - -import scipy -from dotenv import set_key -from PyInstaller.building.api import COLLECT, EXE, PYZ -from PyInstaller.building.build_main import Analysis -from PyInstaller.building.splash import Splash -from PyInstaller.compat import is_darwin, is_win - -from openbb_terminal.loggers import get_commit_hash - -NAME = "OpenBBTerminal" - -build_type = ( - os.getenv("OPENBB_BUILD_TYPE") if bool(os.getenv("OPENBB_BUILD_TYPE")) else "folder" -) -repo_path = Path(os.getcwd()).resolve() - -# Local python environment packages folder -venv_path = Path(sys.executable).parent.parent.resolve() - -# Check if we are running in a conda environment -if is_darwin: - pathex = os.path.join(os.path.dirname(os.__file__), "site-packages") -elif "site-packages" in list(venv_path.iterdir()): - pathex = str(venv_path / "site-packages") -else: - pathex = str(venv_path / "lib" / "site-packages") - -pathex = Path(pathex).resolve() - -# Removing unused ARM64 binary -binary_to_remove = pathex / "_scs_direct.cpython-39-darwin.so" -print("Removing ARM64 Binary: _scs_direct.cpython-39-darwin.so") -binary_to_remove.unlink(missing_ok=True) -build_assets_folder = repo_path / "build/pyinstaller" - -# Removing inspect hook -destination = pathex / "pyinstaller/hooks/rthooks/pyi_rth_inspect.py" -print("Replacing Pyinstaller Hook: pyi_rth_inspect.py") -source = build_assets_folder / "hooks/pyi_rth_inspect.py" -subprocess.run(["cp", str(source), str(destination)], check=True) - - -# Get latest commit -commit_hash = get_commit_hash() -default_env_file = build_assets_folder / ".env" -set_key(default_env_file, "OPENBB_LOGGING_COMMIT_HASH", str(commit_hash)) - -# Files that are explicitly pulled into the bundle -added_files = [ - (str(repo_path / "openbb_terminal"), "openbb_terminal"), - (str(repo_path / "openbb_terminal/core/plots"), "openbb_terminal/core/plots"), - (str(pathex / "property_cached"), "property_cached"), - (str(pathex / "user_agent"), "user_agent"), - (str(pathex / "vaderSentiment"), "vaderSentiment"), - (str(pathex / "prophet"), "prophet"), - (str(pathex / "whisper"), "whisper"), - (str(pathex / "transformers"), "transformers"), - (str(pathex / "linearmodels/datasets"), "./linearmodels/datasets"), - (str(pathex / "statsmodels/datasets"), "./statsmodels/datasets"), - (str(pathex / "debugpy/_vendored"), "./debugpy/_vendored"), - (".env", "."), - (str(pathex / "blib2to3/Grammar.txt"), "blib2to3"), - (str(pathex / "blib2to3/PatternGrammar.txt"), "blib2to3"), - (str(pathex / "streamlit"), "streamlit"), - (str(pathex / "altair"), "altair"), - (str(pathex / "pyarrow"), "pyarrow"), - (which("pywry"), "."), -] - -if is_win: - added_files.extend( - [ - (os.path.join(f"{os.path.dirname(scipy.__file__)}.libs"), "scipy.libs/"), - (str(pathex / "frozendict/version.py"), "frozendict"), - ( - os.path.join(f"{os.path.dirname(matplotlib.__file__)}.libs"), - "matplotlib.libs/", - ), - ] - ) - - -# Python libraries that are explicitly pulled into the bundle -hidden_imports = [ - "sklearn.utils._cython_blas", - "sklearn.utils._typedefs", - "sklearn.utils._heap", - "sklearn.utils._sorting", - "sklearn.utils._vector_sentinel", - "sklearn.neighbors.quad_tree", - "sklearn.tree._utils", - "sklearn.neighbors._partition_nodes", - "sklearn.metrics._pairwise_distances_reduction._datasets_pair", - "sklearn.metrics._pairwise_distances_reduction._middle_term_computer", - "squarify", - "linearmodels", - "statsmodels", - "user_agent", - "vaderSentiment", - "feedparser", - "_sysconfigdata__darwin_darwin", - "prophet", - "debugpy", - "pywry", - "scipy.sparse.linalg._isolve._iterative", - "whisper", - "transformers", - "yt_dlp", - "textwrap3", - "streamlit", - "pytrends", - "pytrends.request", - "pyarrow", -] - - -if is_win: - hidden_imports.append("frozendict") - -analysis_kwargs = dict( - scripts=[str(repo_path / "terminal.py")], - pathex=[str(pathex), "."], - binaries=[], - datas=added_files, - hiddenimports=hidden_imports, - hookspath=["build/pyinstaller/hooks"], - hooksconfig={}, - runtime_hooks=["build/pyinstaller/hooks/hook-debugpy.py"], - excludes=[], - win_no_prefer_redirects=False, - win_private_assemblies=False, - cipher=None, - noarchive=False, -) - -a = Analysis(**analysis_kwargs) -pyz = PYZ(a.pure, a.zipped_data, cipher=analysis_kwargs["cipher"]) - -# Executable icon -if is_win: - exe_icon = (str(repo_path / "images/openbb_icon.ico"),) -if is_darwin: - exe_icon = (str(repo_path / "images/openbb.icns"),) - - -exe_args = [ - pyz, - a.scripts, - [], -] - -exe_kwargs = dict( - name=NAME, - debug=False, - bootloader_ignore_signals=False, - strip=False, - upx=False, - upx_exclude=[], - console=True, - disable_windowed_traceback=False, - target_arch="x86_64", - codesign_identity=None, - entitlements_file=None, - icon=exe_icon, - version="version.rc", -) - - -# Packaging settings -if build_type == "onefile": - exe_args += [a.binaries, a.zipfiles, a.datas] - exe_kwargs["runtime_tmpdir"] = None -elif build_type == "folder": - exe_kwargs["exclude_binaries"] = True - collect_args = [ - a.binaries, - a.zipfiles, - a.datas, - ] - collect_kwargs = dict( - strip=False, - upx=True, - upx_exclude=[], - name=NAME, - ) - - -# Platform specific settings -if is_win: - splash = Splash( - str(repo_path / "images/openbb_splashscreen.png"), - binaries=a.binaries, - datas=a.datas, - text_pos=(200, 400), - text_size=12, - text_color="white", - ) - exe_args += [splash, splash.binaries] - -if is_darwin: - exe_kwargs["argv_emulation"] = True - -exe = EXE(*exe_args, **exe_kwargs) - -if build_type == "folder": - coll = COLLECT( - *([exe] + collect_args), - **collect_kwargs, - ) diff --git a/build/pyinstaller/version.rc b/build/pyinstaller/version.rc deleted file mode 100644 index 8a232ed040d..00000000000 --- a/build/pyinstaller/version.rc +++ /dev/null @@ -1,42 +0,0 @@ -# UTF-8 -# -# For more details about fixed file info 'ffi' see: -# http://msdn.microsoft.com/en-us/library/ms646997.aspx -VSVersionInfo( - ffi=FixedFileInfo( - # filevers and prodvers should be always a tuple with four items: (1, 2, 3, 4) - # Set not needed items to zero 0. - filevers=(3, 2, 4, 0), - prodvers=(3, 2, 4, 0), - # Contains a bitmask that specifies the valid bits 'flags'r - mask=0x0, - # Contains a bitmask that specifies the Boolean attributes of the file. - flags=0x0, - # The operating system for which this file was designed. - # 0x4 - NT and there is no need to change it. - OS=0x4, - # The general type of file. - # 0x1 - the file is an application. - fileType=0x1, - # The function of the file. - # 0x0 - the function is not defined for this fileType - subtype=0x0, - # Creation date and time stamp. - date=(0, 0) - ), - kids=[ - StringFileInfo( - [ - StringTable( - '040904b0', - [StringStruct('Comments', 'The OpenBB Terminal. For additional details, visit OpenBB.co'), - StringStruct('CompanyName', 'OpenBB'), - StringStruct('FileDescription', 'OpenBB Terminal Program'), - StringStruct('FileVersion', '5.0'), - StringStruct('InternalName', 'OpenBB Terminal'), - StringStruct('ProductName', 'OpenBB Terminal'), - StringStruct('ProductVersion', '3.2.5.0')]) - ]), - VarFileInfo([VarStruct('Translation', [1033, 1200])]) - ] -) diff --git a/build/pypi/openbb_terminal/build.sh b/build/pypi/openbb_terminal/build.sh deleted file mode 100755 index b02d361e436..00000000000 --- a/build/pypi/openbb_terminal/build.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh - -# BUILD `openbb_terminal/.env` -OPENBB_LOGGING_COMMIT_HASH="sha:$(git rev-parse --short=8 HEAD)" -OPENBB_LOGGING_APP_NAME="gst_packaged_pypi" -echo "OPENBB_LOGGING_APP_NAME='${OPENBB_LOGGING_APP_NAME}'" > openbb_terminal/.env -echo "OPENBB_LOGGING_COMMIT_HASH=${OPENBB_LOGGING_COMMIT_HASH}" >> openbb_terminal/.env - -poetry publish --build \ No newline at end of file diff --git a/build/pypi/openbb_terminal/test_publish.sh b/build/pypi/openbb_terminal/test_publish.sh deleted file mode 100755 index ef5c2e1a348..00000000000 --- a/build/pypi/openbb_terminal/test_publish.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh - -# BUILD `openbb_terminal/.env` -OPENBB_LOGGING_COMMIT_HASH="sha:$(git rev-parse --short=8 HEAD)" -OPENBB_LOGGING_APP_NAME="gst_packaged_pypi" -echo "OPENBB_LOGGING_APP_NAME='${OPENBB_LOGGING_APP_NAME}'" > openbb_terminal/.env -echo "OPENBB_LOGGING_COMMIT_HASH=${OPENBB_LOGGING_COMMIT_HASH}" >> openbb_terminal/.env - -poetry publish -r testpypi --build \ No newline at end of file diff --git a/examples/usdLiquidityIndex.ipynb b/examples/usdLiquidityIndex.ipynb index 7681e0c9488..4f177babebb 100644 --- a/examples/usdLiquidityIndex.ipynb +++ b/examples/usdLiquidityIndex.ipynb @@ -20,12 +20,10 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ - "import json\n", - "\n", "from openbb import obb\n", "from pandas import DataFrame\n" ] @@ -42,7 +40,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "metadata": {}, "outputs": [ { @@ -50,15 +48,15 @@ "text/plain": [ "OBBject\n", "\n", - "id: 06580cab-5bdc-7e28-8000-632a5d8dc92f\n", - "results: [{'date': datetime.date(2002, 12, 18), 'WALCL': 719542.0, 'WLRRAL': 21905....\n", + "id: 0660e135-3511-73d7-8000-b792f7e418bb\n", + "results: [{'date': datetime.date(2002, 12, 18), 'provider': 'fred', 'WALCL': 719542...\n", "provider: fred\n", - "warnings: [{'category': 'UserWarning', 'message': '{\"WALCL\": {\"title\": \"Assets: Tot...\n", + "warnings: None\n", "chart: None\n", - "extra: {'metadata': {'arguments': {'provider_choices': {'provider': None}, 'standar..." + "extra: {'results_metadata': {'WALCL': {'title': 'Assets: Total Assets: Total Assets..." ] }, - "execution_count": 4, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -78,7 +76,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -110,7 +108,7 @@ } ], "source": [ - "metadata = json.loads(data.warnings[0].message)\n", + "metadata = data.extra[\"results_metadata\"]\n", "\n", "display(metadata.keys())\n", "display(metadata[\"WALCL\"].get(\"title\"))\n", @@ -573,7 +571,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -10197,7 +10195,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.4" + "version": "3.11.7" }, "orig_nbformat": 4 }, diff --git a/openbb_platform/assets/providers.json b/openbb_platform/assets/providers.json new file mode 100644 index 00000000000..c40e8cece34 --- /dev/null +++ b/openbb_platform/assets/providers.json @@ -0,0 +1,58 @@ +[ + { + "name": "Alpha Vantage", + "credentials": ["alpha_vantage_api_key"], + "v3_credentials": ["API_KEY_ALPHAVANTAGE"], + "link": "https://www.alphavantage.co/support/#api-key", + "instructions": "Go to: https://www.alphavantage.co/support/#api-key\n\n![AlphaVantage](https://user-images.githubusercontent.com/46355364/207820936-46c2ba00-81ff-4cd3-98a4-4fa44412996f.png)\n\nFill out the form, pass Captcha, and click on, \"GET FREE API KEY\"." + }, + { + "name": "BizToc", + "credentials": ["biztoc_api_key"], + "v3_credentials": ["API_BIZTOC_TOKEN"], + "link": "https://biztoc.com", + "instructions": "The BizToc API is hosted on RapidAPI. To set up, go to: https://rapidapi.com/thma/api/biztoc.\n\n![biztoc0](https://github.com/marban/OpenBBTerminal/assets/18151143/04cdd423-f65e-4ad8-ad5a-4a59b0f5ddda)\n\nIn the top right, select 'Sign Up'. After answering some questions, you will be prompted to select one of their plans.\n\n![biztoc1](https://github.com/marban/OpenBBTerminal/assets/18151143/9f3b72ea-ded7-48c5-aa33-bec5c0de8422)\n\nAfter signing up, navigate back to https://rapidapi.com/thma/api/biztoc. If you are logged in, you will see a header called X-RapidAPI-Key.\n\n![biztoc2](https://github.com/marban/OpenBBTerminal/assets/18151143/0f3b6c91-07e0-447a-90cd-a9e23522929f)" + }, + { + "name": "FRED", + "credentials": ["fred_api_key"], + "v3_credentials": ["API_FRED_KEY"], + "link": "https://fred.stlouisfed.org/docs/api/api_key.html", + "instructions": "Go to: https://fred.stlouisfed.org\n\n![FRED](https://user-images.githubusercontent.com/46355364/207827137-d143ba4c-72cb-467d-a7f4-5cc27c597aec.png)\n\nClick on, \"My Account\", create a new account or sign in with Google:\n\n![FRED](https://user-images.githubusercontent.com/46355364/207827011-65cdd501-27e3-436f-bd9d-b0d8381d46a7.png)\n\nAfter completing the sign-up, go to \"My Account\", and select \"API Keys\". Then, click on, \"Request API Key\".\n\n![FRED](https://user-images.githubusercontent.com/46355364/207827577-c869f989-4ef4-4949-ab57-6f3931f2ae9d.png)\n\nFill in the box for information about the use-case for FRED, and by clicking, \"Request API key\", at the bottom of the page, the API key will be issued.\n\n![FRED](https://user-images.githubusercontent.com/46355364/207828032-0a32d3b8-1378-4db2-9064-aa1eb2111632.png)" + }, + { + "name": "Financial Modeling Prep", + "credentials": ["fmp_api_key"], + "v3_credentials": ["API_KEY_FINANCIALMODELINGPREP"], + "link": "https://financialmodelingprep.com/developer", + "instructions": "Go to: https://site.financialmodelingprep.com/developer/docs\n\n![FinancialModelingPrep](https://user-images.githubusercontent.com/46355364/207821920-64553d05-d461-4984-b0fe-be0368c71186.png)\n\nClick on, \"Get my API KEY here\", and sign up for a free account.\n\n![FinancialModelingPrep](https://user-images.githubusercontent.com/46355364/207822184-a723092e-ef42-4f87-8c55-db150f09741b.png)\n\nWith an account created, sign in and navigate to the Dashboard, which shows the assigned token. by pressing the \"Dashboard\" button which will show the API key.\n\n![FinancialModelingPrep](https://user-images.githubusercontent.com/46355364/207823170-dd8191db-e125-44e5-b4f3-2df0e115c91d.png)" + }, + { + "name": "Intrinio", + "credentials": ["intrinio_api_key"], + "v3_credentials": ["API_INTRINIO_KEY"], + "link": "https://intrinio.com/", + "instructions": "Go to: https://intrinio.com/starter-plan\n\n![Intrinio](https://user-images.githubusercontent.com/85772166/219207556-fcfee614-59f1-46ae-bff4-c63dd2f6991d.png)\n\nAn API key will be issued with a subscription. Find the token value within the account dashboard." + }, + { + "name": "Polygon", + "credentials": ["polygon_api_key"], + "v3_credentials": ["API_POLYGON_KEY"], + "link": "https://polygon.io", + "instructions": "Go to: https://polygon.io\n\n![Polygon](https://user-images.githubusercontent.com/46355364/207825623-fcd7f0a3-131a-4294-808c-754c13e38e2a.png)\n\nClick on, \"Get your Free API Key\".\n\n![Polygon](https://user-images.githubusercontent.com/46355364/207825952-ca5540ec-6ed2-4cef-a0ed-bb50b813932c.png)\n\nAfter signing up, the API Key is found at the bottom of the account dashboard page.\n\n![Polygon](https://user-images.githubusercontent.com/46355364/207826258-b1f318fa-fd9c-41d9-bf5c-fe16722e6601.png)" + }, + { + "name": "Nasdaq", + "credentials": ["nasdaq_api_key"], + "v3_credentials": ["API_KEY_QUANDL"], + "link": "https://www.quandl.com/tools/api", + "instructions": "Go to: https://www.quandl.com\n\n![Quandl](https://user-images.githubusercontent.com/46355364/207823899-208a3952-f557-4b73-aee6-64ac00faedb7.png)\n\nClick on, \"Sign Up\", and register a new account.\n\n![Quandl](https://user-images.githubusercontent.com/46355364/207824214-4b6b2b74-e709-4ed4-adf2-14803e6f3568.png)\n\nFollow the sign-up instructions, and upon completion the API key will be assigned.\n\n![Quandl](https://user-images.githubusercontent.com/46355364/207824664-3c82befb-9c69-42df-8a82-510d85c19a97.png)" + }, + { + "name": "Tradier", + "credentials": ["tradier_api_key"], + "v3_credentials": ["API_TRADIER_TOKEN"], + "link": "https://tradier.com/products/market-data-api", + "instructions": "Go to: https://documentation.tradier.com\n\n![Tradier](https://user-images.githubusercontent.com/46355364/207829178-a8bba770-f2ea-4480-b28e-efd81cf30980.png)\n\nClick on, \"Open Account\", to start the sign-up process. After the account has been setup, navigate to [Tradier Broker Dash](https://dash.tradier.com/login?redirect=settings.api) and create the application. Request a sandbox access token." + } +] diff --git a/openbb_platform/core/integration/test_obbject.py b/openbb_platform/core/integration/test_obbject.py index 735dc520969..4a2d1ad339f 100644 --- a/openbb_platform/core/integration/test_obbject.py +++ b/openbb_platform/core/integration/test_obbject.py @@ -1,3 +1,5 @@ +"""Test the OBBject.""" + import contextlib import sys diff --git a/openbb_platform/core/openbb_core/__init__.py b/openbb_platform/core/openbb_core/__init__.py index e69de29bb2d..13627db21b0 100644 --- a/openbb_platform/core/openbb_core/__init__.py +++ b/openbb_platform/core/openbb_core/__init__.py @@ -0,0 +1 @@ +"""OpenBB Core.""" diff --git a/openbb_platform/core/openbb_core/api/app_loader.py b/openbb_platform/core/openbb_core/api/app_loader.py index 9c8330af10b..d6ff19878ca 100644 --- a/openbb_platform/core/openbb_core/api/app_loader.py +++ b/openbb_platform/core/openbb_core/api/app_loader.py @@ -1,11 +1,29 @@ +"""App loader module.""" + from typing import List, Optional from fastapi import APIRouter, FastAPI +from openbb_core.app.router import RouterLoader class AppLoader: """App loader.""" + @staticmethod + def get_openapi_tags() -> List[dict]: + """Get openapi tags.""" + main_router = RouterLoader.from_extensions() + openapi_tags = [] + # Add tag data for each router in the main router + for r in main_router.routers: + openapi_tags.append( + { + "name": r, + "description": main_router.get_attr(r, "description"), + } + ) + return openapi_tags + @staticmethod def from_routers( app: FastAPI, routers: List[Optional[APIRouter]], prefix: str diff --git a/openbb_platform/core/openbb_core/api/auth/user.py b/openbb_platform/core/openbb_core/api/auth/user.py index dab13cca5a9..c61aa5303cf 100644 --- a/openbb_platform/core/openbb_core/api/auth/user.py +++ b/openbb_platform/core/openbb_core/api/auth/user.py @@ -1,3 +1,5 @@ +"""User authentication.""" + import secrets from typing import Optional @@ -15,7 +17,6 @@ async def authenticate_user( credentials: Annotated[Optional[HTTPBasicCredentials], Depends(security)] ): """Authenticate the user.""" - if credentials: username = Env().API_USERNAME password = Env().API_PASSWORD diff --git a/openbb_platform/core/openbb_core/api/dependency/__init__.py b/openbb_platform/core/openbb_core/api/dependency/__init__.py index e69de29bb2d..4abe38b227a 100644 --- a/openbb_platform/core/openbb_core/api/dependency/__init__.py +++ b/openbb_platform/core/openbb_core/api/dependency/__init__.py @@ -0,0 +1 @@ +"""OpenBB Core API Dependency.""" diff --git a/openbb_platform/core/openbb_core/api/rest_api.py b/openbb_platform/core/openbb_core/api/rest_api.py index f166a91be4e..0ad92f613b6 100644 --- a/openbb_platform/core/openbb_core/api/rest_api.py +++ b/openbb_platform/core/openbb_core/api/rest_api.py @@ -67,13 +67,13 @@ app = FastAPI( ], lifespan=lifespan, ) - app.add_middleware( CORSMiddleware, allow_origins=system.api_settings.cors.allow_origins, allow_methods=system.api_settings.cors.allow_methods, allow_headers=system.api_settings.cors.allow_headers, ) +app.openapi_tags = AppLoader.get_openapi_tags() AppLoader.from_routers( app=app, routers=( diff --git a/openbb_platform/core/openbb_core/api/router/__init__.py b/openbb_platform/core/openbb_core/api/router/__init__.py index e69de29bb2d..93fabc683c4 100644 --- a/openbb_platform/core/openbb_core/api/router/__init__.py +++ b/openbb_platform/core/openbb_core/api/router/__init__.py @@ -0,0 +1 @@ +"""OpenBB Core API Router.""" diff --git a/openbb_platform/core/openbb_core/api/router/commands.py b/openbb_platform/core/openbb_core/api/router/commands.py index d524156ddbd..ce1cab484a8 100644 --- a/openbb_platform/core/openbb_core/api/router/commands.py +++ b/openbb_platform/core/openbb_core/api/router/commands.py @@ -132,8 +132,8 @@ def validate_output(c_out: OBBject) -> OBBject: Returns ------- - OBBject - Validated OBBject object. + Dict + Serialized OBBject. """ def is_model(type_): @@ -188,7 +188,7 @@ def build_api_wrapper( func.__annotations__ = new_annotations_map @wraps(wrapped=func) - async def wrapper(*args: Tuple[Any], **kwargs: Dict[str, Any]): + async def wrapper(*args: Tuple[Any], **kwargs: Dict[str, Any]) -> OBBject: user_settings: UserSettings = UserSettings.model_validate( kwargs.pop( "__authenticated_user_settings", @@ -198,8 +198,7 @@ def build_api_wrapper( execute = partial(command_runner.run, path, user_settings) output: OBBject = await execute(*args, **kwargs) - output = validate_output(output) - return output + return validate_output(output) return wrapper diff --git a/openbb_platform/core/openbb_core/app/__init__.py b/openbb_platform/core/openbb_core/app/__init__.py index e69de29bb2d..6b3de9cda26 100644 --- a/openbb_platform/core/openbb_core/app/__init__.py +++ b/openbb_platform/core/openbb_core/app/__init__.py @@ -0,0 +1 @@ +"""OpenBB Core App Module.""" diff --git a/openbb_platform/core/openbb_core/app/command_runner.py b/openbb_platform/core/openbb_core/app/command_runner.py index 3a43aba3e8a..4d9985a2172 100644 --- a/openbb_platform/core/openbb_core/app/command_runner.py +++ b/openbb_platform/core/openbb_core/app/command_runner.py @@ -1,5 +1,7 @@ """Command runner module.""" +# pylint: disable=R0903 + from copy import deepcopy from dataclasses import asdict, is_dataclass from datetime import datetime @@ -37,6 +39,7 @@ class ExecutionContext: system_settings: SystemSettings, user_settings: UserSettings, ) -> None: + """Initialize the execution context.""" self.command_map = command_map self.route = route self.system_settings = system_settings @@ -192,6 +195,8 @@ class ParametersBuilder: ): valid = asdict(annotation()) # type: ignore for p in extra_params: + if "chart_params" in p: + continue if p not in valid: warn( message=f"Parameter '{p}' not found.", @@ -224,7 +229,7 @@ class ParametersBuilder: } # We allow extra fields to return with model with 'cc: CommandContext' config = ConfigDict(extra="allow", arbitrary_types_allowed=True) - ValidationModel = create_model(func.__name__, __config__=config, **fields) # type: ignore + ValidationModel = create_model(func.__name__, __config__=config, **fields) # type: ignore # pylint: disable=C0103 # Validate and coerce model = ValidationModel(**kwargs) ParametersBuilder._warn_kwargs( @@ -233,6 +238,7 @@ class ParametersBuilder: ) return dict(model) + # pylint: disable=R0913 @classmethod def build( cls, @@ -273,6 +279,7 @@ class ParametersBuilder: return kwargs +# pylint: disable=too-few-public-methods class StaticCommandRunner: """Static Command Runner.""" @@ -281,6 +288,7 @@ class StaticCommandRunner: cls, func: Callable, kwargs: Dict[str, Any], + show_warnings: bool = True, # pylint: disable=unused-argument # type: ignore ) -> OBBject: """Run a command and return the output.""" obbject = await maybe_coroutine(func, **kwargs) @@ -300,8 +308,29 @@ class StaticCommandRunner: raise OpenBBError( "Charting is not installed. Please install `openbb-charting`." ) - obbject.charting.show(render=False, **kwargs) # type: ignore + chart_params = {} + extra_params = kwargs.get("extra_params", {}) + if hasattr(extra_params, "__dict__") and hasattr(extra_params, "chart_params"): + chart_params = kwargs["extra_params"].__dict__.get("chart_params", {}) + elif isinstance(extra_params, dict) and "chart_params" in extra_params: + chart_params = kwargs["extra_params"].get("chart_params", {}) + + if "chart_params" in kwargs and kwargs["chart_params"] is not None: + chart_params.update(kwargs.pop("chart_params", {})) + + if ( + "kwargs" in kwargs + and "chart_params" in kwargs["kwargs"] + and kwargs["kwargs"].get("chart_params") is not None + ): + chart_params.update(kwargs.pop("kwargs", {}).get("chart_params", {})) + + if chart_params: + kwargs.update(chart_params) + obbject.charting.show(render=False, **kwargs) + + # pylint: disable=R0913, R0914 @classmethod async def _execute_func( cls, @@ -348,7 +377,6 @@ class StaticCommandRunner: # pylint: disable=protected-access obbject._route = route obbject._standard_params = kwargs.get("standard_params", None) - if chart and obbject.results: cls._chart(obbject, **kwargs) @@ -381,6 +409,7 @@ class StaticCommandRunner: ) return obbject + # pylint: disable=W0718 @classmethod async def run( cls, diff --git a/openbb_platform/core/openbb_core/app/deprecation.py b/openbb_platform/core/openbb_core/app/deprecation.py index 5dd38c1ae54..a771589913a 100644 --- a/openbb_platform/core/openbb_core/app/deprecation.py +++ b/openbb_platform/core/openbb_core/app/deprecation.py @@ -50,6 +50,7 @@ class OpenBBDeprecationWarning(DeprecationWarning): since: Optional[Tuple[int, int]] = None, expected_removal: Optional[Tuple[int, int]] = None, ) -> None: + """Initialize the warning.""" super().__init__(message, *args) self.message = message.rstrip(".") self.since = since or get_major_minor(VERSION) diff --git a/openbb_platform/core/openbb_core/app/logs/formatters/formatter_with_exceptions.py b/openbb_platform/core/openbb_core/app/logs/formatters/formatter_with_exceptions.py index 17ccd72ff64..f3f8c8f9066 100644 --- a/openbb_platform/core/openbb_core/app/logs/formatters/formatter_with_exceptions.py +++ b/openbb_platform/core/openbb_core/app/logs/formatters/formatter_with_exceptions.py @@ -1,16 +1,15 @@ -# IMPORTATION STANDARD +"""Logging Formatter that includes formatting of Exceptions.""" + import logging import re from copy import deepcopy from pathlib import Path -# IMPORTATION THIRDPARTY -# IMPORTATION INTERNAL from openbb_core.app.logs.models.logging_settings import LoggingSettings class FormatterWithExceptions(logging.Formatter): - """Logging Formatter that includes formatting of Exceptions""" + """Logging Formatter that includes formatting of Exceptions.""" DATEFORMAT = "%Y-%m-%dT%H:%M:%S%z" LOGFORMAT = "%(asctime)s|%(name)s|%(funcName)s|%(lineno)s|%(message)s" @@ -20,6 +19,7 @@ class FormatterWithExceptions(logging.Formatter): @staticmethod def calculate_level_name(record: logging.LogRecord) -> str: + """Calculate the level name of the log record.""" if record.exc_text: level_name = "X" elif record.levelname: @@ -31,6 +31,7 @@ class FormatterWithExceptions(logging.Formatter): @staticmethod def extract_log_extra(record: logging.LogRecord): + """Extract extra log information from the record.""" log_extra = dict() if hasattr(record, "func_name_override"): @@ -44,6 +45,7 @@ class FormatterWithExceptions(logging.Formatter): @staticmethod def mock_ipv4(text: str) -> str: + """Mock IPv4 addresses in the text.""" pattern = r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" replacement = " FILTERED_IP " text_mocked = re.sub(pattern, replacement, text) @@ -52,6 +54,7 @@ class FormatterWithExceptions(logging.Formatter): @staticmethod def mock_email(text: str) -> str: + """Mock email addresses in the text.""" 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) @@ -60,6 +63,7 @@ class FormatterWithExceptions(logging.Formatter): @staticmethod def mock_password(text: str) -> str: + """Mock passwords in the text.""" pattern = r'("password": ")[^"]+' replacement = r"\1 FILTERED_PASSWORD " text_mocked = re.sub(pattern, replacement, text) @@ -67,6 +71,7 @@ class FormatterWithExceptions(logging.Formatter): @staticmethod def mock_flair(text: str) -> str: + """Mock flair in the text.""" pattern = r'("FLAIR": "\[)(.*?)\]' replacement = r"\1 FILTERED_FLAIR ]" text_mocked = re.sub(pattern, replacement, text) @@ -75,6 +80,7 @@ class FormatterWithExceptions(logging.Formatter): @staticmethod def mock_home_directory(text: str) -> str: + """Mock home directory in the text.""" user_home_directory = str(Path.home().as_posix()) text_mocked = text.replace("\\", "/").replace( user_home_directory, "MOCKING_USER_PATH" @@ -84,6 +90,7 @@ class FormatterWithExceptions(logging.Formatter): @staticmethod def filter_special_tags(text: str) -> str: + """Filter special tags in the text.""" text_filtered = text.replace("\n", " MOCKING_BREAKLINE ") text_filtered = text_filtered.replace("'Traceback", "Traceback") @@ -91,6 +98,7 @@ class FormatterWithExceptions(logging.Formatter): @classmethod def filter_piis(cls, text: str) -> str: + """Filter Personally Identifiable Information in the text.""" text_filtered = cls.mock_ipv4(text=text) text_filtered = cls.mock_email(text=text_filtered) text_filtered = cls.mock_password(text=text_filtered) @@ -101,6 +109,7 @@ class FormatterWithExceptions(logging.Formatter): @classmethod def filter_log_line(cls, text: str): + """Filter log line.""" text_filtered = cls.filter_special_tags(text=text) text_filtered = cls.filter_piis(text=text_filtered) @@ -113,6 +122,7 @@ class FormatterWithExceptions(logging.Formatter): style="%", validate=True, ) -> None: + """Initialize the FormatterWithExceptions.""" super().__init__( fmt=self.LOGFORMAT, datefmt=self.DATEFORMAT, @@ -123,15 +133,18 @@ class FormatterWithExceptions(logging.Formatter): @property def settings(self) -> LoggingSettings: + """Get the settings.""" return deepcopy(self.__settings) @settings.setter def settings(self, settings: LoggingSettings) -> None: + """Set the settings.""" self.__settings = settings # OVERRIDE def formatException(self, ei) -> str: - """Exception formatting handler + """Define the Exception formatting handler. + Parameters ---------- ei : logging._SysExcInfoType @@ -141,13 +154,13 @@ class FormatterWithExceptions(logging.Formatter): str Formatted exception """ - result = super().formatException(ei) return repr(result) # OVERRIDE def format(self, record: logging.LogRecord) -> str: - """Log formatter + """Define the Log formatter. + Parameters ---------- record : logging.LogRecord @@ -157,7 +170,6 @@ class FormatterWithExceptions(logging.Formatter): str Formatted_log message """ - level_name = self.calculate_level_name(record=record) log_prefix_content = { "appName": self.settings.app_name, diff --git a/openbb_platform/core/openbb_core/app/logs/handlers/path_tracking_file_handler.py b/openbb_platform/core/openbb_core/app/logs/handlers/path_tracking_file_handler.py index d8b65afaa22..acf8a50d5cc 100644 --- a/openbb_platform/core/openbb_core/app/logs/handlers/path_tracking_file_handler.py +++ b/openbb_platform/core/openbb_core/app/logs/handlers/path_tracking_file_handler.py @@ -1,3 +1,5 @@ +"""Path Tracking File Handler.""" + # IMPORTATION STANDARD from copy import deepcopy from logging.handlers import TimedRotatingFileHandler @@ -17,8 +19,11 @@ TMP_FOLDER_NAME = "tmp" class PathTrackingFileHandler(TimedRotatingFileHandler): + """Path Tracking File Handler.""" + @staticmethod def build_log_file_path(settings: LoggingSettings) -> Path: + """Build the log file path.""" app_name = settings.app_name directory = settings.user_logs_directory session_id = settings.session_id @@ -27,8 +32,7 @@ class PathTrackingFileHandler(TimedRotatingFileHandler): return path def clean_expired_files(self, before_timestamp: float): - """Remove expired files from logs directory""" - + """Remove expired files from logs directory.""" logs_dir = self.settings.user_logs_directory archives_directory = logs_dir / ARCHIVES_FOLDER_NAME tmp_directory = logs_dir / TMP_FOLDER_NAME @@ -51,10 +55,12 @@ class PathTrackingFileHandler(TimedRotatingFileHandler): @property def settings(self) -> LoggingSettings: + """Get the settings.""" return deepcopy(self.__settings) @settings.setter def settings(self, settings: LoggingSettings) -> None: + """Set the settings.""" self.__settings = settings # OVERRIDE @@ -64,6 +70,7 @@ class PathTrackingFileHandler(TimedRotatingFileHandler): *args, **kwargs, ) -> None: + """Initialize the PathTrackingFileHandler.""" # SETUP PARENT CLASS filename = str(self.build_log_file_path(settings=settings)) frequency = settings.frequency diff --git a/openbb_platform/core/openbb_core/app/logs/handlers_manager.py b/openbb_platform/core/openbb_core/app/logs/handlers_manager.py index 3f2229b13c0..2d9a0efb927 100644 --- a/openbb_platform/core/openbb_core/app/logs/handlers_manager.py +++ b/openbb_platform/core/openbb_core/app/logs/handlers_manager.py @@ -1,9 +1,8 @@ -# IMPORT STANDARD +"""Handlers Manager.""" + import logging import sys -# IMPORT THIRD-PARTY -# IMPORT INTERNAL from openbb_core.app.logs.formatters.formatter_with_exceptions import ( FormatterWithExceptions, ) @@ -15,7 +14,10 @@ from openbb_core.app.logs.models.logging_settings import LoggingSettings class HandlersManager: + """Handlers Manager.""" + def __init__(self, settings: LoggingSettings): + """Initialize the HandlersManager.""" self._handlers = settings.handler_list self._settings = settings @@ -34,36 +36,42 @@ class HandlersManager: logging.getLogger().debug("Unknown log handler.") def _add_posthog_handler(self): + """Add a Posthog handler.""" handler = PosthogHandler(settings=self._settings) formatter = FormatterWithExceptions(settings=self._settings) handler.setFormatter(formatter) logging.getLogger().addHandler(handler) def _add_stdout_handler(self): + """Add a stdout handler.""" handler = logging.StreamHandler(sys.stdout) formatter = FormatterWithExceptions(settings=self._settings) handler.setFormatter(formatter) logging.getLogger().addHandler(handler) def _add_stderr_handler(self): + """Add a stderr handler.""" handler = logging.StreamHandler(sys.stderr) formatter = FormatterWithExceptions(settings=self._settings) handler.setFormatter(formatter) logging.getLogger().addHandler(handler) def _add_noop_handler(self): + """Add a null handler.""" handler = logging.NullHandler() formatter = FormatterWithExceptions(settings=self._settings) handler.setFormatter(formatter) logging.getLogger().addHandler(handler) def _add_file_handler(self): + """Add a file handler.""" handler = PathTrackingFileHandler(settings=self._settings) formatter = FormatterWithExceptions(settings=self._settings) handler.setFormatter(formatter) logging.getLogger().addHandler(handler) def update_handlers(self, settings: LoggingSettings): + """Update the handlers with new settings.""" logger = logging.getLogger() for hdlr in logger.handlers: if isinstance(hdlr, (PathTrackingFileHandler, PosthogHandler)): diff --git a/openbb_platform/core/openbb_core/app/logs/logging_service.py b/openbb_platform/core/openbb_core/app/logs/logging_service.py index 28067def685..abc605ca7d8 100644 --- a/openbb_platform/core/openbb_core/app/logs/logging_service.py +++ b/openbb_platform/core/openbb_core/app/logs/logging_service.py @@ -19,8 +19,7 @@ from pydantic_core import to_jsonable_python class LoggingService(metaclass=SingletonMeta): - """ - Logging Manager class responsible for managing logging settings and handling logs. + """Logging Manager class responsible for managing logging settings and handling logs. Attributes ---------- @@ -59,8 +58,7 @@ class LoggingService(metaclass=SingletonMeta): system_settings: SystemSettings, user_settings: UserSettings, ) -> None: - """ - Logging Service Constructor. + """Define the Logging Service Constructor. Sets up the logging settings and handlers and then logs the startup information. @@ -82,8 +80,7 @@ class LoggingService(metaclass=SingletonMeta): @property def logging_settings(self) -> LoggingSettings: - """ - Current logging settings. + """Define the Current logging settings. Returns ------- @@ -94,8 +91,7 @@ class LoggingService(metaclass=SingletonMeta): @logging_settings.setter def logging_settings(self, value: Tuple[SystemSettings, UserSettings]): - """ - Setter for updating the logging settings. + """Define the Setter for updating the logging settings. Parameters ---------- @@ -109,8 +105,7 @@ class LoggingService(metaclass=SingletonMeta): ) def _setup_handlers(self) -> HandlersManager: - """ - Setup Logging Handlers. + """Set up Logging Handlers. Returns ------- diff --git a/openbb_platform/core/openbb_core/app/logs/models/logging_settings.py b/openbb_platform/core/openbb_core/app/logs/models/logging_settings.py index 1cf14d5240f..708246f9e9a 100644 --- a/openbb_platform/core/openbb_core/app/logs/models/logging_settings.py +++ b/openbb_platform/core/openbb_core/app/logs/models/logging_settings.py @@ -1,3 +1,5 @@ +"""Logging settings.""" + from pathlib import Path from typing import List, Optional @@ -8,11 +10,14 @@ from openbb_core.app.model.user_settings import UserSettings # pylint: disable=too-many-instance-attributes class LoggingSettings: + """Logging settings.""" + def __init__( self, user_settings: Optional[UserSettings] = None, system_settings: Optional[SystemSettings] = None, ): + """Initialize the logging settings.""" user_settings = user_settings or UserSettings() system_settings = system_settings or SystemSettings() diff --git a/openbb_platform/core/openbb_core/app/logs/utils/expired_files.py b/openbb_platform/core/openbb_core/app/logs/utils/expired_files.py index 4f101d23db8..feb933c9a69 100644 --- a/openbb_platform/core/openbb_core/app/logs/utils/expired_files.py +++ b/openbb_platform/core/openbb_core/app/logs/utils/expired_files.py @@ -1,20 +1,19 @@ -# IMPORTATION STANDARD +"""Expired files management utilities.""" + import contextlib from datetime import datetime from pathlib import Path from typing import List -# IMPORTATION THIRDPARTY - -# IMPORTATION INTERNAL - def get_timestamp_from_x_days(x: int) -> float: + """Get the timestamp from x days ago.""" timestamp_from_x_days = datetime.now().timestamp() - x * 86400 return timestamp_from_x_days def get_expired_file_list(directory: Path, before_timestamp: float) -> List[Path]: + """Get the list of expired files from a directory.""" expired_files = [] if directory.is_dir(): # Check if the directory exists and is a directory for file in directory.iterdir(): @@ -25,6 +24,7 @@ def get_expired_file_list(directory: Path, before_timestamp: float) -> List[Path def remove_file_list(file_list: List[Path]): + """Remove a list of files.""" for file in file_list: with contextlib.suppress(PermissionError): file.unlink(missing_ok=True) diff --git a/openbb_platform/core/openbb_core/app/logs/utils/utils.py b/openbb_platform/core/openbb_core/app/logs/utils/utils.py index a94efd331cb..e150627b147 100644 --- a/openbb_platform/core/openbb_core/app/logs/utils/utils.py +++ b/openbb_platform/core/openbb_core/app/logs/utils/utils.py @@ -1,12 +1,10 @@ -# IMPORT STANDARD +"""Utility functions for logging.""" + import time import uuid import warnings from pathlib import Path, PosixPath -# IMPORT THIRD-PARTY -# IMPORT INTERNAL - def get_session_id() -> str: """UUID of the current session.""" @@ -41,6 +39,7 @@ def get_log_dir(contextual_user_data_directory: str) -> PosixPath: def create_log_dir_if_not_exists(contextual_user_data_directory: str) -> Path: + """Create a log directory for the current installation.""" log_dir = Path(contextual_user_data_directory).joinpath("logs").absolute() if not log_dir.is_dir(): log_dir.mkdir(parents=True, exist_ok=True) @@ -49,6 +48,7 @@ def create_log_dir_if_not_exists(contextual_user_data_directory: str) -> Path: def create_log_uuid_if_not_exists(log_dir: Path) -> str: + """Create a log id file for the current logging session.""" log_id = get_log_id(log_dir) if not log_id.is_file(): logging_id = f"{uuid.uuid4()}" @@ -60,10 +60,12 @@ def create_log_uuid_if_not_exists(log_dir: Path) -> str: def get_log_id(log_dir): + """Get the log id file.""" return (log_dir / ".logid").absolute() def create_uuid_dir_if_not_exists(log_dir, logging_id) -> PosixPath: + """Create a directory for the current logging session.""" uuid_log_dir = (log_dir / logging_id).absolute() if not uuid_log_dir.is_dir(): diff --git a/openbb_platform/core/openbb_core/app/model/__init__.py b/openbb_platform/core/openbb_core/app/model/__init__.py index e69de29bb2d..44adb9707fe 100644 --- a/openbb_platform/core/openbb_core/app/model/__init__.py +++ b/openbb_platform/core/openbb_core/app/model/__init__.py @@ -0,0 +1 @@ +"""OpenBB Core App Model.""" diff --git a/openbb_platform/core/openbb_core/app/model/abstract/__init__.py b/openbb_platform/core/openbb_core/app/model/abstract/__init__.py index e69de29bb2d..65daa6e5650 100644 --- a/openbb_platform/core/openbb_core/app/model/abstract/__init__.py +++ b/openbb_platform/core/openbb_core/app/model/abstract/__init__.py @@ -0,0 +1 @@ +"""OpenBB Core App Abstract Model.""" diff --git a/openbb_platform/core/openbb_core/app/model/abstract/error.py b/openbb_platform/core/openbb_core/app/model/abstract/error.py index 95cc53b434e..91c67d9aa24 100644 --- a/openbb_platform/core/openbb_core/app/model/abstract/error.py +++ b/openbb_platform/core/openbb_core/app/model/abstract/error.py @@ -1,3 +1,5 @@ +"""OpenBB Error.""" + from typing import Optional, Union @@ -5,5 +7,6 @@ class OpenBBError(Exception): """OpenBB Error.""" def __init__(self, original: Optional[Union[str, Exception]] = None): + """Initialize the OpenBBError.""" self.original = original super().__init__(str(original)) diff --git a/openbb_platform/core/openbb_core/app/model/abstract/results.py b/openbb_platform/core/openbb_core/app/model/abstract/results.py index 5152f0fad58..a9456b99189 100644 --- a/openbb_platform/core/openbb_core/app/model/abstract/results.py +++ b/openbb_platform/core/openbb_core/app/model/abstract/results.py @@ -1,3 +1,5 @@ +"""OpenBB Core App Model Abstract Results.""" + from pydantic import BaseModel Results = BaseModel diff --git a/openbb_platform/core/openbb_core/app/model/abstract/singleton.py b/openbb_platform/core/openbb_core/app/model/abstract/singleton.py index 3575186ee22..0ecccafc446 100644 --- a/openbb_platform/core/openbb_core/app/model/abstract/singleton.py +++ b/openbb_platform/core/openbb_core/app/model/abstract/singleton.py @@ -1,13 +1,18 @@ +"""Singleton metaclass implementation.""" + from typing import Dict, Generic, TypeVar T = TypeVar("T") class SingletonMeta(type, Generic[T]): + """Singleton metaclass.""" + # TODO : check if we want to update this to be thread safe _instances: Dict[T, T] = {} def __call__(cls: "SingletonMeta", *args, **kwargs): + """Singleton pattern implementation.""" if cls not in cls._instances: instance = super().__call__(*args, **kwargs) cls._instances[cls] = instance diff --git a/openbb_platform/core/openbb_core/app/model/abstract/tagged.py b/openbb_platform/core/openbb_core/app/model/abstract/tagged.py index 134a2605567..80cfe1678e0 100644 --- a/openbb_platform/core/openbb_core/app/model/abstract/tagged.py +++ b/openbb_platform/core/openbb_core/app/model/abstract/tagged.py @@ -1,6 +1,10 @@ +"""OpenBB Core App Abstract Model Tagged.""" + from pydantic import BaseModel, Field from uuid_extensions import uuid7str # type: ignore class Tagged(BaseModel): + """Model for Tagged.""" + id: str = Field(default_factory=uuid7str, alias="_id") diff --git a/openbb_platform/core/openbb_core/app/model/abstract/warning.py b/openbb_platform/core/openbb_core/app/model/abstract/warning.py index 2e2f778c397..7914b6af7f7 100644 --- a/openbb_platform/core/openbb_core/app/model/abstract/warning.py +++ b/openbb_platform/core/openbb_core/app/model/abstract/warning.py @@ -1,14 +1,19 @@ +"""Module for warnings.""" + from warnings import WarningMessage from pydantic import BaseModel class Warning_(BaseModel): + """Model for Warning.""" + category: str message: str def cast_warning(w: WarningMessage) -> Warning_: + """Cast a warning to a pydantic model.""" return Warning_( category=w.category.__name__, message=str(w.message), @@ -16,4 +21,4 @@ def cast_warning(w: WarningMessage) -> Warning_: class OpenBBWarning(Warning): - pass + """Base class for OpenBB warnings.""" diff --git a/openbb_platform/core/openbb_core/app/model/fast_api_settings.py b/openbb_platform/core/openbb_core/app/model/api_settings.py similarity index 98% rename from openbb_platform/core/openbb_core/app/model/fast_api_settings.py rename to openbb_platform/core/openbb_core/app/model/api_settings.py index 24ad76a3916..1eccb73eaef 100644 --- a/openbb_platform/core/openbb_core/app/model/fast_api_settings.py +++ b/openbb_platform/core/openbb_core/app/model/api_settings.py @@ -24,7 +24,7 @@ class Servers(BaseModel): description: str = "Local OpenBB development server" -class FastAPISettings(BaseModel): +class APISettings(BaseModel): """Settings model for FastAPI configuration.""" model_config = ConfigDict(frozen=True) diff --git a/openbb_platform/core/openbb_core/app/model/charts/chart.py b/openbb_platform/core/openbb_core/app/model/charts/chart.py index a825be1e9fe..38d062d7966 100644 --- a/openbb_platform/core/openbb_core/app/model/charts/chart.py +++ b/openbb_platform/core/openbb_core/app/model/charts/chart.py @@ -1,3 +1,5 @@ +"""OpenBB Core Chart model.""" + from enum import Enum from typing import Any, Dict, Optional @@ -5,10 +7,14 @@ from pydantic import BaseModel, ConfigDict, Field class ChartFormat(str, Enum): + """Chart format.""" + plotly = "plotly" class Chart(BaseModel): + """Model for Chart.""" + content: Optional[Dict[str, Any]] = Field( default=None, description="Raw textual representation of the chart.", @@ -25,6 +31,7 @@ class Chart(BaseModel): model_config = ConfigDict(validate_assignment=True) def __repr__(self) -> str: + """Return string representation.""" return f"{self.__class__.__name__}\n\n" + "\n".join( f"{k}: {v}" for k, v in self.model_dump().items() ) diff --git a/openbb_platform/core/openbb_core/app/model/command_context.py b/openbb_platform/core/openbb_core/app/model/command_context.py index 052fb5bc780..977df7a485b 100644 --- a/openbb_platform/core/openbb_core/app/model/command_context.py +++ b/openbb_platform/core/openbb_core/app/model/command_context.py @@ -1,3 +1,5 @@ +"""Command Context.""" + from pydantic import BaseModel, Field from openbb_core.app.model.system_settings import SystemSettings @@ -5,5 +7,7 @@ from openbb_core.app.model.user_settings import UserSettings class CommandContext(BaseModel): + """Command Context.""" + user_settings: UserSettings = Field(default_factory=UserSettings) system_settings: SystemSettings = Field(default_factory=SystemSettings) diff --git a/openbb_platform/core/openbb_core/app/model/credentials.py b/openbb_platform/core/openbb_core/app/model/credentials.py index 30cae535ef7..5ed7684e351 100644 --- a/openbb_platform/core/openbb_core/app/model/credentials.py +++ b/openbb_platform/core/openbb_core/app/model/credentials.py @@ -100,7 +100,7 @@ class Credentials(_Credentials): # type: ignore """Credentials model used to store provider credentials.""" def __repr__(self) -> str: - """String representation of the credentials.""" + """Define the string representation of the credentials.""" return ( self.__class__.__name__ + "\n\n" diff --git a/openbb_platform/core/openbb_core/app/model/custom_parameter.py b/openbb_platform/core/openbb_core/app/model/custom_parameter.py deleted file mode 100644 index 06b947e0c55..00000000000 --- a/openbb_platform/core/openbb_core/app/model/custom_parameter.py +++ /dev/null @@ -1,35 +0,0 @@ -import sys -from dataclasses import dataclass -from typing import Dict, Optional - -from typing_extensions import LiteralString - -# `slots` is available on Python >= 3.10 -if sys.version_info >= (3, 10): - slots_true = {"slots": True} -else: - slots_true: Dict[str, bool] = {} - - -class BaseMetadata: - """Base class for all metadata. - - This exists mainly so that implementers - can do `isinstance(..., BaseMetadata)` while traversing field annotations. - """ - - __slots__ = () - - -@dataclass(frozen=True, **slots_true) -class OpenBBCustomParameter(BaseMetadata): - """Custom parameter for OpenBB.""" - - description: Optional[str] = None - - -@dataclass(frozen=True, **slots_true) -class OpenBBCustomChoices(BaseMetadata): - """Custom choices for OpenBB.""" - - choices: Optional[LiteralString] = None diff --git a/openbb_platform/core/openbb_core/app/model/defaults.py b/openbb_platform/core/openbb_core/app/model/defaults.py index ad41b1dc228..52007edf5de 100644 --- a/openbb_platform/core/openbb_core/app/model/defaults.py +++ b/openbb_platform/core/openbb_core/app/model/defaults.py @@ -1,3 +1,5 @@ +"""Defaults model.""" + from typing import Dict, Optional from pydantic import BaseModel, ConfigDict, Field @@ -11,6 +13,7 @@ class Defaults(BaseModel): routes: Dict[str, Dict[str, Optional[str]]] = Field(default_factory=dict) def __repr__(self) -> str: + """Return string representation.""" return f"{self.__class__.__name__}\n\n" + "\n".join( f"{k}: {v}" for k, v in self.model_dump().items() ) diff --git a/openbb_platform/core/openbb_core/app/model/field.py b/openbb_platform/core/openbb_core/app/model/field.py new file mode 100644 index 00000000000..d791cb08f08 --- /dev/null +++ b/openbb_platform/core/openbb_core/app/model/field.py @@ -0,0 +1,28 @@ +"""Custom field for OpenBB.""" + +from typing import Any, List, Optional + +from pydantic.fields import FieldInfo + + +class OpenBBField(FieldInfo): + """Custom field for OpenBB.""" + + def __repr__(self): + """Override FieldInfo __repr__.""" + # We use repr() to avoid decoding special characters like \n + if self.choices: + return f"OpenBBField(description={repr(self.description)}, choices={repr(self.choices)})" + return f"OpenBBField(description={repr(self.description)})" + + def __init__(self, description: str, choices: Optional[List[Any]] = None): + """Initialize OpenBBField.""" + json_schema_extra = {"choices": choices} if choices else None + super().__init__(description=description, json_schema_extra=json_schema_extra) # type: ignore[arg-type] + + @property + def choices(self) -> Optional[List[Any]]: + """Custom choices.""" + if self.json_schema_extra: + return self.json_schema_extra.get("choices") # type: ignore[union-attr,return-value] + return None diff --git a/openbb_platform/core/openbb_core/app/model/hub/features_keys.py b/openbb_platform/core/openbb_core/app/model/hub/features_keys.py deleted file mode 100644 index c0653ff443c..00000000000 --- a/openbb_platform/core/openbb_core/app/model/hub/features_keys.py +++ /dev/null @@ -1,37 +0,0 @@ -from typing import Optional - -from pydantic import BaseModel, Field - - -class FeaturesKeys(BaseModel): - API_BITQUERY_KEY: Optional[str] = Field(default=None) - API_BIZTOC_TOKEN: Optional[str] = Field(default=None) - API_CMC_KEY: Optional[str] = Field(default=None) - API_COINGLASS_KEY: Optional[str] = Field(default=None) - API_CRYPTO_PANIC_KEY: Optional[str] = Field(default=None) - API_DAPPRADAR_KEY: Optional[str] = Field(default=None) - API_DATABENTO_KEY: Optional[str] = Field(default=None) - API_EODHD_KEY: Optional[str] = Field(default=None) - API_ETHPLORER_KEY: Optional[str] = Field(default=None) - API_FINNHUB_KEY: Optional[str] = Field(default=None) - API_FRED_KEY: Optional[str] = Field(default=None) - API_GITHUB_KEY: Optional[str] = Field(default=None) - API_GLASSNODE_KEY: Optional[str] = Field(default=None) - API_INTRINIO_KEY: Optional[str] = Field(default=None) - API_KEY_ALPHAVANTAGE: Optional[str] = Field(default=None) - API_KEY_FINANCIALMODELINGPREP: Optional[str] = Field(default=None) - API_KEY_QUANDL: Optional[str] = Field(default=None) - API_MESSARI_KEY: Optional[str] = Field(default=None) - API_NEWS_TOKEN: Optional[str] = Field(default=None) - API_POLYGON_KEY: Optional[str] = Field(default=None) - API_REDDIT_CLIENT_ID: Optional[str] = Field(default=None) - API_REDDIT_CLIENT_SECRET: Optional[str] = Field(default=None) - API_REDDIT_PASSWORD: Optional[str] = Field(default=None) - API_REDDIT_USERNAME: Optional[str] = Field(default=None) - API_REDDIT_USER_AGENT: Optional[str] = Field(default=None) - API_SANTIMENT_KEY: Optional[str] = Field(default=None) - API_SHROOM_KEY: Optional[str] = Field(default=None) - API_SMARTSTAKE_KEY: Optional[str] = Field(default=None) - API_SMARTSTAKE_TOKEN: Optional[str] = Field(default=None) - API_TOKEN_TERMINAL_KEY: Optional[str] = Field(default=None) - API_WHALE_ALERT_KEY: Optional[str] = Field(default=None) diff --git a/openbb_platform/core/openbb_core/app/model/hub/hub_session.py b/openbb_platform/core/openbb_core/app/model/hub/hub_session.py index fb0142eafc1..7a9cf615991 100644 --- a/openbb_platform/core/openbb_core/app/model/hub/hub_session.py +++ b/openbb_platform/core/openbb_core/app/model/hub/hub_session.py @@ -1,9 +1,13 @@ +"""Model for HubSession.""" + from typing import Optional from pydantic import BaseModel, SecretStr, field_serializer class HubSession(BaseModel): + """Model for HubSession.""" + username: Optional[str] = None email: str primary_usage: str @@ -12,10 +16,12 @@ class HubSession(BaseModel): access_token: SecretStr def __repr__(self) -> str: + """Return string representation.""" return f"{self.__class__.__name__}\n\n" + "\n".join( f"{k}: {v}" for k, v in self.model_dump().items() ) @field_serializer("access_token", when_used="json-unless-none") def _dump_secret(self, v): + """Dump secret.""" return v.get_secret_value() diff --git a/openbb_platform/core/openbb_core/app/model/hub/hub_user_settings.py b/openbb_platform/core/openbb_core/app/model/hub/hub_user_settings.py index aebcf6afa31..16ea348319e 100644 --- a/openbb_platform/core/openbb_core/app/model/hub/hub_user_settings.py +++ b/openbb_platform/core/openbb_core/app/model/hub/hub_user_settings.py @@ -1,12 +1,15 @@ -# from typing import Dict, List, Union +"""Hub user settings model.""" + +from typing import Dict, Optional -from openbb_core.app.model.hub.features_keys import FeaturesKeys from pydantic import BaseModel, ConfigDict, Field class HubUserSettings(BaseModel): + """Hub user settings model.""" + # features_settings: Dict[str, str] - features_keys: FeaturesKeys = Field(default_factory=FeaturesKeys) + features_keys: Dict[str, Optional[str]] = Field(default_factory=dict) # features_sources: Dict[str, List[str]] # features_terminal_style: Dict[str, Union[str, Dict[str, str]]] diff --git a/openbb_platform/core/openbb_core/app/model/metadata.py b/openbb_platform/core/openbb_core/app/model/metadata.py index cf421fca7e0..9162bfa0bea 100644 --- a/openbb_platform/core/openbb_core/app/model/metadata.py +++ b/openbb_platform/core/openbb_core/app/model/metadata.py @@ -1,3 +1,5 @@ +"""Metadata model.""" + from datetime import datetime from inspect import isclass from typing import Any, Dict, Optional, Sequence, Union @@ -10,6 +12,8 @@ from openbb_core.provider.abstract.data import Data class Metadata(BaseModel): + """Metadata of a command execution.""" + arguments: Dict[str, Any] = Field( default_factory=dict, description="Arguments of the command.", @@ -21,6 +25,7 @@ class Metadata(BaseModel): timestamp: datetime = Field(description="Execution starting timestamp.") def __repr__(self) -> str: + """Return string representation.""" return f"{self.__class__.__name__}\n\n" + "\n".join( f"{k}: {v}" for k, v in self.model_dump().items() ) @@ -29,96 +34,108 @@ class Metadata(BaseModel): @classmethod def scale_arguments(cls, v): """Scale arguments. + This function is meant to limit the size of the input arguments of a command. If the type is one of the following: `Data`, `List[Data]`, `DataFrame`, `List[DataFrame]`, `Series`, `List[Series]` or `ndarray`, the value of the argument is swapped by a dictionary 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 + arguments: Dict[str, Any] = {} + for item in ["provider_choices", "standard_params", "extra_params"]: + arguments[item] = {} + # The item could be class or it could a dictionary. + v_item = ( + v.__dict__.get(item, {}) if not isinstance(v, dict) else v.get(item, {}) + ) + # The item might not be a dictionary yet. + v_item = v_item if isinstance(v_item, dict) else v_item.__dict__ + 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()), - } + # 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)), - } + # 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() + # 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, - } + new_arg_val = { + "type": f"{type(arg_val).__name__}", + "columns": df_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[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, + } - # 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, - } + # 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], + } - # ndarray - elif isinstance(arg_val, np.ndarray): - new_arg_val = { - "type": f"{type(arg_val).__name__}", - "columns": list(arg_val.dtype.names or []), - } + # 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, + } - else: - str_repr_arg_val = str(arg_val) - if len(str_repr_arg_val) > 80: - new_arg_val = str_repr_arg_val[:80] + # ndarray + elif isinstance(arg_val, np.ndarray): + new_arg_val = { + "type": f"{type(arg_val).__name__}", + "columns": list(arg_val.dtype.names or []), + } - v[arg] = new_arg_val or arg_val + else: + str_repr_arg_val = str(arg_val) + if len(str_repr_arg_val) > 80: + new_arg_val = str_repr_arg_val[:80] - return v + arguments[item][arg] = new_arg_val or arg_val + + return arguments diff --git a/openbb_platform/core/openbb_core/app/model/obbject.py b/openbb_platform/core/openbb_core/app/model/obbject.py index 89232702405..2db09e0cd00 100644 --- a/openbb_platform/core/openbb_core/app/model/obbject.py +++ b/openbb_platform/core/openbb_core/app/model/obbject.py @@ -1,6 +1,5 @@ """The OBBject.""" -from re import sub from typing import ( TYPE_CHECKING, Any, @@ -26,6 +25,7 @@ from openbb_core.app.model.abstract.tagged import Tagged from openbb_core.app.model.abstract.warning import Warning_ from openbb_core.app.model.charts.chart import Chart from openbb_core.app.utils import basemodel_to_df +from openbb_core.provider.abstract.annotated_result import AnnotatedResult from openbb_core.provider.abstract.data import Data if TYPE_CHECKING: @@ -81,40 +81,6 @@ class OBBject(Tagged, Generic[T]): ] return f"{self.__class__.__name__}\n\n" + "\n".join(items) - @classmethod - def results_type_repr(cls, params: Optional[Any] = None) -> str: - """Return the results type representation.""" - results_field = cls.model_fields.get("results") - type_repr = "Any" - if results_field: - type_ = params[0] if params else results_field.annotation - type_repr = getattr(type_, "__name__", str(type_)) - - if json_schema_extra := getattr(results_field, "json_schema_extra", {}): - model = json_schema_extra.get("model", "Any") - - if json_schema_extra.get("is_union"): - return f"Union[List[{model}], {model}]" - if json_schema_extra.get("has_list"): - return f"List[{model}]" - - return model - - if "typing." in str(type_): - unpack_optional = sub(r"Optional\[(.*)\]", r"\1", str(type_)) - type_repr = sub( - r"(\w+\.)*(\w+)?(\, NoneType)?", - r"\2", - unpack_optional, - ) - - return type_repr - - @classmethod - def model_parametrized_name(cls, params: Any) -> str: - """Return the model name with the parameters.""" - return f"OBBject[{cls.results_type_repr(params)}]" - def to_df( self, index: Optional[Union[str, None]] = "date", sort_by: Optional[str] = None ) -> pd.DataFrame: @@ -277,6 +243,24 @@ class OBBject(Tagged, Generic[T]): del results["index"] return results + def to_llm(self) -> Union[Dict[Hashable, Any], List[Dict[Hashable, Any]]]: + """Convert results field to an LLM compatible output. + + Returns + ------- + Union[Dict[Hashable, Any], List[Dict[Hashable, Any]]] + Dictionary of lists or list of dictionaries if orient is "records". + """ + df = self.to_dataframe(index=None) + + results = df.to_json( + orient="records", + date_format="iso", + date_unit="s", + ) + + return results + def show(self, **kwargs: Any) -> None: """Display chart.""" # pylint: disable=no-member @@ -299,4 +283,9 @@ class OBBject(Tagged, Generic[T]): OBBject[ResultsType] OBBject with results. """ - return cls(results=await query.execute()) + results = await query.execute() + if isinstance(results, AnnotatedResult): + return cls( + results=results.result, extra={"results_metadata": results.metadata} + ) + return cls(results=results) diff --git a/openbb_platform/core/openbb_core/app/model/preferences.py b/openbb_platform/core/openbb_core/app/model/preferences.py index 57987020b17..19c2d7f745d 100644 --- a/openbb_platform/core/openbb_core/app/model/preferences.py +++ b/openbb_platform/core/openbb_core/app/model/preferences.py @@ -9,24 +9,28 @@ from pydantic import BaseModel, ConfigDict, Field, PositiveInt class Preferences(BaseModel): """Preferences for the OpenBB platform.""" - data_directory: str = str(Path.home() / "OpenBBUserData") - export_directory: str = str(Path.home() / "OpenBBUserData" / "exports") - user_styles_directory: str = str(Path.home() / "OpenBBUserData" / "styles" / "user") cache_directory: str = str(Path.home() / "OpenBBUserData" / "cache") chart_style: Literal["dark", "light"] = "dark" + data_directory: str = str(Path.home() / "OpenBBUserData") + export_directory: str = str(Path.home() / "OpenBBUserData" / "exports") + metadata: bool = True + output_type: Literal[ + "OBBject", "dataframe", "polars", "numpy", "dict", "chart", "llm" + ] = Field( + default="OBBject", + description="Python default output type.", + validate_default=True, + ) plot_enable_pywry: bool = True - plot_pywry_width: PositiveInt = 1400 - plot_pywry_height: PositiveInt = 762 plot_open_export: bool = ( False # Whether to open plot image exports after they are created ) - table_style: Literal["dark", "light"] = "dark" + plot_pywry_height: PositiveInt = 762 + plot_pywry_width: PositiveInt = 1400 request_timeout: PositiveInt = 15 - metadata: bool = True - output_type: Literal["OBBject", "dataframe", "polars", "numpy", "dict", "chart"] = ( - Field(default="OBBject", description="Python default output type.") - ) show_warnings: bool = True + table_style: Literal["dark", "light"] = "dark" + user_styles_directory: str = str(Path.home() / "OpenBBUserData" / "styles" / "user") model_config = ConfigDict(validate_assignment=True) diff --git a/openbb_platform/core/openbb_core/app/model/profile.py b/openbb_platform/core/openbb_core/app/model/profile.py index 64959e5c798..f1e62db0393 100644 --- a/openbb_platform/core/openbb_core/app/model/profile.py +++ b/openbb_platform/core/openbb_core/app/model/profile.py @@ -1,3 +1,5 @@ +"""Profile model.""" + from typing import Optional from pydantic import BaseModel, ConfigDict, Field @@ -6,10 +8,13 @@ from openbb_core.app.model.hub.hub_session import HubSession class Profile(BaseModel): + """Profile.""" + hub_session: Optional[HubSession] = Field(default=None) model_config = ConfigDict(validate_assignment=True) def __repr__(self) -> str: + """Return string representation.""" return f"{self.__class__.__name__}\n\n" + "\n".join( f"{k}: {v}" for k, v in self.model_dump().items() ) diff --git a/openbb_platform/core/openbb_core/app/model/python_settings.py b/openbb_platform/core/openbb_core/app/model/python_settings.py new file mode 100644 index 00000000000..f03648c92b4 --- /dev/null +++ b/openbb_platform/core/openbb_core/app/model/python_settings.py @@ -0,0 +1,23 @@ +"""Python configuration settings model.""" + +from typing import List, Optional + +from pydantic import BaseModel, Field, PositiveInt + + +class PythonSettings(BaseModel): + """Settings model for Python interface configuration.""" + + docstring_sections: List[str] = Field( + default_factory=lambda: ["description", "parameters", "returns", "examples"], + description="Sections to include in autogenerated docstrings.", + ) + docstring_max_length: Optional[PositiveInt] = Field( + default=None, description="Maximum length of autogenerated docstrings." + ) + + def __repr__(self) -> str: + """Return a string representation of the model.""" + return f"{self.__class__.__name__}\n\n" + "\n".join( + f"{k}: {v}" for k, v in self.model_dump().items() + ) diff --git a/openbb_platform/core/openbb_core/app/model/results/__init__.py b/openbb_platform/core/openbb_core/app/model/results/__init__.py index e69de29bb2d..a87e3e8784f 100644 --- a/openbb_platform/core/openbb_core/app/model/results/__init__.py +++ b/openbb_platform/core/openbb_core/app/model/results/__init__.py @@ -0,0 +1 @@ +"""OpenBB Core App Model Results.""" diff --git a/openbb_platform/core/openbb_core/app/model/results/empty.py b/openbb_platform/core/openbb_core/app/model/results/empty.py index 4b23c903033..0f9779a681d 100644 --- a/openbb_platform/core/openbb_core/app/model/results/empty.py +++ b/openbb_platform/core/openbb_core/app/model/results/empty.py @@ -1,5 +1,7 @@ +"""Empty results.""" + from openbb_core.app.model.abstract.results import Results class Empty(Results): - pass + """Empty results.""" diff --git a/openbb_platform/core/openbb_core/app/model/system_settings.py b/openbb_platform/core/openbb_core/app/model/system_settings.py index 39ceebbc813..c5439fb760d 100644 --- a/openbb_platform/core/openbb_core/app/model/system_settings.py +++ b/openbb_platform/core/openbb_core/app/model/system_settings.py @@ -14,8 +14,9 @@ from openbb_core.app.constants import ( USER_SETTINGS_PATH, ) from openbb_core.app.model.abstract.tagged import Tagged -from openbb_core.app.model.fast_api_settings import FastAPISettings -from openbb_core.app.version import VERSION +from openbb_core.app.model.api_settings import APISettings +from openbb_core.app.model.python_settings import PythonSettings +from openbb_core.app.version import CORE_VERSION, VERSION class SystemSettings(Tagged): @@ -28,6 +29,7 @@ class SystemSettings(Tagged): # OpenBB section version: str = VERSION + core: str = CORE_VERSION home_directory: str = str(HOME_DIRECTORY) openbb_directory: str = str(OPENBB_DIRECTORY) user_settings_path: str = str(USER_SETTINGS_PATH) @@ -45,7 +47,10 @@ class SystemSettings(Tagged): log_collect: bool = True # API section - api_settings: FastAPISettings = Field(default_factory=FastAPISettings) + api_settings: APISettings = Field(default_factory=APISettings) + + # Python section + python_settings: PythonSettings = Field(default_factory=PythonSettings) # Others debug_mode: bool = False diff --git a/openbb_platform/core/openbb_core/app/provider_interface.py b/openbb_platform/core/openbb_core/app/provider_interface.py index ac43a50a16a..0932704cb96 100644 --- a/openbb_platform/core/openbb_core/app/provider_interface.py +++ b/openbb_platform/core/openbb_core/app/provider_interface.py @@ -2,18 +2,33 @@ from dataclasses import dataclass, make_dataclass from difflib import SequenceMatcher -from typing import Any, Callable, Dict, List, Literal, Optional, Tuple, Type, Union +from typing import ( + Annotated, + Any, + Callable, + Dict, + List, + Literal, + Optional, + Tuple, + Type, + Union, +) from fastapi import Query from pydantic import ( BaseModel, ConfigDict, + Discriminator, Field, + SerializeAsAny, + Tag, create_model, ) from pydantic.fields import FieldInfo from openbb_core.app.model.abstract.singleton import SingletonMeta +from openbb_core.app.model.obbject import OBBject from openbb_core.provider.query_executor import QueryExecutor from openbb_core.provider.registry_map import MapType, RegistryMap from openbb_core.provider.utils.helpers import to_snake_case @@ -92,12 +107,15 @@ class ProviderInterface(metaclass=SingletonMeta): self._registry_map = registry_map or RegistryMap() self._query_executor = query_executor or QueryExecutor - self._map = self._registry_map.map + self._map = self._registry_map.standard_extra # TODO: Try these 4 methods in a single iteration self._model_providers_map = self._generate_model_providers_dc(self._map) self._params = self._generate_params_dc(self._map) self._data = self._generate_data_dc(self._map) self._return_schema = self._generate_return_schema(self._data) + self._return_annotations = self._generate_return_annotations( + self._registry_map.original_models + ) self._available_providers = self._registry_map.available_providers self._provider_choices = self._get_provider_choices(self._available_providers) @@ -148,9 +166,9 @@ class ProviderInterface(metaclass=SingletonMeta): return self._registry_map.models @property - def return_map(self) -> Dict[str, Dict[str, Any]]: + def return_annotations(self) -> Dict[str, Type[OBBject]]: """Return map.""" - return self._registry_map.return_map + return self._return_annotations def create_executor(self) -> QueryExecutor: """Get query executor.""" @@ -164,9 +182,11 @@ class ProviderInterface(metaclass=SingletonMeta): curr_name = current.name curr_type: Optional[Type] = current.annotation curr_desc = getattr(current.default, "description", "") + curr_json_schema_extra = getattr(current.default, "json_schema_extra", {}) inc_type: Optional[Type] = incoming.annotation inc_desc = getattr(incoming.default, "description", "") + inc_json_schema_extra = getattr(incoming.default, "json_schema_extra", {}) def split_desc(desc: str) -> str: """Split field description.""" @@ -174,6 +194,24 @@ class ProviderInterface(metaclass=SingletonMeta): detail = item[0] if item else "" return detail + def merge_json_schema_extra(curr: dict, inc: dict) -> dict: + """Merge json schema extra.""" + for key in curr.keys() & inc.keys(): + # Merge keys that are in both dictionaries if both are lists + curr_value = curr[key] + inc_value = inc[key] + if isinstance(curr_value, list) and isinstance(inc_value, list): + curr[key] = list(set(curr.get(key, []) + inc.get(key, []))) + inc.pop(key) + + # Add any remaining keys from inc to curr + curr.update(inc) + return curr + + json_schema_extra: dict = merge_json_schema_extra( + curr=curr_json_schema_extra or {}, inc=inc_json_schema_extra or {} + ) + curr_detail = split_desc(curr_desc) inc_detail = split_desc(inc_desc) @@ -192,6 +230,7 @@ class ProviderInterface(metaclass=SingletonMeta): default=getattr(current.default, "default", None), title=providers, description=new_desc, + json_schema_extra=json_schema_extra, ) merged_type: Optional[Type] = ( @@ -221,7 +260,9 @@ class ProviderInterface(metaclass=SingletonMeta): additional_description += " Multiple comma separated items allowed." else: additional_description += ( - " Multiple comma separated items allowed for provider(s): " + ", ".join(multiple) + "." # type: ignore + " Multiple comma separated items allowed for provider(s): " + + ", ".join(multiple) # type: ignore[arg-type] + + "." ) provider_field = ( @@ -375,7 +416,7 @@ class ProviderInterface(metaclass=SingletonMeta): This creates a dictionary of dataclasses that can be injected as a FastAPI dependency. - Example: + Example ------- @dataclass class CompanyNews(StandardParams): @@ -416,7 +457,7 @@ class ProviderInterface(metaclass=SingletonMeta): This creates a dictionary that maps model names to dataclasses that can be injected as a FastAPI dependency. - Example: + Example ------- @dataclass class CompanyNews(ProviderChoices): @@ -450,7 +491,7 @@ class ProviderInterface(metaclass=SingletonMeta): This creates a dictionary of dataclasses. - Example: + Example ------- class EquityHistoricalData(StandardData): date: date @@ -525,3 +566,60 @@ class ProviderInterface(metaclass=SingletonMeta): fields=[("provider", Literal[tuple(available_providers)])], # type: ignore bases=(ProviderChoices,), ) + + def _generate_return_annotations( + self, original_models: Dict[str, Dict[str, Any]] + ) -> Dict[str, Type[OBBject]]: + """Generate return annotations for FastAPI. + + Example + ------- + class Data(BaseModel): + ... + + class EquityData(Data): + price: float + + class YFEquityData(EquityData): + yf_field: str + + class AVEquityData(EquityData): + av_field: str + + class OBBject(BaseModel): + results: List[ + SerializeAsAny[ + Annotated[ + Union[ + Annotated[YFEquityData, Tag("yf")], + Annotated[AVEquityData, Tag("av")], + ], + Discriminator(get_provider), + ] + ] + ] + """ + + def get_provider(v: Type[BaseModel]): + """Callable to discriminate which BaseModel to use.""" + return getattr(v, "_provider", None) + + annotations = {} + for name, models in original_models.items(): + outer = set() + args = set() + for provider, model in models.items(): + data = model["data"] + outer.add(model["results_type"]) + args.add(Annotated[data, Tag(provider)]) + # We set the provider to use it in discriminator function + setattr(data, "_provider", provider) + meta = Discriminator(get_provider) if len(args) > 1 else None + inner = SerializeAsAny[Annotated[Union[tuple(args)], meta]] # type: ignore[misc,valid-type] + full = Union[tuple((o[inner] if o else inner) for o in outer)] # type: ignore[valid-type] + annotations[name] = create_model( + f"OBBject_{name}", + __base__=OBBject[full], # type: ignore[valid-type] + __doc__=f"OBBject with results of type {name}", + ) + return annotations diff --git a/openbb_platform/core/openbb_core/app/router.py b/openbb_platform/core/openbb_core/app/router.py index 218629be8ba..c9d196216aa 100644 --- a/openbb_platform/core/openbb_core/app/router.py +++ b/openbb_platform/core/openbb_core/app/router.py @@ -12,7 +12,6 @@ from typing import ( Mapping, Optional, Type, - Union, get_args, get_origin, get_type_hints, @@ -20,7 +19,7 @@ from typing import ( ) from fastapi import APIRouter, Depends -from pydantic import BaseModel, Field, SerializeAsAny, Tag, create_model +from pydantic import BaseModel from pydantic.v1.validators import find_validators from typing_extensions import Annotated, ParamSpec, _AnnotatedAlias @@ -203,15 +202,33 @@ class Router: """API Router.""" return self._api_router + @property + def prefix(self) -> str: + """Prefix.""" + return self._api_router.prefix + + @property + def description(self) -> Optional[str]: + """Description.""" + return self._description + + @property + def routers(self) -> Dict[str, "Router"]: + """Routers nested within the Router, i.e. sub-routers.""" + return self._routers + def __init__( self, prefix: str = "", + description: Optional[str] = None, ) -> None: """Initialize Router.""" self._api_router = APIRouter( prefix=prefix, responses={404: {"description": "Not found"}}, ) + self._description = description + self._routers: Dict[str, Router] = {} @overload def command(self, func: Optional[Callable[P, OBBject]]) -> Callable[P, OBBject]: @@ -290,10 +307,41 @@ class Router: prefix: str = "", ): """Include router.""" - tags = [prefix[1:]] if prefix else None + tags = [prefix.strip("/")] if prefix else None self._api_router.include_router( router=router.api_router, prefix=prefix, tags=tags # type: ignore ) + name = prefix if prefix else router.prefix + self._routers[name.strip("/")] = router + + def get_attr(self, path: str, attr: str) -> Any: + """Get router attribute from path. + + Parameters + ---------- + path : str + Path to the router or nested router. + E.g. "/equity" or "/equity/price". + attr : str + Attribute to get. + + Returns + ------- + Any + Attribute value. + """ + return self._search_attr(self, path, attr) + + @staticmethod + def _search_attr(router: "Router", path: str, attr: str) -> Any: + """Recursively search router attribute from path.""" + path = path.strip("/") + first = path.split("/")[0] + if first in router.routers: + return Router._search_attr( + router.routers[first], "/".join(path.split("/")[1:]), attr + ) + return getattr(router, attr, None) class SignatureInspector: @@ -348,10 +396,9 @@ class SignatureInspector: callable_=provider_interface.params[model]["extra"], ) - func = cls.inject_return_type( + func = cls.inject_return_annotation( func=func, - return_map=provider_interface.return_map.get(model, {}), - model=model, + annotation=provider_interface.return_annotations[model], ) else: @@ -368,60 +415,6 @@ class SignatureInspector: return func - @staticmethod - def inject_return_type( - func: Callable[P, OBBject], - return_map: Dict[str, dict], - model: str, - ) -> Callable[P, OBBject]: - """Inject full return model into the function. Also updates __name__ and __doc__ for API schemas.""" - results: Dict[str, Any] = {"list_type": [], "dict_type": []} - - for provider, return_data in return_map.items(): - if return_data["is_list"]: - results["list_type"].append( - Annotated[return_data["model"], Tag(provider)] - ) - continue - - results["dict_type"].append(Annotated[return_data["model"], Tag(provider)]) - - list_models, union_models = results.values() - - return_types = [] - for t, v in results.items(): - if not v: - continue - - inner_type: Any = SerializeAsAny[ # type: ignore[misc,valid-type] - Annotated[ - Union[tuple(v)], # type: ignore - Field(discriminator="provider"), - ] - ] - return_types.append(List[inner_type] if t == "list_type" else inner_type) - - return_type = create_model( - f"OBBject_{model}", - __base__=OBBject, - __doc__=f"OBBject with results of type {model}", - results=( - Optional[Union[tuple(return_types)]], # type: ignore - Field( - None, - description="Serializable results.", - json_schema_extra={ - "model": model, - "has_list": bool(len(list_models) > 0), - "is_union": bool(list_models and union_models), - }, - ), - ), - ) - - func.__annotations__["return"] = return_type - return func - @staticmethod def polish_return_schema(func: Callable[P, OBBject]) -> Callable[P, OBBject]: """Polish API schemas by filling `__doc__` and `__name__`.""" @@ -468,6 +461,14 @@ class SignatureInspector: func.__annotations__[arg] = Annotated[callable_, Depends()] # type: ignore return func + @staticmethod + def inject_return_annotation( + func: Callable[P, OBBject], annotation: Type[OBBject] + ) -> Callable[P, OBBject]: + """Annotate function with return annotation.""" + func.__annotations__["return"] = annotation + return func + @staticmethod def get_description(func: Callable) -> str: """Get description from docstring.""" diff --git a/openbb_platform/core/openbb_core/app/service/auth_service.py b/openbb_platform/core/openbb_core/app/service/auth_service.py index 6ce4ecbb221..3bbe97c92dc 100644 --- a/openbb_platform/core/openbb_core/app/service/auth_service.py +++ b/openbb_platform/core/openbb_core/app/service/auth_service.py @@ -29,7 +29,7 @@ class AuthService(metaclass=SingletonMeta): """Auth service.""" def __init__(self, ext_name: Optional[str] = EXT_NAME) -> None: - """Initializes AuthService.""" + """Initialize AuthService.""" if not self._load_extension(ext_name): self._router = default_router self._auth_hook = default_auth_hook @@ -37,22 +37,22 @@ class AuthService(metaclass=SingletonMeta): @property def router(self) -> APIRouter: - """Gets router.""" + """Get router.""" return self._router @property def auth_hook(self) -> Callable[..., Awaitable[None]]: - """Gets general authentication hook.""" + """Get general authentication hook.""" return self._auth_hook @property def user_settings_hook(self) -> Callable[..., Awaitable[UserSettings]]: - """Gets user settings hook.""" + """Get user settings hook.""" return self._user_settings_hook @staticmethod def _is_installed(ext_name: str) -> bool: - """Checks if auth_extension is installed.""" + """Check if auth_extension is installed.""" extension = ExtensionLoader().get_core_entry_point(ext_name) or False return extension and ext_name == extension.name # type: ignore diff --git a/openbb_platform/core/openbb_core/app/service/hub_service.py b/openbb_platform/core/openbb_core/app/service/hub_service.py index 22e6330bd76..bc932699ed5 100644 --- a/openbb_platform/core/openbb_core/app/service/hub_service.py +++ b/openbb_platform/core/openbb_core/app/service/hub_service.py @@ -1,6 +1,7 @@ """Hub manager class.""" from typing import Optional +from warnings import warn from fastapi import HTTPException from jose import JWTError @@ -8,13 +9,11 @@ from jose.exceptions import ExpiredSignatureError from jose.jwt import decode, get_unverified_header from openbb_core.app.model.abstract.error import OpenBBError from openbb_core.app.model.credentials import Credentials -from openbb_core.app.model.hub.features_keys import FeaturesKeys from openbb_core.app.model.hub.hub_session import HubSession from openbb_core.app.model.hub.hub_user_settings import HubUserSettings from openbb_core.app.model.profile import Profile from openbb_core.app.model.user_settings import UserSettings from openbb_core.env import Env -from pydantic import SecretStr from requests import get, post, put @@ -22,14 +21,28 @@ class HubService: """Hub service class.""" TIMEOUT = 10 + # Mapping of V3 keys to V4 keys for backward compatibility + V3TOV4 = { + "API_KEY_ALPHAVANTAGE": "alpha_vantage_api_key", + "API_BIZTOC_TOKEN": "biztoc_api_key", + "API_FRED_KEY": "fred_api_key", + "API_KEY_FINANCIALMODELINGPREP": "fmp_api_key", + "API_INTRINIO_KEY": "intrinio_api_key", + "API_POLYGON_KEY": "polygon_api_key", + "API_KEY_QUANDL": "nasdaq_api_key", + "API_TRADIER_TOKEN": "tradier_api_key", + } + V4TOV3 = {v: k for k, v in V3TOV4.items()} def __init__( self, session: Optional[HubSession] = None, base_url: Optional[str] = None, ): + """Initialize Hub service.""" self._base_url = base_url or Env().HUB_BACKEND self._session = session + self._hub_user_settings: Optional[HubUserSettings] = None @property def base_url(self) -> str: @@ -80,13 +93,10 @@ class HubService: def pull(self) -> UserSettings: """Pull user settings from Hub.""" if self._session: - hub_user_settings = self._get_user_settings(self._session) - if hub_user_settings: - profile = Profile( - hub_session=self._session, - ) - credentials = self.hub2platform(hub_user_settings) - return UserSettings(profile=profile, credentials=credentials) + self._hub_user_settings = self._get_user_settings(self._session) + profile = Profile(hub_session=self._session) + credentials = self.hub2platform(self._hub_user_settings) + return UserSettings(profile=profile, credentials=credentials) raise OpenBBError( "No session found. Login or provide a 'HubSession' on initialization." ) @@ -215,42 +225,38 @@ class HubService: detail = response.json().get("detail", None) raise HTTPException(status_code, detail) - @classmethod - def hub2platform(cls, settings: HubUserSettings) -> Credentials: + def hub2platform(self, settings: HubUserSettings) -> Credentials: """Convert Hub user settings to Platform models.""" - # TODO: Hub is getting credentials from `all_api_keys.json`, which uses - # the terminal names conventions. We need to update it to use a file that - # lives here in the platform and maps the credential names between the two. - credentials = Credentials( - alpha_vantage_api_key=settings.features_keys.API_KEY_ALPHAVANTAGE, - biztoc_api_key=settings.features_keys.API_BIZTOC_TOKEN, - fred_api_key=settings.features_keys.API_FRED_KEY, - fmp_api_key=settings.features_keys.API_KEY_FINANCIALMODELINGPREP, - intrinio_api_key=settings.features_keys.API_INTRINIO_KEY, - polygon_api_key=settings.features_keys.API_POLYGON_KEY, - nasdaq_api_key=settings.features_keys.API_KEY_QUANDL, - ) - return credentials + if any(k in settings.features_keys for k in self.V3TOV4): + deprecated = { + k: v for k, v in self.V3TOV4.items() if k in settings.features_keys + } + msg = "" + for k, v in deprecated.items(): + msg += f"\n'{k}' -> '{v}', " + msg = msg.strip(", ") + warn( + message=f"\nDeprecated v3 credentials found.\n{msg}" + "\n\nYou can update them at https://my.openbb.co/app/platform/credentials.", + ) + # We give priority to v4 keys over v3 keys if both are present + hub_credentials = { + self.V3TOV4.get(k, k): settings.features_keys.get(self.V3TOV4.get(k, k), v) + for k, v in settings.features_keys.items() + } + return Credentials(**hub_credentials) - @classmethod - def platform2hub(cls, credentials: Credentials) -> HubUserSettings: + def platform2hub(self, credentials: Credentials) -> HubUserSettings: """Convert Platform models to Hub user settings.""" - - def get_cred(cred: str) -> Optional[str]: - secret_str: Optional[SecretStr] = getattr(credentials, cred, None) - return secret_str.get_secret_value() if secret_str else None - - features_keys = FeaturesKeys( - API_BIZTOC_TOKEN=get_cred("biztoc_api_key"), - API_FRED_KEY=get_cred("fred_api_key"), - API_INTRINIO_KEY=get_cred("intrinio_api_key"), - API_KEY_ALPHAVANTAGE=get_cred("alpha_vantage_api_key"), - API_KEY_FINANCIALMODELINGPREP=get_cred("fmp_api_key"), - API_POLYGON_KEY=get_cred("polygon_api_key"), - API_KEY_QUANDL=get_cred("nasdaq_api_key"), - ) - hub_user_settings = HubUserSettings(features_keys=features_keys) - return hub_user_settings + # Dump mode json ensures SecretStr values are serialized as strings + credentials = credentials.model_dump(mode="json", exclude_none=True) + settings = self._hub_user_settings or HubUserSettings() + for v4_k, v in sorted(credentials.items()): + v3_k = self.V4TOV3.get(v4_k, None) + # If v3 key was there, we keep it + k = v3_k if v3_k in settings.features_keys else v4_k + settings.features_keys[k] = v + return settings @staticmethod def check_token_expiration(token: str) -> None: diff --git a/openbb_platform/core/openbb_core/app/service/system_service.py b/openbb_platform/core/openbb_core/app/service/system_service.py index c18bc1354ef..906ff6808ec 100644 --- a/openbb_platform/core/openbb_core/app/service/system_service.py +++ b/openbb_platform/core/openbb_core/app/service/system_service.py @@ -20,6 +20,7 @@ class SystemService(metaclass=SingletonMeta): "headless", "logging_sub_app", "api_settings", + "python_settings", "debug_mode", } @@ -29,6 +30,7 @@ class SystemService(metaclass=SingletonMeta): self, **kwargs, ): + """Initialize system service.""" self._system_settings = self._read_default_system_settings( path=self.SYSTEM_SETTINGS_PATH, **kwargs ) diff --git a/openbb_platform/core/openbb_core/app/service/user_service.py b/openbb_platform/core/openbb_core/app/service/user_service.py index 9b6fcff50bc..8ab438782eb 100644 --- a/openbb_platform/core/openbb_core/app/service/user_service.py +++ b/openbb_platform/core/openbb_core/app/service/user_service.py @@ -20,6 +20,7 @@ class UserService(metaclass=SingletonMeta): self, default_user_settings: Optional[UserSettings] = None, ): + """Initialize user service.""" self._default_user_settings = ( default_user_settings or self.read_default_user_settings() ) diff --git a/openbb_platform/core/openbb_core/app/static/__init__.py b/openbb_platform/core/openbb_core/app/static/__init__.py index e69de29bb2d..bbfce45ce15 100644 --- a/openbb_platform/core/openbb_core/app/static/__init__.py +++ b/openbb_platform/core/openbb_core/app/static/__init__.py @@ -0,0 +1 @@ +"""OpenBB Core App Static.""" diff --git a/openbb_platform/core/openbb_core/app/static/account.py b/openbb_platform/core/openbb_core/app/static/account.py index d589c265663..b17eef7c713 100644 --- a/openbb_platform/core/openbb_core/app/static/account.py +++ b/openbb_platform/core/openbb_core/app/static/account.py @@ -34,6 +34,7 @@ class Account: self._openbb_directory = ( base_app._command_runner.system_settings.openbb_directory ) + self._hub_service: Optional[HubService] = None def __repr__(self) -> str: """Human readable representation of the object.""" @@ -120,18 +121,20 @@ class Account: Optional[UserSettings] User settings: profile, credentials, preferences """ - hs = self._create_hub_service(email, password, pat) - incoming = hs.pull() + self._hub_service = self._create_hub_service(email, password, pat) + incoming = self._hub_service.pull() updated: UserSettings = UserService.update_default(incoming) self._base_app._command_runner.user_settings = updated if remember_me: Path(self._openbb_directory).mkdir(parents=False, exist_ok=True) session_file = Path(self._openbb_directory, self.SESSION_FILE) with open(session_file, "w") as f: - if not hs.session: + if not self._hub_service.session: raise OpenBBError("Not connected to hub.") - json.dump(hs.session.model_dump(mode="json"), f, indent=4) + json.dump( + self._hub_service.session.model_dump(mode="json"), f, indent=4 + ) if return_settings: return self._base_app._command_runner.user_settings @@ -151,14 +154,12 @@ class Account: Optional[UserSettings] User settings: profile, credentials, preferences """ - hub_session = self._base_app._command_runner.user_settings.profile.hub_session - if not hub_session: + if not self._hub_service: UserService.write_default_user_settings( self._base_app._command_runner.user_settings ) else: - hs = HubService(hub_session) - hs.push(self._base_app._command_runner.user_settings) + self._hub_service.push(self._base_app._command_runner.user_settings) if return_settings: return self._base_app._command_runner.user_settings @@ -178,14 +179,12 @@ class Account: Optional[UserSettings] User settings: profile, credentials, preferences """ - hub_session = self._base_app._command_runner.user_settings.profile.hub_session - if not hub_session: + if not self._hub_service: self._base_app._command_runner.user_settings = ( UserService.read_default_user_settings() ) else: - hs = HubService(hub_session) - incoming = hs.pull() + incoming = self._hub_service.pull() updated: UserSettings = UserService.update_default(incoming) updated.id = self._base_app._command_runner.user_settings.id self._base_app._command_runner.user_settings = updated @@ -208,12 +207,10 @@ class Account: Optional[UserSettings] User settings: profile, credentials, preferences """ - hub_session = self._base_app._command_runner.user_settings.profile.hub_session - if not hub_session: + if not self._hub_service: raise OpenBBError("Not connected to hub.") - hs = HubService(hub_session) - hs.disconnect() + self._hub_service.disconnect() session_file = Path(self._openbb_directory, self.SESSION_FILE) if session_file.exists(): diff --git a/openbb_platform/core/openbb_core/app/static/app_factory.py b/openbb_platform/core/openbb_core/app/static/app_factory.py index 5686194c467..7141e573400 100644 --- a/openbb_platform/core/openbb_core/app/static/app_factory.py +++ b/openbb_platform/core/openbb_core/app/static/app_factory.py @@ -1,6 +1,6 @@ """App factory.""" -from typing import Optional, Type, TypeVar +from typing import Dict, Optional, Type, TypeVar from openbb_core.app.command_runner import CommandRunner from openbb_core.app.model.system_settings import SystemSettings @@ -8,6 +8,7 @@ from openbb_core.app.model.user_settings import UserSettings from openbb_core.app.static.account import Account from openbb_core.app.static.container import Container from openbb_core.app.static.coverage import Coverage +from openbb_core.app.static.reference_loader import ReferenceLoader from openbb_core.app.version import VERSION E = TypeVar("E", bound=Type[Container]) @@ -25,10 +26,12 @@ class BaseApp: """Base app.""" def __init__(self, command_runner: CommandRunner): + """Initialize the app.""" command_runner.init_logging_service() self._command_runner = command_runner self._account = Account(self) self._coverage = Coverage(self) + self._reference = ReferenceLoader().reference @property def account(self) -> Account: @@ -50,14 +53,16 @@ class BaseApp: """Coverage menu.""" return self._coverage + @property + def reference(self) -> Dict[str, Dict]: + """Return reference data.""" + return self._reference + def create_app(extensions: Optional[E] = None) -> Type[BaseApp]: """Create the app.""" - class EmptyClass: - pass - - class App(BaseApp, extensions or EmptyClass): # type: ignore + class App(BaseApp, extensions or object): # type: ignore[misc] def __repr__(self) -> str: # pylint: disable=E1101 ext_doc = extensions.__doc__ if extensions else "" diff --git a/openbb_platform/core/openbb_core/app/static/container.py b/openbb_platform/core/openbb_core/app/static/container.py index a8a38b62963..60fc1def9bb 100644 --- a/openbb_platform/core/openbb_core/app/static/container.py +++ b/openbb_platform/core/openbb_core/app/static/container.py @@ -11,6 +11,7 @@ class Container: """Container class for the command runner session.""" def __init__(self, command_runner: CommandRunner) -> None: + """Initialize the container.""" self._command_runner = command_runner OBBject._user_settings = command_runner.user_settings OBBject._system_settings = command_runner.system_settings diff --git a/openbb_platform/core/openbb_core/app/static/package_builder.py b/openbb_platform/core/openbb_core/app/static/package_builder.py index 663fa7e4340..8a2a86a6619 100644 --- a/openbb_platform/core/openbb_core/app/static/package_builder.py +++ b/openbb_platform/core/openbb_core/app/static/package_builder.py @@ -6,7 +6,8 @@ import inspect import re import shutil import sys -from dataclasses import Field +from dataclasses import Field as DCField +from functools import partial from inspect import Parameter, _empty, isclass, signature from json import dumps, load from pathlib import Path @@ -24,6 +25,7 @@ from typing import ( TypeVar, Union, get_args, + get_origin, get_type_hints, ) @@ -36,15 +38,15 @@ from starlette.routing import BaseRoute from typing_extensions import Annotated, _AnnotatedAlias from openbb_core.app.extension_loader import ExtensionLoader, OpenBBGroups -from openbb_core.app.model.custom_parameter import ( - OpenBBCustomChoices, - OpenBBCustomParameter, -) from openbb_core.app.model.example import Example +from openbb_core.app.model.field import OpenBBField +from openbb_core.app.model.obbject import OBBject from openbb_core.app.provider_interface import ProviderInterface from openbb_core.app.router import RouterLoader +from openbb_core.app.service.system_service import SystemService from openbb_core.app.static.utils.console import Console from openbb_core.app.static.utils.linters import Linters +from openbb_core.app.version import CORE_VERSION, VERSION from openbb_core.env import Env from openbb_core.provider.abstract.data import Data @@ -86,13 +88,17 @@ class PackageBuilder: self.lint = lint self.verbose = verbose self.console = Console(verbose) + self.route_map = PathHandler.build_route_map() + self.path_list = PathHandler.build_path_list(route_map=self.route_map) def auto_build(self) -> None: """Trigger build if there are differences between built and installed extensions.""" if Env().AUTO_BUILD: - add, remove = PackageBuilder._diff( - self.directory / "assets" / "extension_map.json" + reference = PackageBuilder._read( + self.directory / "assets" / "reference.json" ) + ext_map = reference.get("info", {}).get("extensions", {}) + add, remove = PackageBuilder._diff(ext_map) if add: a = ", ".join(sorted(add)) print(f"Extensions to add: {a}") # noqa: T201 @@ -113,10 +119,9 @@ class PackageBuilder: self.console.log("\nBuilding extensions package...\n") self._clean(modules) ext_map = self._get_extension_map() - self._save_extension_map(ext_map) self._save_modules(modules, ext_map) self._save_package() - self._save_reference_file() + self._save_reference_file(ext_map) if self.lint: self._run_linters() @@ -143,12 +148,6 @@ class PackageBuilder: ] return ext_map - def _save_extension_map(self, ext_map: Dict[str, List[str]]) -> None: - """Save the map of extensions available at build time.""" - code = dumps(obj=dict(sorted(ext_map.items())), indent=4) - self.console.log("Writing extension map...") - self._write(code=code, name="extension_map", extension="json", folder="assets") - def _save_modules( self, modules: Optional[Union[str, List[str]]] = None, @@ -156,28 +155,26 @@ class PackageBuilder: ): """Save the modules.""" self.console.log("\nWriting modules...") - route_map = PathHandler.build_route_map() - path_list = PathHandler.build_path_list(route_map=route_map) - if not path_list: + if not self.path_list: self.console.log("\nThere is nothing to write.") return - MAX_LEN = max([len(path) for path in path_list if path != "/"]) + MAX_LEN = max([len(path) for path in self.path_list if path != "/"]) - if modules: - path_list = [path for path in path_list if path in modules] + _path_list = ( + [path for path in self.path_list if path in modules] + if modules + else self.path_list + ) - for path in path_list: - route = PathHandler.get_route(path=path, route_map=route_map) + for path in _path_list: + route = PathHandler.get_route(path, self.route_map) if route is None: - module_code = ModuleBuilder.build( - path=path, - ext_map=ext_map, - ) - module_name = PathHandler.build_module_name(path=path) + code = ModuleBuilder.build(path, ext_map) + name = PathHandler.build_module_name(path) self.console.log(f"({path})", end=" " * (MAX_LEN - len(path))) - self._write(code=module_code, name=module_name) + self._write(code, name) def _save_package(self): """Save the package.""" @@ -185,11 +182,23 @@ class PackageBuilder: code = "### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ###\n" self._write(code=code, name="__init__") - def _save_reference_file(self): + def _save_reference_file(self, ext_map: Optional[Dict[str, List[str]]] = None): """Save the reference.json file.""" self.console.log("\nWriting reference file...") - data = ReferenceGenerator.get_reference_data() - code = dumps(obj=data, indent=4) + code = dumps( + obj={ + "openbb": VERSION.replace("dev", ""), + "info": { + "title": "OpenBB Platform (Python)", + "description": "This is the OpenBB Platform (Python).", + "core": CORE_VERSION.replace("dev", ""), + "extensions": ext_map, + }, + "paths": ReferenceGenerator.get_paths(self.route_map), + "routers": ReferenceGenerator.get_routers(self.route_map), + }, + indent=4, + ) self._write(code=code, name="reference", extension="json", folder="assets") def _run_linters(self): @@ -224,13 +233,28 @@ class PackageBuilder: return content @staticmethod - def _diff(path: Path) -> Tuple[Set[str], Set[str]]: + def _diff(ext_map: Dict[str, List[str]]) -> Tuple[Set[str], Set[str]]: """Check differences between built and installed extensions. Parameters ---------- - path: Path - The path to the folder where the extension map is stored. + ext_map: Dict[str, List[str]] + Dictionary containing the extensions. + Example: + { + "openbb_core_extension": [ + "commodity@1.0.1", + ... + ], + "openbb_provider_extension": [ + "benzinga@1.1.3", + ... + ], + "openbb_obbject_extension": [ + "openbb_charting@1.0.0", + ... + ] + } Returns ------- @@ -238,8 +262,6 @@ class PackageBuilder: First element: set of installed extensions that are not in the package. Second element: set of extensions in the package that are not installed. """ - ext_map = PackageBuilder._read(path) - add: Set[str] = set() remove: Set[str] = set() groups = OpenBBGroups.groups() @@ -263,7 +285,7 @@ class ModuleBuilder: def build(path: str, ext_map: Optional[Dict[str, List[str]]] = None) -> str: """Build the module.""" code = "### THIS FILE IS AUTO-GENERATED. DO NOT EDIT. ###\n\n" - code += ImportDefinition.build(path=path) + code += ImportDefinition.build(path) code += ClassDefinition.build(path, ext_map) return code @@ -300,7 +322,7 @@ class ImportDefinition: hint_type = get_args(get_type_hints(return_type)["results"])[0] hint_type_list.append(hint_type) - hint_type_list = cls.filter_hint_type_list(hint_type_list=hint_type_list) + hint_type_list = cls.filter_hint_type_list(hint_type_list) return hint_type_list @@ -330,7 +352,6 @@ class ImportDefinition: hint_type_list = cls.get_path_hint_type_list(path=path) code = "from openbb_core.app.static.container import Container" code += "\nfrom openbb_core.app.model.obbject import OBBject" - code += "\nfrom openbb_core.app.model.custom_parameter import OpenBBCustomParameter, OpenBBCustomChoices" # These imports were not detected before build, so we add them manually and # ruff --fix the resulting code to remove unused imports. @@ -339,6 +360,7 @@ class ImportDefinition: code += "\nimport pandas" code += "\nimport numpy" code += "\nimport datetime" + code += "\nfrom datetime import date" code += "\nimport pydantic" code += "\nfrom pydantic import BaseModel" code += "\nfrom inspect import Parameter" @@ -355,6 +377,7 @@ class ImportDefinition: code += "\nfrom openbb_core.app.static.utils.filters import filter_inputs\n" code += "\nfrom openbb_core.provider.abstract.data import Data" code += "\nfrom openbb_core.app.deprecation import OpenBBDeprecationWarning\n" + code += "\nfrom openbb_core.app.model.field import OpenBBField" if path.startswith("/quantitative"): code += "\nfrom openbb_quantitative.models import " code += "(CAPMModel,NormalityModel,OmegaModel,SummaryModel,UnitRootModel)" @@ -380,7 +403,7 @@ class ClassDefinition: code = f"class {class_name}(Container):\n" route_map = PathHandler.build_route_map() - path_list = PathHandler.build_path_list(route_map=route_map) + path_list = PathHandler.build_path_list(route_map) child_path_list = sorted( PathHandler.get_child_path_list( path=path, @@ -391,7 +414,7 @@ class ClassDefinition: doc = f' """{path}\n' if path else ' # fmt: off\n """\nRouters:\n' methods = "" for c in child_path_list: - route = PathHandler.get_route(path=c, route_map=route_map) + route = PathHandler.get_route(c, route_map) if route: doc += f" {route.name}\n" methods += MethodDefinition.build_command_method( @@ -557,8 +580,8 @@ class MethodDefinition: kind=Parameter.POSITIONAL_OR_KEYWORD, annotation=Annotated[ bool, - OpenBBCustomParameter( - description="Whether to create a chart or not, by default False." + OpenBBField( + description="Whether to create a chart or not, by default False.", ), ], default=False, @@ -580,14 +603,14 @@ class MethodDefinition: name="provider", kind=Parameter.POSITIONAL_OR_KEYWORD, annotation=Annotated[ - Union[MethodDefinition.get_type(field), None], - OpenBBCustomParameter( + Optional[MethodDefinition.get_type(field)], + OpenBBField( description=( "The provider to use for the query, by default None.\n" f" If None, the provider specified in defaults is selected or '{first}' if there is\n" " no default." "" - ) + ), ), ], default=None, @@ -638,7 +661,7 @@ class MethodDefinition: ): """Add the field custom description and choices to the param signature as annotations.""" if model_name: - available_fields: Dict[str, Field] = ( + available_fields: Dict[str, DCField] = ( ProviderInterface().params[model_name]["standard"].__dataclass_fields__ ) @@ -647,27 +670,26 @@ class MethodDefinition: continue field_default = available_fields[param].default - choices = getattr(field_default, "json_schema_extra", {}).get( "choices", [] ) description = getattr(field_default, "description", "") - if choices: - new_value = value.replace( - annotation=Annotated[ - value.annotation, - OpenBBCustomParameter(description=description), - OpenBBCustomChoices(choices=choices), - ], - ) - else: - new_value = value.replace( - annotation=Annotated[ - value.annotation, - OpenBBCustomParameter(description=description), - ], - ) + PartialParameter = partial( + OpenBBField, + description=description, + ) + + new_value = value.replace( + annotation=Annotated[ + value.annotation, + ( + PartialParameter(choices=choices) + if choices + else PartialParameter() + ), + ], + ) od[param] = new_value @@ -901,17 +923,17 @@ class DocstringGenerator: Parameters ---------- - field_type (Any): - Typing object containing the field type. - is_required (bool): - Flag to indicate if the field is required. - target (Literal["docstring", "website"], optional): - Target to return type for. Defaults to "docstring". + field_type : Any + Typing object containing the field type. + is_required : bool + Flag to indicate if the field is required. + target : Literal["docstring", "website"] + Target to return type for. Defaults to "docstring". Returns ------- - str: - String representation of the field type. + str + String representation of the field type. """ is_optional = not is_required @@ -1020,6 +1042,7 @@ class DocstringGenerator: kwarg_params: dict, returns: Dict[str, FieldInfo], results_type: str, + sections: List[str], ) -> str: """Create the docstring for model.""" @@ -1053,50 +1076,56 @@ class DocstringGenerator: description = getattr(metadata[0], "description", "") if metadata else "" return type_, description - docstring = summary.strip("\n").replace("\n ", f"\n{create_indent(2)}") - docstring += "\n\n" - docstring += f"{create_indent(2)}Parameters\n" - docstring += f"{create_indent(2)}----------\n" + # Description summary + if "description" in sections: + docstring = summary.strip("\n").replace("\n ", f"\n{create_indent(2)}") + docstring += "\n\n" + if "parameters" in sections: + docstring += f"{create_indent(2)}Parameters\n" + docstring += f"{create_indent(2)}----------\n" - # Explicit parameters - for param_name, param in explicit_params.items(): - type_, description = get_param_info(param) - type_str = format_type(str(type_), char_limit=79) - docstring += f"{create_indent(2)}{param_name} : {type_str}\n" - docstring += f"{create_indent(3)}{format_description(description)}\n" + # Explicit parameters + for param_name, param in explicit_params.items(): + type_, description = get_param_info(param) + type_str = format_type(str(type_), char_limit=79) + docstring += f"{create_indent(2)}{param_name} : {type_str}\n" + docstring += f"{create_indent(3)}{format_description(description)}\n" - # Kwargs - for param_name, param in kwarg_params.items(): - p_type = getattr(param, "type", "") - type_ = ( - getattr(p_type, "__name__", "") if inspect.isclass(p_type) else p_type - ) + # Kwargs + for param_name, param in kwarg_params.items(): + p_type = getattr(param, "type", "") + type_ = ( + getattr(p_type, "__name__", "") + if inspect.isclass(p_type) + else p_type + ) - if "NoneType" in str(type_): - type_ = f"Optional[{type_}]".replace(", NoneType", "") + if "NoneType" in str(type_): + type_ = f"Optional[{type_}]".replace(", NoneType", "") - default = getattr(param, "default", "") - description = getattr(default, "description", "") - docstring += f"{create_indent(2)}{param_name} : {type_}\n" - docstring += f"{create_indent(3)}{format_description(description)}\n" + default = getattr(param, "default", "") + description = getattr(default, "description", "") + docstring += f"{create_indent(2)}{param_name} : {type_}\n" + docstring += f"{create_indent(3)}{format_description(description)}\n" - # Returns - docstring += "\n" - docstring += f"{create_indent(2)}Returns\n" - docstring += f"{create_indent(2)}-------\n" - providers, _ = get_param_info(explicit_params.get("provider", None)) - docstring += cls.get_OBBject_description(results_type, providers) + if "returns" in sections: + # Returns + docstring += "\n" + docstring += f"{create_indent(2)}Returns\n" + docstring += f"{create_indent(2)}-------\n" + providers, _ = get_param_info(explicit_params.get("provider", None)) + docstring += cls.get_OBBject_description(results_type, providers) - # Schema - underline = "-" * len(model_name) - docstring += f"\n{create_indent(2)}{model_name}\n" - docstring += f"{create_indent(2)}{underline}\n" + # Schema + underline = "-" * len(model_name) + docstring += f"\n{create_indent(2)}{model_name}\n" + docstring += f"{create_indent(2)}{underline}\n" - for name, field in returns.items(): - field_type = cls.get_field_type(field.annotation, field.is_required()) - description = getattr(field, "description", "") - docstring += f"{create_indent(2)}{field.alias or name} : {field_type}\n" - docstring += f"{create_indent(3)}{format_description(description)}\n" + for name, field in returns.items(): + field_type = cls.get_field_type(field.annotation, field.is_required()) + description = getattr(field, "description", "") + docstring += f"{create_indent(2)}{field.alias or name} : {field_type}\n" + docstring += f"{create_indent(3)}{format_description(description)}\n" return docstring @classmethod @@ -1112,6 +1141,11 @@ class DocstringGenerator: doc = func.__doc__ or "" param_types = {} + sections = SystemService().system_settings.python_settings.docstring_sections + max_length = ( + SystemService().system_settings.python_settings.docstring_max_length + ) + # Parameters explicit in the function signature explicit_params = dict(formatted_params) explicit_params.pop("extra_params", None) @@ -1125,32 +1159,105 @@ class DocstringGenerator: # Parameters passed as **kwargs kwarg_params = params["extra"].__dataclass_fields__ param_types.update({k: v.type for k, v in kwarg_params.items()}) - - returns = return_schema.model_fields - results_type = func.__annotations__.get("return", model_name) - if hasattr(results_type, "results_type_repr"): - results_type = results_type.results_type_repr() - + # Format the annotation to hide the metadata, tags, etc. + annotation = func.__annotations__.get("return") + results_type = ( + cls._get_repr( + cls._get_generic_types( + annotation.model_fields["results"].annotation, # type: ignore[union-attr,arg-type] + [], + ), + model_name, + ) + if isclass(annotation) and issubclass(annotation, OBBject) # type: ignore[arg-type] + else model_name + ) doc = cls.generate_model_docstring( model_name=model_name, summary=func.__doc__ or "", explicit_params=explicit_params, kwarg_params=kwarg_params, - returns=returns, + returns=return_schema.model_fields, results_type=results_type, + sections=sections, ) else: doc = doc.replace("\n ", f"\n{create_indent(2)}") - if doc and examples: + if doc and examples and "examples" in sections: doc += cls.build_examples( path.replace("/", "."), param_types, examples, ) + if ( + max_length # pylint: disable=chained-comparison + and len(doc) > max_length + and max_length > 3 + ): + doc = doc[: max_length - 3] + "..." return doc + @classmethod + def _get_generic_types(cls, type_: type, items: list) -> List[str]: + """Unpack generic types recursively. + + Parameters + ---------- + type_ : type + Type to unpack. + items : list + List to store the unpacked types. + + Returns + ------- + List[str] + List of unpacked type names. + + Examples + -------- + Union[List[str], Dict[str, str], Tuple[str]] -> ["List", "Dict", "Tuple"] + """ + if hasattr(type_, "__args__"): + origin = get_origin(type_) + # pylint: disable=unidiomatic-typecheck + if ( + type(origin) is type + and origin is not Annotated + and (name := getattr(type_, "_name", getattr(type_, "__name__", None))) + ): + items.append(name.title()) + func = partial(cls._get_generic_types, items=items) + set().union(*map(func, type_.__args__), items) + return items + + @staticmethod + def _get_repr(items: List[str], model: str) -> str: + """Get the string representation of the types list with the model name. + + Parameters + ---------- + items : List[str] + List of type names. + model : str + Model name to access the model providers. + + Returns + ------- + str + String representation of the unpacked types list. + + Examples + -------- + [List, Dict, Tuple], M -> "Union[List[M], Dict[str, M], Tuple[M]]" + """ + if s := [ + f"Dict[str, {model}]" if i == "Dict" else f"{i}[{model}]" for i in items + ]: + return f"Union[{', '.join(s)}]" if len(s) > 1 else s[0] + return model + class PathHandler: """Handle the paths for the Platform.""" @@ -1235,7 +1342,7 @@ class ReferenceGenerator: pi = DocstringGenerator.provider_interface @classmethod - def get_endpoint_examples( + def _get_endpoint_examples( cls, path: str, func: Callable, @@ -1248,18 +1355,18 @@ class ReferenceGenerator: Parameters ---------- - path (str): - Path of the router. - func (Callable): - Router endpoint function. - examples (Optional[List[Example]]): - List of Examples (APIEx or PythonEx type) - for the endpoint. + path : str + Path of the router. + func : Callable + Router endpoint function. + examples : Optional[List[Example]] + List of Examples (APIEx or PythonEx type) + for the endpoint. Returns ------- - str: - Formatted string containing the examples for the endpoint. + str: + Formatted string containing the examples for the endpoint. """ sig = signature(func) parameter_map = dict(sig.parameters) @@ -1278,18 +1385,18 @@ class ReferenceGenerator: ) @classmethod - def get_provider_parameter_info(cls, model: str) -> Dict[str, str]: + def _get_provider_parameter_info(cls, model: str) -> Dict[str, str]: """Get the name, type, description, default value and optionality information for the provider parameter. Parameters ---------- - model (str): - Standard model to access the model providers. + model : str + Standard model to access the model providers. Returns ------- - Dict[str, str]: - Dictionary of the provider parameter information + Dict[str, str] + Dictionary of the provider parameter information """ pi_model_provider = cls.pi.model_providers[model] provider_params_field = pi_model_provider.__dataclass_fields__["provider"] @@ -1316,7 +1423,7 @@ class ReferenceGenerator: return provider_parameter_info @classmethod - def get_provider_field_params( + def _get_provider_field_params( cls, model: str, params_type: str, @@ -1326,22 +1433,22 @@ class ReferenceGenerator: Parameters ---------- - model (str): - Model name to access the provider interface - params_type (str): - Parameters to fetch data for (QueryParams or Data) - provider (str, optional): - Provider name. Defaults to "openbb". + model : str + Model name to access the provider interface + params_type : str + Parameters to fetch data for (QueryParams or Data) + provider : str + Provider name. Defaults to "openbb". Returns ------- - List[Dict[str, str]]: - List of dictionaries containing the field name, type, description, default, - optional flag and standard flag for each provider. + List[Dict[str, str]] + List of dictionaries containing the field name, type, description, default, + optional flag and standard flag for each provider. """ provider_field_params = [] expanded_types = MethodDefinition.TYPE_EXPANSION - model_map = cls.pi._map[model] # pylint: disable=protected-access + model_map = cls.pi.map[model] for field, field_info in model_map[provider][params_type]["fields"].items(): # Determine the field type, expanding it if necessary and if params_type is "Parameters" @@ -1391,24 +1498,24 @@ class ReferenceGenerator: return provider_field_params @staticmethod - def get_obbject_returns_fields( + def _get_obbject_returns_fields( model: str, providers: str, ) -> List[Dict[str, str]]: """Get the fields of the OBBject returns object for the given standard_model. - Args - ---- - model (str): - Standard model of the returned object. - providers (str): - Available providers for the model. + Parameters + ---------- + model : str + Standard model of the returned object. + providers : str + Available providers for the model. Returns ------- - List[Dict[str, str]]: - List of dictionaries containing the field name, type, description, default - and optionality of each field. + List[Dict[str, str]] + List of dictionaries containing the field name, type, description, default + and optionality of each field. """ obbject_list = [ { @@ -1441,21 +1548,21 @@ class ReferenceGenerator: return obbject_list @staticmethod - def get_post_method_parameters_info( + def _get_post_method_parameters_info( docstring: str, ) -> List[Dict[str, Union[bool, str]]]: """Get the parameters for the POST method endpoints. Parameters ---------- - docstring (str): - Router endpoint function's docstring + docstring : str + Router endpoint function's docstring Returns ------- - List[Dict[str, str]]: - List of dictionaries containing the name,type, description, default - and optionality of each parameter. + List[Dict[str, str]] + List of dictionaries containing the name,type, description, default + and optionality of each parameter. """ parameters_list = [] @@ -1497,19 +1604,19 @@ class ReferenceGenerator: return parameters_list @staticmethod - def get_post_method_returns_info(docstring: str) -> List[Dict[str, str]]: + def _get_post_method_returns_info(docstring: str) -> List[Dict[str, str]]: """Get the returns information for the POST method endpoints. Parameters ---------- - docstring (str): - Router endpoint function's docstring + docstring: str + Router endpoint function's docstring Returns ------- - List[Dict[str, str]]: - Single element list having a dictionary containing the name, type, - description of the return value + List[Dict[str, str]] + Single element list having a dictionary containing the name, type, + description of the return value """ returns_list = [] @@ -1538,8 +1645,8 @@ class ReferenceGenerator: return returns_list @classmethod - def get_reference_data(cls) -> Dict[str, Dict[str, Any]]: - """Get the reference data for the Platform. + def get_paths(cls, route_map: Dict[str, BaseRoute]) -> Dict[str, Dict[str, Any]]: + """Get path reference data. The reference data is a dictionary containing the description, parameters, returns and examples for each endpoint. This is currently useful for @@ -1547,12 +1654,11 @@ class ReferenceGenerator: Returns ------- - Dict[str, Dict[str, Any]]: - Dictionary containing the description, parameters, returns and - examples for each endpoint. + Dict[str, Dict[str, Any]] + Dictionary containing the description, parameters, returns and + examples for each endpoint. """ reference: Dict[str, Dict] = {} - route_map = PathHandler.build_route_map() for path, route in route_map.items(): # Initialize the reference fields as empty dictionaries @@ -1574,7 +1680,7 @@ class ReferenceGenerator: } # Add endpoint examples examples = openapi_extra.get("examples", []) - reference[path]["examples"] = cls.get_endpoint_examples( + reference[path]["examples"] = cls._get_endpoint_examples( path, route_func, examples, # type: ignore @@ -1584,19 +1690,21 @@ class ReferenceGenerator: reference[path]["description"] = getattr( route, "description", "No description available." ) + + # TODO: The reference is not getting populated when a command does not use a standard model # Access model map from the ProviderInterface - model_map = cls.pi._map[ - standard_model - ] # pylint: disable=protected-access + model_map = cls.pi.map.get(standard_model, {}) for provider in model_map: if provider == "openbb": # openbb provider is always present hence its the standard field reference[path]["parameters"]["standard"] = ( - cls.get_provider_field_params(standard_model, "QueryParams") + cls._get_provider_field_params( + standard_model, "QueryParams" + ) ) # Add `provider` parameter fields to the openbb provider - provider_parameter_fields = cls.get_provider_parameter_info( + provider_parameter_fields = cls._get_provider_parameter_info( standard_model ) reference[path]["parameters"]["standard"].append( @@ -1605,23 +1713,23 @@ class ReferenceGenerator: # Add endpoint data fields for standard provider reference[path]["data"]["standard"] = ( - cls.get_provider_field_params(standard_model, "Data") + cls._get_provider_field_params(standard_model, "Data") ) continue # Adds provider specific parameter fields to the reference reference[path]["parameters"][provider] = ( - cls.get_provider_field_params( + cls._get_provider_field_params( standard_model, "QueryParams", provider ) ) # Adds provider specific data fields to the reference - reference[path]["data"][provider] = cls.get_provider_field_params( + reference[path]["data"][provider] = cls._get_provider_field_params( standard_model, "Data", provider ) # Add endpoint returns data # Currently only OBBject object is returned providers = provider_parameter_fields["type"] - reference[path]["returns"]["OBBject"] = cls.get_obbject_returns_fields( + reference[path]["returns"]["OBBject"] = cls._get_obbject_returns_fields( standard_model, providers ) # Add data for the endpoints without a standard model (data processing endpoints) @@ -1635,12 +1743,43 @@ class ReferenceGenerator: reference[path]["description"] = re.sub(" +", " ", description) # Add endpoint parameters fields for POST methods reference[path]["parameters"]["standard"] = ( - ReferenceGenerator.get_post_method_parameters_info(docstring) + cls._get_post_method_parameters_info(docstring) ) # Add endpoint returns data # Currently only OBBject object is returned reference[path]["returns"]["OBBject"] = ( - cls.get_post_method_returns_info(docstring) + cls._get_post_method_returns_info(docstring) ) return reference + + @classmethod + def get_routers(cls, route_map: Dict[str, BaseRoute]) -> Dict[str, Dict[str, Any]]: + """Get router reference data. + + Parameters + ---------- + route_map : Dict[str, BaseRoute] + Dictionary containing the path and route object for the router. + + Returns + ------- + Dict[str, Dict[str, Any]] + Dictionary containing the description for each router. + """ + main_router = RouterLoader.from_extensions() + routers = {} + for path in route_map: + path_parts = path.split("/") + # We start at 2: ["/", "some_router"] "/some_router" + i = 2 + p = "/".join(path_parts[:i]) + while p != path: + if p not in routers: + description = main_router.get_attr(p, "description") + if description is not None: + routers[p] = {"description": description} + # We go down the path to include sub-routers + i += 1 + p = "/".join(path_parts[:i]) + return routers diff --git a/openbb_platform/core/openbb_core/app/static/utils/decorators.py b/openbb_platform/core/openbb_core/app/static/utils/decorators.py index 61d9b46578b..a8fbf1f0d59 100644 --- a/openbb_platform/core/openbb_core/app/static/utils/decorators.py +++ b/openbb_platform/core/openbb_core/app/static/utils/decorators.py @@ -29,7 +29,7 @@ def validate( """Validate function calls.""" def decorated(f: Callable[P, R]): - """Decorated function.""" + """Use for decorating functions.""" @wraps(f) def wrapper(*f_args, **f_kwargs): diff --git a/openbb_platform/core/openbb_core/app/static/utils/filters.py b/openbb_platform/core/openbb_core/app/static/utils/filters.py index 32a92138586..b2262a1e8c8 100644 --- a/openbb_platform/core/openbb_core/app/static/utils/filters.py +++ b/openbb_platform/core/openbb_core/app/static/utils/filters.py @@ -42,5 +42,16 @@ def filter_inputs( kwargs[p][field] = new break + else: + provider = kwargs.get("provider_choices", {}).get("provider") + for param_category in ("standard_params", "extra_params"): + if param_category in kwargs: + for field, value in kwargs[param_category].items(): + if isinstance(value, list): + kwargs[param_category][field] = ",".join(map(str, value)) + check_single_item( + kwargs[param_category][field], + f"{field} -> multiple items not allowed for '{provider}'", + ) return kwargs diff --git a/openbb_platform/core/openbb_core/app/utils.py b/openbb_platform/core/openbb_core/app/utils.py index f7c6c1ca7dc..452300c4334 100644 --- a/openbb_platform/core/openbb_core/app/utils.py +++ b/openbb_platform/core/openbb_core/app/utils.py @@ -166,6 +166,6 @@ def check_single_item( value: Optional[str], message: Optional[str] = None ) -> Optional[str]: """Check that string contains a single item.""" - if value and ("," in value or ";" in value): + if value and isinstance(value, str) and ("," in value or ";" in value): raise OpenBBError(message if message else "multiple items not allowed") return value diff --git a/openbb_platform/core/openbb_core/app/version.py b/openbb_platform/core/openbb_core/app/version.py index a022eb1c790..39872d98a1c 100644 --- a/openbb_platform/core/openbb_core/app/version.py +++ b/openbb_platform/core/openbb_core/app/version.py @@ -58,3 +58,8 @@ try: VERSION = get_package_version(PACKAGE) except pkg_resources.DistributionNotFound: VERSION = "unknown" + +try: + CORE_VERSION = get_package_version("openbb-core") +except pkg_resources.DistributionNotFound: + CORE_VERSION = "unknown" diff --git a/openbb_platform/core/openbb_core/env.py b/openbb_platform/core/openbb_core/env.py index e4e4c1df461..9249658ffbc 100644 --- a/openbb_platform/core/openbb_core/env.py +++ b/openbb_platform/core/openbb_core/env.py @@ -1,3 +1,5 @@ +"""Environment variables.""" + import os from pathlib import Path from typing import Dict, Optional @@ -14,47 +16,48 @@ class Env(metaclass=SingletonMeta): _environ: Dict[str, str] def __init__(self) -> None: + """Initialize the environment.""" dotenv.load_dotenv(Path(OPENBB_DIRECTORY, ".env")) self._environ = os.environ.copy() @property def API_AUTH(self) -> bool: - """API authentication: enables API endpoint authentication""" + """API authentication: enables API endpoint authentication.""" return self.str2bool(self._environ.get("OPENBB_API_AUTH", False)) @property def API_USERNAME(self) -> Optional[str]: - """API username: sets API username""" + """API username: sets API username.""" return self._environ.get("OPENBB_API_USERNAME", None) @property def API_PASSWORD(self) -> Optional[str]: - """API password: sets API password""" + """API password: sets API password.""" return self._environ.get("OPENBB_API_PASSWORD", None) @property def API_AUTH_EXTENSION(self) -> Optional[str]: - """Auth extension: specifies which authentication extension to use""" + """Auth extension: specifies which authentication extension to use.""" return self._environ.get("OPENBB_API_AUTH_EXTENSION", None) @property def AUTO_BUILD(self) -> bool: - """Automatic build: enables automatic package build on import""" + """Automatic build: enables automatic package build on import.""" return self.str2bool(self._environ.get("OPENBB_AUTO_BUILD", True)) @property def DEBUG_MODE(self) -> bool: - """Debug mode: enables debug mode""" + """Debug mode: enables debug mode.""" return self.str2bool(self._environ.get("OPENBB_DEBUG_MODE", False)) @property def DEV_MODE(self) -> bool: - """Dev mode: enables development mode""" + """Dev mode: enables development mode.""" return self.str2bool(self._environ.get("OPENBB_DEV_MODE", False)) @property def HUB_BACKEND(self) -> str: - """Hub backend: sets the backend for the OpenBB Hub""" + """Hub backend: sets the backend for the OpenBB Hub.""" return self._environ.get("OPENBB_HUB_BACKEND", "https://payments.openbb.co") @staticmethod diff --git a/openbb_platform/core/openbb_core/provider/abstract/annotated_result.py b/openbb_platform/core/openbb_core/provider/abstract/annotated_result.py new file mode 100644 index 00000000000..8d51086017b --- /dev/null +++ b/openbb_platform/core/openbb_core/provider/abstract/annotated_result.py @@ -0,0 +1,20 @@ +"""Annotated result.""" + +from typing import Generic, Optional, TypeVar + +from pydantic import BaseModel, Field + +T = TypeVar("T") + + +class AnnotatedResult(BaseModel, Generic[T]): + """Annotated result allows fetchers to return metadata along with the data.""" + + result: Optional[T] = Field( + default=None, + description="Serializable results.", + ) + metadata: Optional[dict] = Field( + default=None, + description="Metadata.", + ) diff --git a/openbb_platform/core/openbb_core/provider/abstract/fetcher.py b/openbb_platform/core/openbb_core/provider/abstract/fetcher.py index 011f03f197b..f2cc759821a 100644 --- a/openbb_platform/core/openbb_core/provider/abstract/fetcher.py +++ b/openbb_platform/core/openbb_core/provider/abstract/fetcher.py @@ -9,12 +9,14 @@ from typing import ( Generic, Optional, TypeVar, + Union, get_args, get_origin, ) from pandas import DataFrame +from openbb_core.provider.abstract.annotated_result import AnnotatedResult from openbb_core.provider.abstract.data import Data from openbb_core.provider.abstract.query_params import QueryParams from openbb_core.provider.utils.helpers import maybe_coroutine, run_async @@ -56,7 +58,7 @@ class Fetcher(Generic[Q, R]): """Extract the data from the provider.""" @staticmethod - def transform_data(query: Q, data: Any, **kwargs) -> R: + def transform_data(query: Q, data: Any, **kwargs) -> Union[R, AnnotatedResult[R]]: """Transform the provider-specific data.""" raise NotImplementedError @@ -79,7 +81,7 @@ class Fetcher(Generic[Q, R]): params: Dict[str, Any], credentials: Optional[Dict[str, str]] = None, **kwargs, - ) -> R: + ) -> Union[R, AnnotatedResult[R]]: """Fetch data from a provider.""" query = cls.transform_query(params=params) data = await maybe_coroutine( @@ -139,7 +141,7 @@ class Fetcher(Generic[Q, R]): data = run_async( cls.extract_data, query=query, credentials=credentials, **kwargs ) - transformed_data = cls.transform_data(query=query, data=data, **kwargs) + result = cls.transform_data(query=query, data=data, **kwargs) # Class Assertions assert isinstance( @@ -184,10 +186,13 @@ class Fetcher(Generic[Q, R]): assert len(data) > 0, "Data must not be empty." # Transformed Data Assertions + transformed_data = ( + result.result if isinstance(result, AnnotatedResult) else result + ) + assert transformed_data, "Transformed data must not be None." - is_list = isinstance(transformed_data, list) - if is_list: + if isinstance(transformed_data, list): return_type_args = cls.return_type.__args__[0] return_type_is_dict = ( hasattr(return_type_args, "__origin__") diff --git a/openbb_platform/core/openbb_core/provider/registry_map.py b/openbb_platform/core/openbb_core/provider/registry_map.py index eb4573a0efb..05dff9ef4f6 100644 --- a/openbb_platform/core/openbb_core/provider/registry_map.py +++ b/openbb_platform/core/openbb_core/provider/registry_map.py @@ -1,12 +1,11 @@ """Provider registry map.""" -import sys from copy import deepcopy from inspect import getfile, isclass from pathlib import Path from typing import Any, Dict, List, Literal, Optional, Tuple, get_origin -from pydantic import BaseModel, Field, create_model +from pydantic import BaseModel from openbb_core.provider.abstract.data import Data from openbb_core.provider.abstract.fetcher import Fetcher @@ -27,8 +26,8 @@ class RegistryMap: self._registry = registry or RegistryLoader.from_extensions() self._credentials = self._get_credentials(self._registry) self._available_providers = self._get_available_providers(self._registry) - self._map, self._return_map = self._get_map(self._registry) - self._models = self._get_models(self._map) + self._standard_extra, self._original_models = self._get_maps(self._registry) + self._models = self._get_models(self._standard_extra) @property def registry(self) -> Registry: @@ -46,14 +45,14 @@ class RegistryMap: return self._credentials @property - def map(self) -> MapType: - """Get provider registry map.""" - return self._map + def standard_extra(self) -> MapType: + """Get standard extra map.""" + return self._standard_extra @property - def return_map(self) -> MapType: - """Get provider registry return map.""" - return self._return_map + def original_models(self) -> MapType: + """Get original models.""" + return self._original_models @property def models(self) -> List[str]: @@ -72,37 +71,42 @@ class RegistryMap: """Get list of available providers.""" return sorted(list(registry.providers.keys())) - def _get_map(self, registry: Registry) -> Tuple[MapType, Dict[str, Dict]]: + def _get_maps(self, registry: Registry) -> Tuple[MapType, Dict[str, Dict]]: """Generate map for the provider package.""" - map_: MapType = {} - return_schemas: Dict[str, Dict] = {} + standard_extra: MapType = {} + original_models: Dict[str, Dict] = {} for p in registry.providers: for model_name, fetcher in registry.providers[p].fetcher_dict.items(): - standard_query, extra_query = self.extract_info(fetcher, "query_params") - standard_data, extra_data = self.extract_info(fetcher, "data") - if model_name not in map_: - map_[model_name] = {} + standard_query, extra_query = self._extract_info( + fetcher, "query_params" + ) + standard_data, extra_data = self._extract_info(fetcher, "data") + if model_name not in standard_extra: + standard_extra[model_name] = {} # The deepcopy avoids modifications from one model to affect another - map_[model_name]["openbb"] = { + standard_extra[model_name]["openbb"] = { "QueryParams": deepcopy(standard_query), "Data": deepcopy(standard_data), } - map_[model_name][p] = { + standard_extra[model_name][p] = { "QueryParams": extra_query, "Data": extra_data, } - if provider_model := self.extract_data_model(fetcher, p): - is_list = get_origin(self.extract_return_type(fetcher)) == list + original_models.setdefault(model_name, {}).update( + { + p: { + "query": self._get_model(fetcher, "query_params"), + "data": self._get_model(fetcher, "data"), + "results_type": self._get_results_type(fetcher), + } + } + ) - return_schemas.setdefault(model_name, {}).update( - {p: {"model": provider_model, "is_list": is_list}} - ) + self._merge_json_schema_extra(p, fetcher, standard_extra[model_name]) - self._merge_json_schema_extra(p, fetcher, map_[model_name]) - - return map_, return_schemas + return standard_extra, original_models def _merge_json_schema_extra( self, @@ -110,7 +114,7 @@ class RegistryMap: fetcher: Fetcher, model_map: dict, ): - """Merge json schema extra for different providers""" + """Merge json schema extra for different providers.""" model: BaseModel = RegistryMap._get_model(fetcher, "query_params") std_fields = model_map["openbb"]["QueryParams"]["fields"] extra_fields = model_map[provider]["QueryParams"]["fields"] @@ -138,49 +142,14 @@ class RegistryMap: return list(map_.keys()) @staticmethod - def extract_return_type(fetcher: Fetcher): + def _get_results_type(fetcher: Fetcher) -> Any: """Extract return info from fetcher.""" - return getattr(fetcher, "return_type", None) + return get_origin(getattr(fetcher, "return_type", None)) @staticmethod - def extract_data_model(fetcher: Fetcher, provider_str: str) -> BaseModel: - """Extract info (fields and docstring) from fetcher query params or data.""" - model: BaseModel = RegistryMap._get_model(fetcher, "data") - model_name = getattr(model, "__name__", "") - fields = {} - for field_name, field in model.model_fields.items(): - field.serialization_alias = field_name - fields[field_name] = (field.annotation, field) - - fields["provider"] = ( - Literal[provider_str], # type: ignore - Field( - default=provider_str, - description="The data provider for the data.", - exclude=True, - ), - ) - - provider_model = create_model( # type: ignore[call-overload] - model_name.replace("Data", ""), - __base__=model, - __doc__=model.__doc__, - __module__=model.__module__, - **fields, - ) - - # Replace the provider models in the modules with the new models we created - # To make sure provider field is defined to be the provider string - # This is hacky, but we need to have `provider: Literal['provider_name']` - # in the model to serve as union discriminator for the API validation - # the alternative would be to specify it manually in all the models - if model_name: - setattr(sys.modules[model.__module__], model_name, provider_model) - - return provider_model - - @staticmethod - def extract_info(fetcher: Fetcher, type_: Literal["query_params", "data"]) -> tuple: + def _extract_info( + fetcher: Fetcher, type_: Literal["query_params", "data"] + ) -> tuple: """Extract info (fields and docstring) from fetcher query params or data.""" model: BaseModel = RegistryMap._get_model(fetcher, type_) all_fields = {} diff --git a/openbb_platform/core/openbb_core/provider/standard_models/etf_holdings.py b/openbb_platform/core/openbb_core/provider/standard_models/etf_holdings.py index 8d1c4a59038..0ad30366cd9 100644 --- a/openbb_platform/core/openbb_core/provider/standard_models/etf_holdings.py +++ b/openbb_platform/core/openbb_core/provider/standard_models/etf_holdings.py @@ -2,7 +2,7 @@ from typing import Optional -from pydantic import Field +from pydantic import Field, field_validator from openbb_core.provider.abstract.data import Data from openbb_core.provider.abstract.query_params import QueryParams @@ -17,6 +17,12 @@ class EtfHoldingsQueryParams(QueryParams): symbol: str = Field(description=QUERY_DESCRIPTIONS.get("symbol", "") + " (ETF)") + @field_validator("symbol") + @classmethod + def to_upper(cls, v: str) -> str: + """Convert field to uppercase.""" + return v.upper() + class EtfHoldingsData(Data): """ETF Holdings Data.""" diff --git a/openbb_platform/core/openbb_core/provider/standard_models/forward_eps_estimates.py b/openbb_platform/core/openbb_core/provider/standard_models/forward_eps_estimates.py new file mode 100644 index 00000000000..e0f95d9c8a1 --- /dev/null +++ b/openbb_platform/core/openbb_core/provider/standard_models/forward_eps_estimates.py @@ -0,0 +1,67 @@ +"""Forward EPS Estimates Standard Model.""" + +from datetime import date as dateType +from typing import Optional + +from pydantic import Field, field_validator + +from openbb_core.provider.abstract.data import Data +from openbb_core.provider.abstract.query_params import QueryParams +from openbb_core.provider.utils.descriptions import ( + DATA_DESCRIPTIONS, + QUERY_DESCRIPTIONS, +) + + +class ForwardEpsEstimatesQueryParams(QueryParams): + """Forward EPS Estimates Query Parameters.""" + + symbol: Optional[str] = Field( + default=None, + description=QUERY_DESCRIPTIONS["symbol"], + ) + + @field_validator("symbol", mode="before", check_fields=False) + @classmethod + def to_upper(cls, v): + """Convert field to uppercase.""" + return v.upper() if v else None + + +class ForwardEpsEstimatesData(Data): + """Forward EPS Estimates Data.""" + + symbol: str = Field(description=DATA_DESCRIPTIONS.get("symbol", "")) + name: Optional[str] = Field(default=None, description="Name of the entity.") + date: dateType = Field(description=DATA_DESCRIPTIONS.get("date", "")) + fiscal_year: Optional[int] = Field( + default=None, description="Fiscal year for the estimate." + ) + fiscal_period: Optional[str] = Field( + default=None, description="Fiscal quarter for the estimate." + ) + calendar_year: Optional[int] = Field( + default=None, description="Calendar year for the estimate." + ) + calendar_period: Optional[str] = Field( + default=None, description="Calendar quarter for the estimate." + ) + low_estimate: Optional[float] = Field( + default=None, description="Estimated EPS low for the period." + ) + high_estimate: Optional[float] = Field( + default=None, description="Estimated EPS high for the period." + ) + mean: Optional[float] = Field( + default=None, description="Estimated EPS mean for the period." + ) + median: Optional[float] = Field( + default=None, description="Estimated EPS median for the period." + ) + standard_deviation: Optional[float] = Field( + default=None, description="Estimated EPS standard deviation for the period." + ) + number_of_analysts: Optional[int] = Field( + default=None, + description="Number of analysts providing estimates for the period.", + ) diff --git a/openbb_platform/core/openbb_core/provider/standard_models/forward_sales_estimates.py b/openbb_platform/core/openbb_core/provider/standard_models/forward_sales_estimates.py new file mode 100644 index 00000000000..8d3e1217d58 --- /dev/null +++ b/openbb_platform/core/openbb_core/provider/standard_models/forward_sales_estimates.py @@ -0,0 +1,68 @@ +"""Forward Sales Estimates Standard Model.""" + +from datetime import date as dateType +from typing import Optional + +from pydantic import Field, field_validator + +from openbb_core.provider.abstract.data import Data, ForceInt +from openbb_core.provider.abstract.query_params import QueryParams +from openbb_core.provider.utils.descriptions import ( + DATA_DESCRIPTIONS, + QUERY_DESCRIPTIONS, +) + + +class ForwardSalesEstimatesQueryParams(QueryParams): + """Forward Sales Estimates Query Parameters.""" + + symbol: Optional[str] = Field( + default=None, + description=QUERY_DESCRIPTIONS["symbol"], + ) + + @field_validator("symbol", mode="before", check_fields=False) + @classmethod + def to_upper(cls, v): + """Convert field to uppercase.""" + return v.upper() if v else None + + +class ForwardSalesEstimatesData(Data): + """Forward Sales Estimates Data.""" + + symbol: str = Field(description=DATA_DESCRIPTIONS.get("symbol", "")) + name: Optional[str] = Field(default=None, description="Name of the entity.") + date: dateType = Field(description=DATA_DESCRIPTIONS.get("date", "")) + fiscal_year: Optional[int] = Field( + default=None, description="Fiscal year for the estimate." + ) + fiscal_period: Optional[str] = Field( + default=None, description="Fiscal quarter for the estimate." + ) + calendar_year: Optional[int] = Field( + default=None, description="Calendar year for the estimate." + ) + calendar_period: Optional[str] = Field( + default=None, description="Calendar quarter for the estimate." + ) + low_estimate: Optional[ForceInt] = Field( + default=None, description="The sales estimate low for the period." + ) + high_estimate: Optional[ForceInt] = Field( + default=None, description="The sales estimate high for the period." + ) + mean: Optional[ForceInt] = Field( + default=None, description="The sales estimate mean for the period." + ) + median: Optional[ForceInt] = Field( + default=None, description="The sales estimate median for the period." + ) + standard_deviation: Optional[ForceInt] = Field( + default=None, + description="The sales estimate standard deviation for the period.", + ) + number_of_analysts: Optional[int] = Field( + default=None, + description="Number of analysts providing estimates for the period.", + ) diff --git a/openbb_platform/core/openbb_core/provider/standard_models/options_chains.py b/openbb_platform/core/openbb_core/provider/standard_models/options_chains.py index ddde23dc45c..231945419ed 100644 --- a/openbb_platform/core/openbb_core/provider/standard_models/options_chains.py +++ b/openbb_platform/core/openbb_core/provider/standard_models/options_chains.py @@ -24,6 +24,7 @@ class OptionsChainsQueryParams(QueryParams): @classmethod @field_validator("symbol", mode="before", check_fields=False) def to_upper(cls, v: str) -> str: + """Return the symbol in uppercase.""" return v.upper() @@ -151,7 +152,7 @@ class OptionsChainsData(Data): @field_validator("expiration", mode="before", check_fields=False) @classmethod def date_validate(cls, v): # pylint: disable=E0213 - """Return the datetime object from the date string""" + """Return the datetime object from the date string.""" if isinstance(v, datetime): return datetime.strftime(v, "%Y-%m-%d") if isinstance(v, str): diff --git a/openbb_platform/core/openbb_core/provider/standard_models/price_target_consensus.py b/openbb_platform/core/openbb_core/provider/standard_models/price_target_consensus.py index f6949cb166a..106879a884f 100644 --- a/openbb_platform/core/openbb_core/provider/standard_models/price_target_consensus.py +++ b/openbb_platform/core/openbb_core/provider/standard_models/price_target_consensus.py @@ -15,19 +15,22 @@ from openbb_core.provider.utils.descriptions import ( class PriceTargetConsensusQueryParams(QueryParams): """Price Target Consensus Query.""" - symbol: str = Field(description=QUERY_DESCRIPTIONS.get("symbol", "")) + symbol: Optional[str] = Field( + default=None, description=QUERY_DESCRIPTIONS.get("symbol", "") + ) @field_validator("symbol", mode="before", check_fields=False) @classmethod - def to_upper(cls, v: str) -> str: + def to_upper(cls, v): """Convert field to uppercase.""" - return v.upper() + return v.upper() if v else None class PriceTargetConsensusData(Data): """Price Target Consensus Data.""" symbol: str = Field(description=DATA_DESCRIPTIONS.get("symbol", "")) + name: Optional[str] = Field(default=None, description="The company name") target_high: Optional[float] = Field( default=None, description="High target of the price target consensus." ) diff --git a/openbb_platform/core/openbb_core/provider/utils/client.py b/openbb_platform/core/openbb_core/provider/utils/client.py index 0bec922d9ac..f093a90d4b1 100644 --- a/openbb_platform/core/openbb_core/provider/utils/client.py +++ b/openbb_platform/core/openbb_core/provider/utils/client.py @@ -41,6 +41,7 @@ class ClientResponse(aiohttp.ClientResponse): """Client response class.""" def __init__(self, *args, **kwargs): + """Initialize the response.""" kwargs["request_info"] = self.obfuscate_request_info(kwargs["request_info"]) super().__init__(*args, **kwargs) @@ -61,10 +62,13 @@ class ClientResponse(aiohttp.ClientResponse): class ClientSession(aiohttp.ClientSession): + """Client session.""" + _response_class: Type[ClientResponse] _session: "ClientSession" def __init__(self, *args, **kwargs): + """Initialize the session.""" kwargs["connector"] = kwargs.get( "connector", aiohttp.TCPConnector(ttl_dns_cache=300) ) diff --git a/openbb_platform/core/openbb_core/provider/utils/helpers.py b/openbb_platform/core/openbb_core/provider/utils/helpers.py index 3a5c557341f..604323e9703 100644 --- a/openbb_platform/core/openbb_core/provider/utils/helpers.py +++ b/openbb_platform/core/openbb_core/provider/utils/helpers.py @@ -1,8 +1,9 @@ """Provider helpers.""" import asyncio +import os import re -from datetime import date, datetime +from datetime import date, datetime, timedelta, timezone from difflib import SequenceMatcher from functools import partial from inspect import iscoroutinefunction @@ -313,3 +314,12 @@ def filter_by_dates( return False return list(filter(_filter, data)) + + +def safe_fromtimestamp( + timestamp: Union[float, int], tz: Optional[timezone] = None +) -> datetime: + """datetime.fromtimestamp alternative which supports negative timestamps on Windows platform.""" + if os.name == "nt" and timestamp < 0: + return datetime(1970, 1, 1, tzinfo=tz) + timedelta(seconds=timestamp) + return datetime.fromtimestamp(timestamp, tz) diff --git a/openbb_platform/core/pyproject.toml b/openbb_platform/core/pyproject.toml index 623a8fd1c34..e82caac0f43 100644 --- a/openbb_platform/core/pyproject.toml +++ b/openbb_platform/core/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" authors = ["OpenBB Team "] readme = "README.md" diff --git a/openbb_platform/core/tests/api/test_dependency/__init__.py b/openbb_platform/core/tests/api/test_dependency/__init__.py index e69de29bb2d..55cb40ff9e8 100644 --- a/openbb_platform/core/tests/api/test_dependency/__init__.py +++ b/openbb_platform/core/tests/api/test_dependency/__init__.py @@ -0,0 +1 @@ +"""OpenBB Platform Core tests.""" diff --git a/openbb_platform/core/tests/api/test_router/__init__.py b/openbb_platform/core/tests/api/test_router/__init__.py index e69de29bb2d..21bb0e0cc06 100644 --- a/openbb_platform/core/tests/api/test_router/__init__.py +++ b/openbb_platform/core/tests/api/test_router/__init__.py @@ -0,0 +1 @@ +"""OpenBB Platform Core API router tests.""" diff --git a/openbb_platform/core/tests/app/__init__.py b/openbb_platform/core/tests/app/__init__.py index e69de29bb2d..3f4c8aabdda 100644 --- a/openbb_platform/core/tests/app/__init__.py +++ b/openbb_platform/core/tests/app/__init__.py @@ -0,0 +1 @@ +"""OpenBB Platform core tests.""" diff --git a/openbb_platform/core/tests/app/logs/__init__.py b/openbb_platform/core/tests/app/logs/__init__.py index e69de29bb2d..673bc2dec2f 100644 --- a/openbb_platform/core/tests/app/logs/__init__.py +++ b/openbb_platform/core/tests/app/logs/__init__.py @@ -0,0 +1 @@ +"""OpenBB Platform Core.""" diff --git a/openbb_platform/core/tests/app/logs/formatters/__init__.py b/openbb_platform/core/tests/app/logs/formatters/__init__.py index e69de29bb2d..3f4c8aabdda 100644 --- a/openbb_platform/core/tests/app/logs/formatters/__init__.py +++ b/openbb_platform/core/tests/app/logs/formatters/__init__.py @@ -0,0 +1 @@ +"""OpenBB Platform core tests.""" diff --git a/openbb_platform/core/tests/app/logs/formatters/test_formatter_with_exceptions.py b/openbb_platform/core/tests/app/logs/formatters/test_formatter_with_exceptions.py index 90a2cae1b37..625c0bc87cc 100644 --- a/openbb_platform/core/tests/app/logs/formatters/test_formatter_with_exceptions.py +++ b/openbb_platform/core/tests/app/logs/formatters/test_formatter_with_exceptions.py @@ -1,3 +1,5 @@ +"""Tests for the FormatterWithExceptions class.""" + import logging import os from unittest.mock import Mock @@ -7,6 +9,8 @@ from openbb_core.app.logs.formatters.formatter_with_exceptions import ( FormatterWithExceptions, ) +# pylint: disable=W0621 + logging_settings = Mock() logging_settings.app_name = "test_app_name" logging_settings.app_id = "test_app_id" @@ -16,11 +20,13 @@ logging_settings.user_id = "test_user_id" @pytest.fixture def formatter(): + """Return a FormatterWithExceptions instance.""" return FormatterWithExceptions(logging_settings) # Test when exc_text is not empty (should return "X") def test_level_name_with_exc_text(formatter): + """Test the calculate_level_name method.""" record = logging.LogRecord( name="test_logger", level=logging.INFO, @@ -37,6 +43,7 @@ def test_level_name_with_exc_text(formatter): # Test when levelname is not empty (should return the first character of levelname) def test_level_name_with_levelname(formatter): + """Test the calculate_level_name method.""" record = logging.LogRecord( name="test_logger", level=logging.WARNING, @@ -53,6 +60,7 @@ def test_level_name_with_levelname(formatter): # Test when func_name_override and session_id are present in the record def test_extract_log_extra_with_override_and_session_id(formatter): + """Test the extract_log_extra method.""" record = logging.LogRecord( name="test_logger", level=logging.INFO, @@ -75,6 +83,7 @@ def test_extract_log_extra_with_override_and_session_id(formatter): # Test when only func_name_override is present in the record def test_extract_log_extra_with_override(formatter): + """Test the extract_log_extra method.""" record = logging.LogRecord( name="test_logger", level=logging.INFO, @@ -96,6 +105,7 @@ def test_extract_log_extra_with_override(formatter): # Test when only session_id is present in the record def test_extract_log_extra_with_session_id(formatter): + """Test the extract_log_extra method.""" record = logging.LogRecord( name="test_logger", level=logging.INFO, @@ -117,6 +127,7 @@ def test_extract_log_extra_with_session_id(formatter): # Test when neither func_name_override nor session_id are present in the record def test_extract_log_extra_with_no_override_or_session_id(formatter): + """Test the extract_log_extra method.""" record = logging.LogRecord( name="test_logger", level=logging.INFO, @@ -144,6 +155,7 @@ def test_extract_log_extra_with_no_override_or_session_id(formatter): ], ) def test_mock_ipv4(input_text, expected_output, formatter): + """Test the mock_ipv4 method.""" assert formatter.mock_ipv4(input_text) == expected_output @@ -158,6 +170,7 @@ def test_mock_ipv4(input_text, expected_output, formatter): ], ) def test_mock_email(input_text, expected_output, formatter): + """Test the mock_email method.""" assert formatter.mock_email(input_text) == expected_output @@ -175,6 +188,7 @@ def test_mock_email(input_text, expected_output, formatter): ], ) def test_mock_password(input_text, expected_output, formatter): + """Test the mock_password method.""" assert formatter.mock_password(input_text) == expected_output @@ -190,6 +204,7 @@ def test_mock_password(input_text, expected_output, formatter): ], ) def test_mock_flair(input_text, expected_output, formatter): + """Test the mock_flair method.""" assert formatter.mock_flair(input_text) == expected_output @@ -212,6 +227,7 @@ def test_mock_flair(input_text, expected_output, formatter): ], ) def test_mock_home_directory(input_text, expected_output, formatter): + """Test the mock_home_directory method.""" assert formatter.mock_home_directory(input_text) == expected_output @@ -232,6 +248,7 @@ def test_mock_home_directory(input_text, expected_output, formatter): ], ) def test_filter_special_tags(input_text, expected_output, formatter): + """Test the filter_special_tags method.""" assert formatter.filter_special_tags(input_text) == expected_output @@ -249,6 +266,7 @@ def test_filter_special_tags(input_text, expected_output, formatter): ], ) def test_filter_piis(input_text, expected_output, formatter): + """Test the filter_piis method.""" assert formatter.filter_piis(input_text) == expected_output @@ -267,15 +285,18 @@ def test_filter_piis(input_text, expected_output, formatter): ], ) def test_filter_log_line(input_text, expected_output, formatter): + """Test the filter_log_line method.""" assert formatter.filter_log_line(input_text) == expected_output def test_formatException_invalid(): + """Test the formatException method with an invalid exception.""" with pytest.raises(Exception): formatter.formatException(Exception("Big bad error")) # type: ignore[attr-defined] def test_format(formatter): + """Test the format method.""" # Prepare the log record log_record = logging.LogRecord( name="test_logger", diff --git a/openbb_platform/core/tests/app/logs/handlers/__init__.py b/openbb_platform/core/tests/app/logs/handlers/__init__.py index e69de29bb2d..55cb40ff9e8 100644 --- a/openbb_platform/core/tests/app/logs/handlers/__init__.py +++ b/openbb_platform/core/tests/app/logs/handlers/__init__.py @@ -0,0 +1 @@ +"""OpenBB Platform Core tests.""" diff --git a/openbb_platform/core/tests/app/logs/handlers/test_path_tracking_file_handler.py b/openbb_platform/core/tests/app/logs/handlers/test_path_tracking_file_handler.py index 40dae4a702f..ba81d15e1ab 100644 --- a/openbb_platform/core/tests/app/logs/handlers/test_path_tracking_file_handler.py +++ b/openbb_platform/core/tests/app/logs/handlers/test_path_tracking_file_handler.py @@ -12,7 +12,10 @@ from openbb_core.app.logs.handlers.path_tracking_file_handler import ( class MockLoggingSettings: + """Mock logging settings.""" + def __init__(self, app_name, user_logs_directory, session_id, frequency): + """Initialize the mock logging settings.""" self.app_name = app_name self.user_logs_directory = Path(user_logs_directory) self.session_id = session_id @@ -31,17 +34,20 @@ logging_settings.frequency = "H" @pytest.fixture(scope="module") def mocked_path(tmp_path_factory): + """Fixture to create a mocked file path.""" return tmp_path_factory.mktemp("mocked_path") / "mocked_file.log" @pytest.fixture(scope="module") def handler(mocked_path): + """Fixture to create a PathTrackingFileHandler instance.""" # patch `pathlib.Path.joinpath` to return a string containing the joined path with patch.object(Path, "joinpath", return_value=mocked_path): return PathTrackingFileHandler(logging_settings) def test_build_log_file_path(handler, mocked_path): + """Test build_log_file_path method.""" # Define a sample LoggingSettings object with mock attributes settings = MagicMock(spec=MockLoggingSettings) settings.app_name = "my_app" @@ -60,6 +66,7 @@ def test_build_log_file_path(handler, mocked_path): def test_clean_expired_files(handler): + """Test clean_expired_files method.""" with patch( "openbb_core.app.logs.handlers.path_tracking_file_handler.get_expired_file_list" ) as mock_get_expired_file_list, patch( diff --git a/openbb_platform/core/tests/app/logs/handlers/test_posthog_handler.py b/openbb_platform/core/tests/app/logs/handlers/test_posthog_handler.py index 5038f3ec016..5e795a4bf5f 100644 --- a/openbb_platform/core/tests/app/logs/handlers/test_posthog_handler.py +++ b/openbb_platform/core/tests/app/logs/handlers/test_posthog_handler.py @@ -1,3 +1,5 @@ +"""Tests for the PosthogHandler class.""" + import logging from pathlib import Path from unittest.mock import MagicMock @@ -8,7 +10,10 @@ from openbb_core.app.logs.handlers.posthog_handler import ( ) +# pylint: disable=W0621, R0913 class MockLoggingSettings: + """Mock logging settings.""" + def __init__( self, app_name, @@ -22,6 +27,7 @@ class MockLoggingSettings: platform_version, userid, ): + """Initialize the mock logging settings.""" self.app_name = app_name self.sub_app_name = sub_app_name self.user_logs_directory = Path(user_logs_directory) @@ -52,10 +58,12 @@ logging_settings.user_id = "user123" @pytest.fixture def handler(): + """Fixture to create a PosthogHandler instance.""" return PosthogHandler(logging_settings) def test_emit_calls_send(handler): + """Test the emit method.""" # Arrange record = logging.LogRecord( name="test_logger", @@ -78,6 +86,7 @@ def test_emit_calls_send(handler): def test_emit_calls_handleError_when_send_raises_exception(handler): + """Test the emit method.""" # Arrange record = logging.LogRecord( name="test_logger", @@ -104,6 +113,7 @@ def test_emit_calls_handleError_when_send_raises_exception(handler): def test_emit_calls_handleError_when_send_raises_exception_of_specific_type(handler): + """Test the emit method.""" # Arrange record = logging.LogRecord( name="test_logger", @@ -130,6 +140,7 @@ def test_emit_calls_handleError_when_send_raises_exception_of_specific_type(hand def test_emit_calls_handleError_when_send_raises_exception_of_another_type(handler): + """Test the emit method.""" # Arrange record = logging.LogRecord( name="test_logger", @@ -176,6 +187,7 @@ def test_emit_calls_handleError_when_send_raises_exception_of_another_type(handl ], ) def test_log_to_dict(handler, log_info, expected_dict): + """Test the log_to_dict method.""" # Act result = handler.log_to_dict(log_info) @@ -204,6 +216,7 @@ def test_log_to_dict(handler, log_info, expected_dict): ], ) def test_extract_log_extra(handler, record, expected_extra): + """Test the extract_log_extra method.""" # Act result = handler.extract_log_extra(record) diff --git a/openbb_platform/core/tests/app/logs/test_handlers_manager.py b/openbb_platform/core/tests/app/logs/test_handlers_manager.py index 43c23214e88..d46451c6314 100644 --- a/openbb_platform/core/tests/app/logs/test_handlers_manager.py +++ b/openbb_platform/core/tests/app/logs/test_handlers_manager.py @@ -1,3 +1,5 @@ +"""Tests for the handlers manager.""" + import logging from unittest.mock import Mock, patch @@ -7,25 +9,37 @@ from openbb_core.app.logs.handlers_manager import ( PosthogHandler, ) +# pylint: disable=W0231 + class MockPosthogHandler(logging.NullHandler): + """Mock posthog handler.""" + def __init__(self, settings): + """Initialize the handler.""" self.settings = settings self.level = logging.DEBUG class MockPathTrackingFileHandler(logging.NullHandler): + """Mock path tracking file handler.""" + def __init__(self, settings): + """Initialize the handler.""" self.settings = settings self.level = logging.DEBUG class MockFormatterWithExceptions(logging.Formatter): + """Mock formatter with exceptions.""" + def __init__(self, settings): + """Initialize the formatter.""" self.settings = settings def test_handlers_added_correctly(): + """Test if the handlers are added correctly.""" with patch( "openbb_core.app.logs.handlers_manager.PosthogHandler", MockPosthogHandler, @@ -60,6 +74,7 @@ def test_handlers_added_correctly(): def test_update_handlers(): + """Test if the handlers are updated correctly.""" with patch( "openbb_core.app.logs.handlers_manager.PosthogHandler", MockPosthogHandler, diff --git a/openbb_platform/core/tests/app/logs/test_logging_service.py b/openbb_platform/core/tests/app/logs/test_logging_service.py index 316b603588c..8eef4b90137 100644 --- a/openbb_platform/core/tests/app/logs/test_logging_service.py +++ b/openbb_platform/core/tests/app/logs/test_logging_service.py @@ -1,3 +1,5 @@ +"""Test LoggingService class.""" + import json from typing import Optional from unittest.mock import MagicMock, Mock, patch @@ -12,18 +14,24 @@ from pydantic import BaseModel class MockLoggingSettings: + """Mock logging settings.""" + def __init__(self, system_settings, user_settings): + """Initialize the mock logging settings.""" self.system_settings = system_settings self.user_settings = user_settings class MockOBBject(BaseModel): + """Mock object for testing.""" + output: Optional[str] = None error: Optional[str] = None @pytest.fixture(scope="function") def logging_service(): + """Return a LoggingService instance.""" mock_system_settings = Mock() mock_user_settings = Mock() mock_setup_handlers = Mock() @@ -48,6 +56,7 @@ def logging_service(): def test_correctly_initialized(): + """Test the LoggingService is correctly initialized.""" mock_system_settings = Mock() mock_user_settings = Mock() mock_setup_handlers = Mock() @@ -73,6 +82,7 @@ def test_correctly_initialized(): def test_logging_settings_setter(logging_service): + """Test the logging_settings setter.""" custom_user_settings = "custom_user_settings" custom_system_settings = "custom_system_settings" @@ -90,6 +100,7 @@ def test_logging_settings_setter(logging_service): def test_log_startup(logging_service): + """Test the log_startup method.""" with patch("logging.getLogger") as mock_get_logger: mock_info = mock_get_logger.return_value.info @@ -166,6 +177,7 @@ def test_log( exec_info, custom_headers, ): + """Test the log method.""" with patch( "openbb_core.app.logs.logging_service.LoggingSettings", MockLoggingSettings, diff --git a/openbb_platform/core/tests/app/logs/utils/__init__.py b/openbb_platform/core/tests/app/logs/utils/__init__.py index e69de29bb2d..55cb40ff9e8 100644 --- a/openbb_platform/core/tests/app/logs/utils/__init__.py +++ b/openbb_platform/core/tests/app/logs/utils/__init__.py @@ -0,0 +1 @@ +"""OpenBB Platform Core tests.""" diff --git a/openbb_platform/core/tests/app/logs/utils/test_expired_files.py b/openbb_platform/core/tests/app/logs/utils/test_expired_files.py index 7e2721b1058..1cb7897eb25 100644 --- a/openbb_platform/core/tests/app/logs/utils/test_expired_files.py +++ b/openbb_platform/core/tests/app/logs/utils/test_expired_files.py @@ -1,3 +1,5 @@ +"""Tests for the expired_files module.""" + import os import tempfile from pathlib import Path @@ -12,9 +14,12 @@ from openbb_core.app.logs.utils.expired_files import ( remove_file_list, ) +# pylint: disable=W0621 + @pytest.fixture def temp_test_files(): + """Create temporary files for testing.""" with tempfile.TemporaryDirectory() as temp_dir: temp_files = [ Path(temp_dir) / "file1.txt", @@ -30,12 +35,14 @@ def temp_test_files(): def test_get_timestamp_from_x_days(): + """Test get_timestamp_from_x_days.""" result = get_timestamp_from_x_days(0) assert isinstance(result, float) # Test case when all files are expired def test_all_files_expired(temp_test_files): + """Test get_expired_file_list when all files are expired.""" temp_dir, temp_files = temp_test_files before_timestamp = time() + 3 * 86400 # timestamp 3 days from now expired_files = get_expired_file_list(Path(temp_dir), before_timestamp) @@ -44,14 +51,16 @@ def test_all_files_expired(temp_test_files): # Test case when no files are expired def test_no_files_expired(temp_test_files): + """Test get_expired_file_list when no files are expired.""" temp_dir, _ = temp_test_files before_timestamp = 0 expired_files = get_expired_file_list(Path(temp_dir), before_timestamp) - assert expired_files == [] + assert not expired_files # Test case when some files are expired and some are not def test_some_files_expired(temp_test_files): + """Test get_expired_file_list when some files are expired and some are not.""" temp_dir, _ = temp_test_files # add temp file to temp_dir with timestamp in the future @@ -70,27 +79,31 @@ def test_some_files_expired(temp_test_files): # Test case when the directory does not exist def test_directory_not_exists(): + """Test get_expired_file_list when the directory does not exist.""" directory = Path("/path/that/does/not/exist") before_timestamp = time() expired_files = get_expired_file_list(directory, before_timestamp) - assert expired_files == [] + assert not expired_files # Test case when the directory is not a directory def test_directory_not_dir(temp_test_files): + """Test get_expired_file_list when the directory is not a directory.""" _, temp_files = temp_test_files before_timestamp = time() expired_files = get_expired_file_list(temp_files[0], before_timestamp) - assert expired_files == [] + assert not expired_files @pytest.fixture def mock_path(): + """Return a MagicMock for the Path class.""" # Create a MagicMock for the Path class to represent a file path return MagicMock() def test_remove_file_list_no_files(mock_path): + """Test remove_file_list when there are no files to remove.""" # Arrange # Let's assume the file list is empty, meaning there are no files to remove file_list: List[Path] = [] @@ -104,6 +117,7 @@ def test_remove_file_list_no_files(mock_path): def test_remove_file_list_remove_files_successfully(mock_path): + """Test remove_file_list when unlink is successful.""" # Arrange # Let's assume we have three files in the file list file_list = [mock_path, mock_path, mock_path] @@ -120,6 +134,7 @@ def test_remove_file_list_remove_files_successfully(mock_path): def test_remove_file_list_ignore_permission_error(mock_path): + """Test remove_file_list when unlink raises a PermissionError.""" # Arrange # Let's assume we have three files in the file list file_list = [mock_path, mock_path, mock_path] @@ -136,6 +151,7 @@ def test_remove_file_list_ignore_permission_error(mock_path): def test_remove_file_list_other_exception(mock_path): + """Test remove_file_list when unlink raises an exception other than PermissionError.""" # Arrange # Let's assume we have three files in the file list file_list = [mock_path, mock_path, mock_path] diff --git a/openbb_platform/core/tests/app/logs/utils/test_utils.py b/openbb_platform/core/tests/app/logs/utils/test_utils.py index f3715abc434..9cda5662e2f 100644 --- a/openbb_platform/core/tests/app/logs/utils/test_utils.py +++ b/openbb_platform/core/tests/app/logs/utils/test_utils.py @@ -1,3 +1,5 @@ +"""OpenBB Platform Core tests.""" + import uuid from pathlib import Path from unittest.mock import patch @@ -9,12 +11,14 @@ from openbb_core.app.logs.utils.utils import get_app_id, get_log_dir, get_sessio def test_get_session_id_return_type(): + """Test if the returned value is a string.""" # Test if the returned value is a string session_id = get_session_id() assert isinstance(session_id, str) def test_get_session_id_format(): + """Test if the returned string has the format "UUID-current_time.""" # Test if the returned string has the format "UUID-current_time" session_id = get_session_id() @@ -33,6 +37,7 @@ def test_get_session_id_format(): def test_get_session_id_uniqueness(): + """Test if subsequent calls return different session IDs.""" # Test if subsequent calls return different session IDs session_id1 = get_session_id() session_id2 = get_session_id() @@ -43,9 +48,10 @@ def test_get_session_id_uniqueness(): def test_get_app_id_success(): + """Test get_app_id function.""" # Mock the return value of get_log_dir to simulate a successful scenario with patch("openbb_core.app.logs.utils.utils.get_log_dir") as mock_get_log_dir: - mock_get_log_dir + mock_get_log_dir # pylint: disable=pointless-statement mock_get_log_dir.return_value = Path( "/path/to/contextual_user_data_directory/app_id.log" ) @@ -54,6 +60,7 @@ def test_get_app_id_success(): def test_get_app_id_os_error(): + """Test handling of OSError with errno 30.""" # Test handling of OSError with errno 30 (Read-only file system) with patch("openbb_core.app.logs.utils.utils.get_log_dir") as mock_get_log_dir: mock_get_log_dir.side_effect = OSError(30, "Read-only file system") @@ -62,6 +69,7 @@ def test_get_app_id_os_error(): def test_get_app_id_other_exception(): + """Test handling of other exceptions.""" # Test handling of other exceptions with patch("openbb_core.app.logs.utils.utils.get_log_dir") as mock_get_log_dir: mock_get_log_dir.side_effect = Exception("Some other error") @@ -73,6 +81,7 @@ def test_get_app_id_other_exception(): def test_get_log_dir(): + """Test get_log_dir function.""" with patch( "openbb_core.app.logs.utils.utils.create_log_dir_if_not_exists", return_value="/test_dir", diff --git a/openbb_platform/core/tests/app/model/__init__.py b/openbb_platform/core/tests/app/model/__init__.py index e69de29bb2d..55cb40ff9e8 100644 --- a/openbb_platform/core/tests/app/model/__init__.py +++ b/openbb_platform/core/tests/app/model/__init__.py @@ -0,0 +1 @@ +"""OpenBB Platform Core tests.""" diff --git a/openbb_platform/core/tests/app/model/abstract/__init__.py b/openbb_platform/core/tests/app/model/abstract/__init__.py index e69de29bb2d..55cb40ff9e8 100644 --- a/openbb_platform/core/tests/app/model/abstract/__init__.py +++ b/openbb_platform/core/tests/app/model/abstract/__init__.py @@ -0,0 +1 @@ +"""OpenBB Platform Core tests.""" diff --git a/openbb_platform/core/tests/app/model/abstract/test_results.py b/openbb_platform/core/tests/app/model/abstract/test_results.py index c3dd548ea3a..ccdd5b8a036 100644 --- a/openbb_platform/core/tests/app/model/abstract/test_results.py +++ b/openbb_platform/core/tests/app/model/abstract/test_results.py @@ -1,12 +1,15 @@ +"""Tests for the Results model.""" + from openbb_core.app.model.abstract.results import Results from pydantic import BaseModel class MockResults(Results): - pass + """Mock Results class.""" def test_results_model(): + """Test the Results model.""" res = MockResults() assert isinstance(res, BaseModel) diff --git a/openbb_platform/core/tests/app/model/abstract/test_singleton.py b/openbb_platform/core/tests/app/model/abstract/test_singleton.py index d87502e2f67..e586fb00e9d 100644 --- a/openbb_platform/core/tests/app/model/abstract/test_singleton.py +++ b/openbb_platform/core/tests/app/model/abstract/test_singleton.py @@ -1,12 +1,18 @@ +"""Tests for the SingletonMeta metaclass.""" + from openbb_core.app.model.abstract.singleton import SingletonMeta class MyClass(metaclass=SingletonMeta): + """A simple class.""" + def __init__(self, value): + """Initialize the class.""" self.value = value def test_singleton_instance_creation(): + """Test the SingletonMeta metaclass with instance creation.""" # Arrange instance1 = MyClass(42) instance2 = MyClass(100) @@ -18,6 +24,8 @@ def test_singleton_instance_creation(): def test_singleton_multiple_classes(): + """Test the SingletonMeta metaclass with multiple classes.""" + # Arrange class AnotherClass(metaclass=SingletonMeta): def __init__(self, data): diff --git a/openbb_platform/core/tests/app/model/abstract/test_tagged.py b/openbb_platform/core/tests/app/model/abstract/test_tagged.py index 33df298ad58..7c40d15b675 100644 --- a/openbb_platform/core/tests/app/model/abstract/test_tagged.py +++ b/openbb_platform/core/tests/app/model/abstract/test_tagged.py @@ -1,13 +1,17 @@ +"""Test the Tagged model.""" + from openbb_core.app.model.abstract.tagged import Tagged def test_tagged_model(): + """Test the Tagged model.""" tagged = Tagged() assert hasattr(tagged, "id") def test_fields(): + """Test the Tagged fields.""" fields = Tagged.model_fields fields_keys = fields.keys() diff --git a/openbb_platform/core/tests/app/model/abstract/test_warning.py b/openbb_platform/core/tests/app/model/abstract/test_warning.py index 46692077cdd..3a506e6d658 100644 --- a/openbb_platform/core/tests/app/model/abstract/test_warning.py +++ b/openbb_platform/core/tests/app/model/abstract/test_warning.py @@ -1,3 +1,5 @@ +"""Test the Warnings model.""" + from unittest.mock import Mock import pytest @@ -12,6 +14,7 @@ from openbb_core.app.model.abstract.warning import Warning_, cast_warning ], ) def test_warn_model(category, message): + """Test the Warning_ model.""" war = Warning_(category=category, message=message) assert war.category == category @@ -19,6 +22,7 @@ def test_warn_model(category, message): def test_fields(): + """Test the Warning_ fields.""" fields = Warning_.model_fields fields_keys = fields.keys() @@ -27,6 +31,7 @@ def test_fields(): def test_cast_warning(): + """Test the cast_warning function.""" mock_warning_message = Mock() mock_warning_message.category.__name__ = "test" mock_warning_message.message = "test" diff --git a/openbb_platform/core/tests/app/model/charts/__init__.py b/openbb_platform/core/tests/app/model/charts/__init__.py index e69de29bb2d..55cb40ff9e8 100644 --- a/openbb_platform/core/tests/app/model/charts/__init__.py +++ b/openbb_platform/core/tests/app/model/charts/__init__.py @@ -0,0 +1 @@ +"""OpenBB Platform Core tests.""" diff --git a/openbb_platform/core/tests/app/model/charts/test_chart.py b/openbb_platform/core/tests/app/model/charts/test_chart.py index 3d3ff9960bd..4f0eb140f42 100644 --- a/openbb_platform/core/tests/app/model/charts/test_chart.py +++ b/openbb_platform/core/tests/app/model/charts/test_chart.py @@ -1,8 +1,11 @@ +"""Test the chart model.""" + import pytest from openbb_core.app.model.charts.chart import Chart, ChartFormat def test_charting_default_values(): + """Test the charting default values.""" # Arrange & Act chart = Chart() @@ -12,6 +15,7 @@ def test_charting_default_values(): def test_charting_custom_values(): + """Test the charting custom values.""" # Arrange content = {"data": [1, 2, 3]} chart_format = ChartFormat.plotly @@ -25,6 +29,7 @@ def test_charting_custom_values(): def test_charting_assignment_validation(): + """Test the charting assignment validation.""" # Arrange chart = Chart() @@ -34,6 +39,7 @@ def test_charting_assignment_validation(): def test_charting_config_validation(): + """Test the charting config validation.""" # Arrange content = {"data": [1, 2, 3]} chart_format = ChartFormat.plotly @@ -48,5 +54,5 @@ def test_charting_config_validation(): def test_show(): + """Test the show method.""" # TODO : add test after the function is properly refactored - pass diff --git a/openbb_platform/core/tests/app/model/hub/__init__.py b/openbb_platform/core/tests/app/model/hub/__init__.py index e69de29bb2d..55cb40ff9e8 100644 --- a/openbb_platform/core/tests/app/model/hub/__init__.py +++ b/openbb_platform/core/tests/app/model/hub/__init__.py @@ -0,0 +1 @@ +"""OpenBB Platform Core tests.""" diff --git a/openbb_platform/core/tests/app/model/hub/test_features_keys.py b/openbb_platform/core/tests/app/model/hub/test_features_keys.py deleted file mode 100644 index 4f3a85246e0..00000000000 --- a/openbb_platform/core/tests/app/model/hub/test_features_keys.py +++ /dev/null @@ -1,10 +0,0 @@ -from openbb_core.app.model.hub.features_keys import FeaturesKeys - -# ruff: noqa: S105 S106 - - -def test_features_keys(): - fk = FeaturesKeys(API_BITQUERY_KEY="test", API_BIZTOC_TOKEN="test2") - - assert fk.API_BITQUERY_KEY == "test" - assert fk.API_BIZTOC_TOKEN == "test2" diff --git a/openbb_platform/core/tests/app/model/hub/test_hub_session.py b/openbb_platform/core/tests/app/model/hub/test_hub_session.py index 645a097ac1f..19638f22cb9 100644 --- a/openbb_platform/core/tests/app/model/hub/test_hub_session.py +++ b/openbb_platform/core/tests/app/model/hub/test_hub_session.py @@ -1,3 +1,5 @@ +"""Test the HubSession class.""" + from openbb_core.app.model.hub.hub_session import HubSession from pydantic import SecretStr @@ -5,6 +7,7 @@ from pydantic import SecretStr def test_hub_session(): + """Test the HubSession class.""" session = HubSession( access_token=SecretStr("mock_access_token"), token_type="mock_token_type", @@ -22,6 +25,7 @@ def test_hub_session(): def test_fields(): + """Test the HubSession fields.""" fields = HubSession.model_fields fields_keys = fields.keys() diff --git a/openbb_platform/core/tests/app/model/hub/test_hub_user_settings.py b/openbb_platform/core/tests/app/model/hub/test_hub_user_settings.py index ca2f78ff9a8..5fdcde411fa 100644 --- a/openbb_platform/core/tests/app/model/hub/test_hub_user_settings.py +++ b/openbb_platform/core/tests/app/model/hub/test_hub_user_settings.py @@ -1,7 +1,10 @@ +"""Test the HubUserSettings class.""" + from openbb_core.app.model.hub.hub_user_settings import HubUserSettings def test_hub_user_settings(): + """Test the HubUserSettings class.""" hub_settings = HubUserSettings() assert isinstance(hub_settings, HubUserSettings) diff --git a/openbb_platform/core/tests/app/model/test_command_context.py b/openbb_platform/core/tests/app/model/test_command_context.py index 76423c8b9c5..57d982f58c2 100644 --- a/openbb_platform/core/tests/app/model/test_command_context.py +++ b/openbb_platform/core/tests/app/model/test_command_context.py @@ -1,3 +1,5 @@ +"""Test the CommandContext model.""" + from openbb_core.app.model.command_context import ( CommandContext, SystemSettings, @@ -6,6 +8,7 @@ from openbb_core.app.model.command_context import ( def test_command_context(): + """Test the CommandContext model.""" cc = CommandContext() assert isinstance(cc, CommandContext) assert isinstance(cc.user_settings, UserSettings) @@ -13,6 +16,7 @@ def test_command_context(): def test_fields(): + """Test the CommandContext fields.""" fields = CommandContext.model_fields fields_keys = fields.keys() diff --git a/openbb_platform/core/tests/app/model/test_credentials.py b/openbb_platform/core/tests/app/model/test_credentials.py index 041ca5f16e6..52f0d25126c 100644 --- a/openbb_platform/core/tests/app/model/test_credentials.py +++ b/openbb_platform/core/tests/app/model/test_credentials.py @@ -1,8 +1,11 @@ +"""Test the Credentials model.""" + import typing from unittest.mock import patch def test_credentials(): + """Test the Credentials model.""" with patch( target="openbb_core.app.model.credentials.ProviderInterface" ) as mock_provider_interface: @@ -10,7 +13,9 @@ def test_credentials(): "benzinga_api_key": (typing.Optional[str], None), "polygon_api_key": (typing.Optional[str], None), } - from openbb_core.app.model.credentials import Credentials + from openbb_core.app.model.credentials import ( # pylint: disable=import-outside-toplevel + Credentials, + ) creds = Credentials( benzinga_api_key="mock_benzinga_api_key", diff --git a/openbb_platform/core/tests/app/model/test_defaults.py b/openbb_platform/core/tests/app/model/test_defaults.py index af87fa52e24..e4a3df6dd21 100644 --- a/openbb_platform/core/tests/app/model/test_defaults.py +++ b/openbb_platform/core/tests/app/model/test_defaults.py @@ -1,13 +1,17 @@ +"""Test the Defaults class.""" + from openbb_core.app.model.defaults import Defaults def test_defaults(): + """Test the Defaults class.""" cc = Defaults(routes={"test": {"test": "test"}}) assert isinstance(cc, Defaults) assert cc.routes == {"test": {"test": "test"}} def test_fields(): + """Test the Defaults fields.""" fields = Defaults.model_fields fields_keys = fields.keys() diff --git a/openbb_platform/core/tests/app/model/test_metadata.py b/openbb_platform/core/tests/app/model/test_metadata.py index 60c4f95c583..37bf7377984 100644 --- a/openbb_platform/core/tests/app/model/test_metadata.py +++ b/openbb_platform/core/tests/app/model/test_metadata.py @@ -1,3 +1,5 @@ +"""Test the Metadata model.""" + from datetime import datetime import numpy as np @@ -8,9 +10,13 @@ from openbb_core.provider.abstract.data import Data def test_Metadata(): - "Smoke test" + """Run Smoke test.""" m = Metadata( - arguments={"test": "test"}, + arguments={ + "provider_choices": {}, + "standard_params": {}, + "extra_params": {}, + }, route="test", timestamp=datetime.now(), duration=0, @@ -20,7 +26,7 @@ def test_Metadata(): def test_fields(): - "Smoke test" + """Run Smoke test.""" fields = Metadata.model_fields.keys() assert "arguments" in fields assert "duration" in fields @@ -42,7 +48,7 @@ def test_fields(): { "data_list": { "type": "List[Data]", - "columns": ["open", "close", "volume"], + "columns": ["open", "volume", "close"], } }, ), @@ -98,20 +104,41 @@ 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, ) arguments = m.arguments - for arg in arguments: + 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/model/test_preferences.py b/openbb_platform/core/tests/app/model/test_preferences.py index ca3bae14af0..dacfc708ed9 100644 --- a/openbb_platform/core/tests/app/model/test_preferences.py +++ b/openbb_platform/core/tests/app/model/test_preferences.py @@ -1,6 +1,9 @@ +"""Test the preferences class.""" + from openbb_core.app.model.preferences import Preferences def test_preferences(): + """Test the preferences class.""" preferences = Preferences() assert isinstance(preferences, Preferences) diff --git a/openbb_platform/core/tests/app/model/test_profile.py b/openbb_platform/core/tests/app/model/test_profile.py index 5c22d7ee73d..7f8a4795327 100644 --- a/openbb_platform/core/tests/app/model/test_profile.py +++ b/openbb_platform/core/tests/app/model/test_profile.py @@ -1,6 +1,9 @@ +"""Test the profile class.""" + from openbb_core.app.model.profile import Profile def test_preferences(): + """Test the preferences class.""" preferences = Profile() assert isinstance(preferences, Profile) diff --git a/openbb_platform/core/tests/app/model/test_system_settings.py b/openbb_platform/core/tests/app/model/test_system_settings.py index 90a1c63778f..1ead135bfe4 100644 --- a/openbb_platform/core/tests/app/model/test_system_settings.py +++ b/openbb_platform/core/tests/app/model/test_system_settings.py @@ -1,3 +1,5 @@ +"""Tests for the SystemSettings class.""" + import os from pathlib import Path @@ -13,11 +15,13 @@ class MockSystemSettings(BaseModel): def test_system_settings(): + """Test the SystemSettings class.""" sys = SystemSettings() assert isinstance(sys, SystemSettings) def test_create_openbb_directory_directory_and_files_not_exist(tmpdir): + """Test the create_openbb_directory method.""" # Arrange values = MockSystemSettings( **{ @@ -37,6 +41,7 @@ def test_create_openbb_directory_directory_and_files_not_exist(tmpdir): def test_create_openbb_directory_directory_exists_user_settings_missing(tmpdir): + """Test the create_openbb_directory method.""" # Arrange values = MockSystemSettings( **{ @@ -59,6 +64,7 @@ def test_create_openbb_directory_directory_exists_user_settings_missing(tmpdir): def test_create_openbb_directory_directory_exists_system_settings_missing(tmpdir): + """Test the create_openbb_directory method.""" # Arrange values = MockSystemSettings( **{ @@ -136,6 +142,7 @@ def test_create_openbb_directory_directory_exists_system_settings_missing(tmpdir ], ) def test_validate_posthog_handler(values, expected_handlers): + """Test the validate_posthog_handler method.""" values = MockSystemSettings(**values) # Act result = SystemSettings.validate_posthog_handler(values) # type: ignore[operator] @@ -158,6 +165,7 @@ def test_validate_posthog_handler(values, expected_handlers): ], ) def test_validate_logging_handlers(handlers, valid): + """Test the validate_logging_handlers method.""" # Act and Assert if valid: assert SystemSettings.validate_logging_handlers(handlers) == handlers # type: ignore[call-arg] diff --git a/openbb_platform/core/tests/app/model/test_user_settings.py b/openbb_platform/core/tests/app/model/test_user_settings.py index b24fb23cae1..ebc78faf4d9 100644 --- a/openbb_platform/core/tests/app/model/test_user_settings.py +++ b/openbb_platform/core/tests/app/model/test_user_settings.py @@ -1,3 +1,5 @@ +"""Test the UserSettings model.""" + from openbb_core.app.model.credentials import Credentials from openbb_core.app.model.defaults import Defaults from openbb_core.app.model.preferences import Preferences @@ -6,6 +8,7 @@ from openbb_core.app.model.user_settings import UserSettings def test_user_settings(): + """Test the UserSettings model.""" settings = UserSettings( credentials=Credentials(), profile=Profile(), diff --git a/openbb_platform/core/tests/app/results/__init__.py b/openbb_platform/core/tests/app/results/__init__.py index e69de29bb2d..55cb40ff9e8 100644 --- a/openbb_platform/core/tests/app/results/__init__.py +++ b/openbb_platform/core/tests/app/results/__init__.py @@ -0,0 +1 @@ +"""OpenBB Platform Core tests.""" diff --git a/openbb_platform/core/tests/app/results/test_empty.py b/openbb_platform/core/tests/app/results/test_empty.py index 23a73ff369e..5ce63f4a5c5 100644 --- a/openbb_platform/core/tests/app/results/test_empty.py +++ b/openbb_platform/core/tests/app/results/test_empty.py @@ -1,8 +1,11 @@ +"""Test the Empty model.""" + from openbb_core.app.model.results.empty import Empty from pydantic import BaseModel def test_empty_model(): + """Test the Empty model.""" empty = Empty() assert isinstance(empty, Empty) diff --git a/openbb_platform/core/tests/app/service/__init__.py b/openbb_platform/core/tests/app/service/__init__.py index e69de29bb2d..55cb40ff9e8 100644 --- a/openbb_platform/core/tests/app/service/__init__.py +++ b/openbb_platform/core/tests/app/service/__init__.py @@ -0,0 +1 @@ +"""OpenBB Platform Core tests.""" diff --git a/openbb_platform/core/tests/app/service/test_hub_service.py b/openbb_platform/core/tests/app/service/test_hub_service.py index 4b6c702c12f..db2030d561e 100644 --- a/openbb_platform/core/tests/app/service/test_hub_service.py +++ b/openbb_platform/core/tests/app/service/test_hub_service.py @@ -4,10 +4,10 @@ # ruff: noqa: S105 S106 +from pathlib import Path from unittest.mock import MagicMock, patch import pytest -from openbb_core.app.model.hub.features_keys import FeaturesKeys from openbb_core.app.service.hub_service import ( Credentials, HubService, @@ -25,6 +25,66 @@ def mocker(): yield mock +def test_v3tov4_map(): + """Test v3 to v4 map.""" + + v3_keys = { + "databento": "API_DATABENTO_KEY", + "alpha_vantage": "API_KEY_ALPHAVANTAGE", + "fmp": "API_KEY_FINANCIALMODELINGPREP", + "nasdaq": "API_KEY_QUANDL", + "polygon": "API_POLYGON_KEY", + "fred": "API_FRED_KEY", + "news_api": "API_NEWS_TOKEN", + "biztoc": "API_BIZTOC_TOKEN", + "cmc": "API_CMC_KEY", + "finnhub": "API_FINNHUB_KEY", + "whale_alert": "API_WHALE_ALERT_KEY", + "glassnode": "API_GLASSNODE_KEY", + "coinglass": "API_COINGLASS_KEY", + "ethplorer": "API_ETHPLORER_KEY", + "cryptopanic": "API_CRYPTO_PANIC_KEY", + "crypto_panic": "API_CRYPTO_PANIC_KEY", # If dev choses to use this name + "bitquery": "API_BITQUERY_KEY", + "smartstake": ["API_SMARTSTAKE_KEY", "API_SMARTSTAKE_TOKEN"], + "messari": "API_MESSARI_KEY", + "shroom": "API_SHROOM_KEY", + "santiment": "API_SANTIMENT_KEY", + "eodhd": "API_EODHD_KEY", + "tokenterminal": "API_TOKEN_TERMINAL_KEY", + "token_terminal": "API_TOKEN_TERMINAL_KEY", # If dev choses to use this name + "intrinio": "API_INTRINIO_KEY", + "github": "API_GITHUB_KEY", + "reddit": [ + "API_REDDIT_CLIENT_ID", + "API_REDDIT_CLIENT_SECRET", + "API_REDDIT_USERNAME", + "API_REDDIT_USER_AGENT", + "API_REDDIT_PASSWORD", + ], + "companies_house": "API_COMPANIESHOUSE_KEY", + "companieshouse": "API_COMPANIESHOUSE_KEY", # If dev choses to use this name + "dappradar": "API_DAPPRADAR_KEY", + "nixtla": "API_KEY_NIXTLA", + } + + providers = sorted( + [ + p.stem + for p in Path("openbb_platform", "providers").glob("*") + if p.is_dir() and p.name not in ("__pycache__", "tests") + ] + ) + + for provider in providers: + if provider in v3_keys: + keys = v3_keys[provider] + if not isinstance(keys, list): + keys = [keys] + for k in keys: + assert k in HubService.V3TOV4 + + def test_connect_with_email_password(): """Test connect with email and password.""" mock_hub_session = MagicMock(spec=HubSession) @@ -173,31 +233,78 @@ def test_put_user_settings(): ) -def test_hub2platform(): +def test_hub2platform_v4_only(): """Test hub2platform.""" mock_user_settings = MagicMock(spec=HubUserSettings) - mock_user_settings.features_keys = FeaturesKeys( - API_KEY_FINANCIALMODELINGPREP="fmp", - API_POLYGON_KEY="polygon", - API_FRED_KEY="fred", - ) + mock_user_settings.features_keys = { + "fmp_api_key": "abc", + "polygon_api_key": "def", + "fred_api_key": "ghi", + } - credentials = HubService.hub2platform(mock_user_settings) + credentials = HubService().hub2platform(mock_user_settings) assert isinstance(credentials, Credentials) - assert credentials.fmp_api_key.get_secret_value() == "fmp" - assert credentials.polygon_api_key.get_secret_value() == "polygon" - assert credentials.fred_api_key.get_secret_value() == "fred" + assert credentials.fmp_api_key.get_secret_value() == "abc" + assert credentials.polygon_api_key.get_secret_value() == "def" + assert credentials.fred_api_key.get_secret_value() == "ghi" + + +def test_hub2platform_v3_only(): + """Test hub2platform.""" + mock_user_settings = MagicMock(spec=HubUserSettings) + mock_user_settings.features_keys = { + "API_KEY_FINANCIALMODELINGPREP": "abc", + "API_POLYGON_KEY": "def", + "API_FRED_KEY": "ghi", + } + + credentials = HubService().hub2platform(mock_user_settings) + assert isinstance(credentials, Credentials) + assert credentials.fmp_api_key.get_secret_value() == "abc" + assert credentials.polygon_api_key.get_secret_value() == "def" + assert credentials.fred_api_key.get_secret_value() == "ghi" + + +def test_hub2platform_v3v4(): + """Test hub2platform.""" + mock_user_settings = MagicMock(spec=HubUserSettings) + mock_user_settings.features_keys = { + "API_KEY_FINANCIALMODELINGPREP": "abc", + "fmp_api_key": "other_key", + "API_POLYGON_KEY": "def", + "API_FRED_KEY": "ghi", + } + + credentials = HubService().hub2platform(mock_user_settings) + assert isinstance(credentials, Credentials) + assert credentials.fmp_api_key.get_secret_value() == "other_key" + assert credentials.polygon_api_key.get_secret_value() == "def" + assert credentials.fred_api_key.get_secret_value() == "ghi" def test_platform2hub(): """Test platform2hub.""" - mock_credentials = MagicMock(spec=Credentials) - mock_credentials.fmp_api_key = SecretStr("fmp") - mock_credentials.polygon_api_key = SecretStr("polygon") - mock_credentials.fred_api_key = SecretStr("fred") + mock_user_settings = MagicMock(spec=HubUserSettings) + mock_user_settings.features_keys = { # Received from Hub + "API_KEY_FINANCIALMODELINGPREP": "abc", + "fmp_api_key": "other_key", + "API_FRED_KEY": "ghi", + } + mock_hub_service = HubService() + mock_hub_service._hub_user_settings = mock_user_settings + mock_credentials = Credentials( # Current credentials + fmp_api_key=SecretStr("fmp"), + polygon_api_key=SecretStr("polygon"), + fred_api_key=SecretStr("fred"), + benzinga_api_key=SecretStr("benzinga"), + some_api_key=SecretStr("some"), + ) + user_settings = mock_hub_service.platform2hub(mock_credentials) - user_settings = HubService.platform2hub(mock_credentials) assert isinstance(user_settings, HubUserSettings) - assert user_settings.features_keys.API_KEY_FINANCIALMODELINGPREP == "fmp" - assert user_settings.features_keys.API_POLYGON_KEY == "polygon" - assert user_settings.features_keys.API_FRED_KEY == "fred" + assert user_settings.features_keys["API_KEY_FINANCIALMODELINGPREP"] == "fmp" + assert user_settings.features_keys["fmp_api_key"] == "other_key" + assert user_settings.features_keys["polygon_api_key"] == "polygon" + assert user_settings.features_keys["API_FRED_KEY"] == "fred" + assert user_settings.features_keys["benzinga_api_key"] == "benzinga" + assert "some_api_key" not in user_settings.features_keys diff --git a/openbb_platform/core/tests/app/static/__init__.py b/openbb_platform/core/tests/app/static/__init__.py index e69de29bb2d..3f4c8aabdda 100644 --- a/openbb_platform/core/tests/app/static/__init__.py +++ b/openbb_platform/core/tests/app/static/__init__.py @@ -0,0 +1 @@ +"""OpenBB Platform core tests.""" diff --git a/openbb_platform/core/tests/app/static/test_app_factory.py b/openbb_platform/core/tests/app/static/test_app_factory.py index efb79faabff..9a8799be503 100644 --- a/openbb_platform/core/tests/app/static/test_app_factory.py +++ b/openbb_platform/core/tests/app/static/test_app_factory.py @@ -47,3 +47,10 @@ def test_app_coverage(app_factory): coverage = app_factory.coverage assert coverage assert isinstance(coverage, Coverage) + + +def test_app_reference(app_factory): + """Test app reference.""" + reference = app_factory.reference + assert reference + assert isinstance(reference, dict) diff --git a/openbb_platform/core/tests/app/static/test_filters.py b/openbb_platform/core/tests/app/static/test_filters.py index 1f06dc0955d..9532867fe4b 100644 --- a/openbb_platform/core/tests/app/static/test_filters.py +++ b/openbb_platform/core/tests/app/static/test_filters.py @@ -49,6 +49,7 @@ test_data = [ def test_filter_inputs( input_data, ): + """Test the filter_inputs function.""" result = filter_inputs(data=input_data, data_processing=True) # Assert that the result is a dictionary diff --git a/openbb_platform/core/tests/app/static/test_package_builder.py b/openbb_platform/core/tests/app/static/test_package_builder.py index 029c200fa45..fe738d69deb 100644 --- a/openbb_platform/core/tests/app/static/test_package_builder.py +++ b/openbb_platform/core/tests/app/static/test_package_builder.py @@ -5,6 +5,7 @@ from dataclasses import dataclass from inspect import _empty from pathlib import Path +from typing import Any, Dict, List, Tuple, Union from unittest.mock import PropertyMock, mock_open, patch import pandas @@ -27,6 +28,7 @@ from typing_extensions import Annotated @pytest.fixture(scope="module") def tmp_openbb_dir(tmp_path_factory): + """Return a temporary openbb directory.""" return tmp_path_factory.mktemp("openbb") @@ -532,6 +534,7 @@ def test_generate_model_docstring(docstring_generator): docstring = "" model_name = "WorldNews" summary = "This is a summary." + sections = ["description", "parameters", "returns", "examples"] pi = docstring_generator.provider_interface kwarg_params = pi.params[model_name]["extra"].__dataclass_fields__ @@ -551,6 +554,7 @@ def test_generate_model_docstring(docstring_generator): kwarg_params=kwarg_params, returns=returns, results_type="List[WorldNews]", + sections=sections, ) assert docstring @@ -560,11 +564,46 @@ def test_generate_model_docstring(docstring_generator): assert "WorldNews" in docstring +@pytest.mark.parametrize( + "type_, expected", + [ + (Any, []), + (List[str], ["List"]), + (Dict[str, str], ["Dict"]), + (Tuple[str], ["Tuple"]), + (Union[List[str], Dict[str, str], Tuple[str]], ["List", "Dict", "Tuple"]), + ], +) +def test__get_generic_types(docstring_generator, type_, expected): + """Test get generic types.""" + output = docstring_generator._get_generic_types(type_, []) + assert output == expected + + +@pytest.mark.parametrize( + "items, model, expected", + [ + ([], "test_model", "test_model"), + (["List"], "test_model", "List[test_model]"), + (["Dict"], "test_model", "Dict[str, test_model]"), + (["Tuple"], "test_model", "Tuple[test_model]"), + ( + ["List", "Dict", "Tuple"], + "test_model", + "Union[List[test_model], Dict[str, test_model], Tuple[test_model]]", + ), + ], +) +def test__get_repr(docstring_generator, items, model, expected): + output = docstring_generator._get_repr(items, model) + assert output == expected + + def test_generate(docstring_generator): """Test generate docstring.""" def some_func(): - """Some func docstring.""" + """Define Some func docstring.""" formatted_params = { "param1": Parameter("NoneType", kind=Parameter.POSITIONAL_OR_KEYWORD), @@ -582,15 +621,15 @@ def test_generate(docstring_generator): assert "Returns" in doc -def test_read_extension_map(package_builder, tmp_openbb_dir): - """Test read extension map.""" +def test__read(package_builder, tmp_openbb_dir): + """Test read.""" PATH = "openbb_core.app.static.package_builder." open_mock = mock_open() with patch(PATH + "open", open_mock), patch(PATH + "load") as mock_load: - package_builder._read(Path(tmp_openbb_dir / "assets" / "extension_map.json")) + package_builder._read(Path(tmp_openbb_dir / "assets" / "reference.json")) open_mock.assert_called_once_with( - Path(tmp_openbb_dir / "assets" / "extension_map.json") + Path(tmp_openbb_dir / "assets" / "reference.json") ) mock_load.assert_called_once() @@ -646,7 +685,6 @@ def test_read_extension_map(package_builder, tmp_openbb_dir): ) def test_package_diff( package_builder, - tmp_openbb_dir, ext_built, ext_installed, ext_inst_version, @@ -656,22 +694,20 @@ def test_package_diff( """Test package differences.""" def mock_entry_points(group): + """Mock entry points.""" return ext_installed.select(**{"group": group}) PATH = "openbb_core.app.static.package_builder." - with patch.object(PackageBuilder, "_read") as mock_read, patch( - PATH + "entry_points", mock_entry_points - ), patch.object(EntryPoint, "dist", new_callable=PropertyMock) as mock_obj: + with patch(PATH + "entry_points", mock_entry_points), patch.object( + EntryPoint, "dist", new_callable=PropertyMock + ) as mock_obj: class MockPathDistribution: version = ext_inst_version mock_obj.return_value = MockPathDistribution() - mock_read.return_value = ext_built - add, remove = package_builder._diff( - Path(tmp_openbb_dir, "assets", "extension_map.json") - ) + add, remove = package_builder._diff(ext_built) # We add whatever is not built, but is installed assert add == expected_add @@ -689,7 +725,7 @@ def test_package_diff( ({"this"}, {"that"}, False), ], ) -def test_auto_build(package_builder, tmp_openbb_dir, add, remove, openbb_auto_build): +def test_auto_build(package_builder, add, remove, openbb_auto_build): """Test auto build.""" with patch.object(PackageBuilder, "_diff") as mock_assets_diff, patch.object( @@ -700,9 +736,6 @@ def test_auto_build(package_builder, tmp_openbb_dir, add, remove, openbb_auto_bu package_builder.auto_build() if openbb_auto_build: - mock_assets_diff.assert_called_once_with( - Path(tmp_openbb_dir, "assets", "extension_map.json") - ) if add or remove: mock_build.assert_called_once() else: diff --git a/openbb_platform/core/tests/app/static/test_reference_loader.py b/openbb_platform/core/tests/app/static/test_reference_loader.py index 1980ac4611a..20ef1fabf96 100644 --- a/openbb_platform/core/tests/app/static/test_reference_loader.py +++ b/openbb_platform/core/tests/app/static/test_reference_loader.py @@ -1,12 +1,17 @@ +"""Tests for the ReferenceLoader class.""" + import json from pathlib import Path import pytest from openbb_core.app.static.reference_loader import ReferenceLoader +# pylint: disable=W0212, W0621 + @pytest.fixture(scope="function") def reference_loader(): + """Fixture to create a ReferenceLoader instance.""" ReferenceLoader._instances = {} yield ReferenceLoader ReferenceLoader._instances = {} diff --git a/openbb_platform/core/tests/app/static/utils/test_linters.py b/openbb_platform/core/tests/app/static/utils/test_linters.py index 37f57e39592..1ebd54b66d0 100644 --- a/openbb_platform/core/tests/app/static/utils/test_linters.py +++ b/openbb_platform/core/tests/app/static/utils/test_linters.py @@ -10,6 +10,7 @@ from openbb_core.app.static.package_builder import ( @pytest.fixture(scope="module") def tmp_package_dir(tmp_path_factory): + """Return a temporary package directory.""" return tmp_path_factory.mktemp("package") diff --git a/openbb_platform/core/tests/app/test_charting_manager.py b/openbb_platform/core/tests/app/test_charting_manager.py index e69de29bb2d..06b5fb09691 100644 --- a/openbb_platform/core/tests/app/test_charting_manager.py +++ b/openbb_platform/core/tests/app/test_charting_manager.py @@ -0,0 +1 @@ +"""Test ChartingManager.""" diff --git a/openbb_platform/core/tests/app/test_command_runner.py b/openbb_platform/core/tests/app/test_command_runner.py index 4b1b35da92d..d56acfca82c 100644 --- a/openbb_platform/core/tests/app/test_command_runner.py +++ b/openbb_platform/core/tests/app/test_command_runner.py @@ -1,3 +1,5 @@ +"""Test command runner.""" + from dataclasses import dataclass from inspect import Parameter from typing import Dict, List @@ -20,6 +22,8 @@ from openbb_core.app.provider_interface import ExtraParams from openbb_core.app.router import CommandMap from pydantic import BaseModel, ConfigDict +# pylint: disable=W0613, W0621, W0102, W0212 + @pytest.fixture() def execution_context(): @@ -37,7 +41,7 @@ def mock_func(): def mock_func( a: int, b: int, c: float = 10.0, d: int = 5, provider_choices: Dict = {} ) -> None: - pass + """Mock function.""" return mock_func @@ -155,12 +159,14 @@ def test_parameters_builder_merge_args_and_kwargs( def test_parameters_builder_update_command_context( kwargs, system_settings, user_settings, expected_result ): + """Test update_command_context.""" + def other_mock_func( cc: CommandContext, a: int, b: int, ) -> None: - pass + """Mock function.""" result = ParametersBuilder.update_command_context( other_mock_func, kwargs, system_settings, user_settings @@ -207,6 +213,7 @@ def test_parameters_builder_update_command_context( def test_parameters_builder_update_provider_choices( command_coverage, route, kwargs, route_default, expected_result ): + """Test update_provider_choices.""" with patch("openbb_core.app.command_runner.ProviderInterface") as mock_pi: mock_pi.available_providers = ["provider1", "provider2"] result = ParametersBuilder.update_provider_choices( @@ -218,7 +225,6 @@ def test_parameters_builder_update_provider_choices( def test_parameters_builder_validate_kwargs(mock_func): """Test validate_kwargs.""" - # TODO: add more test cases with @pytest.mark.parametrize result = ParametersBuilder.validate_kwargs( @@ -268,7 +274,6 @@ def test_parameters_builder__warn_kwargs(extra_params, base, expect): def test_parameters_builder_build(mock_func, execution_context): """Test build.""" - # TODO: add more test cases with @pytest.mark.parametrize with patch("openbb_core.app.command_runner.ProviderInterface") as mock_pi: @@ -298,14 +303,12 @@ def test_parameters_builder_build(mock_func, execution_context): @patch("openbb_core.app.command_runner.LoggingService") def test_command_runner(_): """Test command runner.""" - assert CommandRunner() @patch("openbb_core.app.command_runner.LoggingService") def test_command_runner_properties(mock_logging_service): """Test properties.""" - sys = SystemSettings() user = UserSettings() cmd_map = CommandMap() @@ -320,6 +323,7 @@ def test_command_runner_properties(mock_logging_service): @patch("openbb_core.app.command_runner.LoggingService") def test_command_runner_run(_): + """Test run.""" runner = CommandRunner() with patch( @@ -338,14 +342,17 @@ async def test_static_command_runner_run( """Test static command runner run.""" def other_mock_func(a: int, b: int, c: int, d: int) -> List[int]: + """Mock function.""" return [a, b, c, d] class MockOBBject: """Mock OBBject""" def __init__(self, results): + """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]) diff --git a/openbb_platform/core/tests/app/test_deprecation.py b/openbb_platform/core/tests/app/test_deprecation.py index 926fe991a7b..bca6c5381ae 100644 --- a/openbb_platform/core/tests/app/test_deprecation.py +++ b/openbb_platform/core/tests/app/test_deprecation.py @@ -1,3 +1,5 @@ +"""Test deprecated commands.""" + import unittest from openbb_core.app.static.package_builder import PathHandler diff --git a/openbb_platform/core/tests/app/test_utils.py b/openbb_platform/core/tests/app/test_utils.py index 4b2bcfc5fb2..ab07be91597 100644 --- a/openbb_platform/core/tests/app/test_utils.py +++ b/openbb_platform/core/tests/app/test_utils.py @@ -1,3 +1,5 @@ +"""OpenBB Platform Core app utils tests.""" + import numpy as np import pandas as pd import pytest @@ -14,6 +16,8 @@ from openbb_core.app.utils import ( ) from openbb_core.provider.abstract.data import Data +# pylint: disable=W0621 + df = pd.DataFrame( { "x": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10], @@ -37,36 +41,42 @@ multi_index_base_model = [ def test_df_to_basemodel(): + """Test the df_to_basemodel helper.""" base_model = df_to_basemodel(df) assert isinstance(base_model, list) assert base_model[0].x == 1 # type: ignore[attr-defined] def test_df_to_basemodel_multiindex(): + """Test the df_to_basemodel helper with a multi-index DataFrame.""" base_model = df_to_basemodel(df_multiindex) assert isinstance(base_model, list) assert hasattr(base_model[0], "is_multiindex") def test_basemodel_to_df(): + """Test the basemodel_to_df helper.""" df = basemodel_to_df(simple_base_model) assert isinstance(df, pd.DataFrame) assert df.shape == (8, 3) def test_basemodel_to_multiindex_df(): + """Test the basemodel_to_df helper with a multi-index DataFrame.""" df = basemodel_to_df(multi_index_base_model) assert isinstance(df, pd.DataFrame) assert isinstance(df.index, pd.MultiIndex) def test_get_target_column(): + """Test the get_target_column helper.""" target = get_target_column(df, "x") assert isinstance(target, pd.Series) assert target[0] == 1 def test_get_target_columns(): + """Test the get_target_columns helper.""" targets = get_target_columns(df, ["x", "y"]) assert isinstance(targets, pd.DataFrame) assert targets.shape == (10, 2) @@ -84,6 +94,7 @@ def test_get_target_columns(): ], ) def test_list_to_basemodel(data_list, expected): + """Test the list_to_basemodel helper.""" result = list_to_basemodel(data_list) for r, e in zip(result, expected): assert r.model_dump() == e.model_dump() @@ -101,6 +112,7 @@ def test_list_to_basemodel(data_list, expected): ], ) def test_dict_to_basemodel(data_dict, expected): + """Test the dict_to_basemodel helper.""" result = dict_to_basemodel(data_dict) assert result.model_dump() == expected.model_dump() @@ -123,6 +135,7 @@ def test_dict_to_basemodel(data_dict, expected): ], ) def test_ndarray_to_basemodel(array, expected): + """Test the ndarray_to_basemodel helper.""" result = ndarray_to_basemodel(array) for r, e in zip(result, expected): assert r.model_dump() == e.model_dump() @@ -139,6 +152,7 @@ def test_ndarray_to_basemodel(array, expected): ], ) def test_check_single_item(item, expected): + """Test the check_single_item helper.""" if expected is OpenBBError: with pytest.raises(OpenBBError): check_single_item(item) diff --git a/openbb_platform/core/tests/provider/test_registry_map.py b/openbb_platform/core/tests/provider/test_registry_map.py index 5e2e9e9f061..67c905a8821 100644 --- a/openbb_platform/core/tests/provider/test_registry_map.py +++ b/openbb_platform/core/tests/provider/test_registry_map.py @@ -9,8 +9,7 @@ from openbb_core.provider.registry_map import RegistryMap @pytest.fixture def load_registry_map(): """Mock the registry map.""" - registry_map = RegistryMap() - return registry_map + return RegistryMap() def test_get_credentials(load_registry_map): @@ -30,9 +29,12 @@ def test_get_available_providers(load_registry_map): def test_map_and_models(load_registry_map): """Test if the _get_map method behaves as expected.""" - map_, return_map = load_registry_map.map, load_registry_map.return_map + standard_extra, original_models = ( + load_registry_map.standard_extra, + load_registry_map.original_models, + ) models = load_registry_map.models - assert "EquityHistorical" in map_ - assert "EquityHistorical" in return_map + assert "EquityHistorical" in standard_extra + assert "EquityHistorical" in original_models assert "EquityHistorical" in models diff --git a/openbb_platform/core/tests/provider/utils/test_client.py b/openbb_platform/core/tests/provider/utils/test_client.py index 1c88c958853..5b018994d9b 100644 --- a/openbb_platform/core/tests/provider/utils/test_client.py +++ b/openbb_platform/core/tests/provider/utils/test_client.py @@ -1,3 +1,5 @@ +"""Test the client helper.""" + import gzip import json import zlib @@ -80,6 +82,7 @@ class MockClientSession(client.ClientSession): async def request( # type: ignore self, *args, raise_for_status: bool = False, **kwargs ) -> client.ClientResponse: + """Mock the request method.""" response = MockResponse(*args, **kwargs) if raise_for_status: diff --git a/openbb_platform/core/tests/provider/utils/test_helpers.py b/openbb_platform/core/tests/provider/utils/test_helpers.py index 4d37084e4e3..741ce6ee914 100644 --- a/openbb_platform/core/tests/provider/utils/test_helpers.py +++ b/openbb_platform/core/tests/provider/utils/test_helpers.py @@ -11,21 +11,31 @@ from openbb_core.provider.utils.helpers import ( to_snake_case, ) +# pylint: disable=unused-argument + class MockResponse: + """Mock the response.""" + def __init__(self): + """Initialize the mock response.""" self.status_code = 200 self.status = 200 async def json(self): + """Return the json response.""" return {"test": "test"} class MockSession: + """Mock the ClientSession.""" + def __init__(self): + """Initialize the mock session.""" self.response = MockResponse() - async def request(self, *args, **kwargs): + async def request(self, *args, **kwargs): # pylint: disable=unused-argument + """Mock the ClientSession.request method.""" if kwargs.get("raise_for_status", False): raise Exception("Test") diff --git a/openbb_platform/extensions/__init__.py b/openbb_platform/extensions/__init__.py index e69de29bb2d..a2fa55684fc 100644 --- a/openbb_platform/extensions/__init__.py +++ b/openbb_platform/extensions/__init__.py @@ -0,0 +1 @@ +"""OpenBB Platform Extensions.""" diff --git a/openbb_platform/extensions/commodity/integration/test_commodity_api.py b/openbb_platform/extensions/commodity/integration/test_commodity_api.py index 89f22935c9c..56e06076e4d 100644 --- a/openbb_platform/extensions/commodity/integration/test_commodity_api.py +++ b/openbb_platform/extensions/commodity/integration/test_commodity_api.py @@ -12,6 +12,7 @@ from openbb_core.provider.utils.helpers import get_querystring @pytest.fixture(scope="session") def headers(): + """Get the headers for the API request.""" userpass = f"{Env().API_USERNAME}:{Env().API_PASSWORD}" userpass_bytes = userpass.encode("ascii") base64_bytes = base64.b64encode(userpass_bytes) @@ -46,6 +47,7 @@ def headers(): ) @pytest.mark.integration def test_commodity_lbma_fixing(params, headers): + """Test the LBMA fixing endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) diff --git a/openbb_platform/extensions/commodity/integration/test_commodity_python.py b/openbb_platform/extensions/commodity/integration/test_commodity_python.py index c805ffcb269..192dac81a19 100644 --- a/openbb_platform/extensions/commodity/integration/test_commodity_python.py +++ b/openbb_platform/extensions/commodity/integration/test_commodity_python.py @@ -42,6 +42,7 @@ def obb(pytestconfig): # pylint: disable=inconsistent-return-statements ) @pytest.mark.integration def test_commodity_lbma_fixing(params, obb): + """Test the LBMA fixing endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.commodity.lbma_fixing(**params) diff --git a/openbb_platform/extensions/commodity/openbb_commodity/__init__.py b/openbb_platform/extensions/commodity/openbb_commodity/__init__.py index e69de29bb2d..c38801bad61 100644 --- a/openbb_platform/extensions/commodity/openbb_commodity/__init__.py +++ b/openbb_platform/extensions/commodity/openbb_commodity/__init__.py @@ -0,0 +1 @@ +"""OpenBB Commodity Extension.""" diff --git a/openbb_platform/extensions/commodity/openbb_commodity/commodity_router.py b/openbb_platform/extensions/commodity/openbb_commodity/commodity_router.py index ebf5401c28f..3d8482d6852 100644 --- a/openbb_platform/extensions/commodity/openbb_commodity/commodity_router.py +++ b/openbb_platform/extensions/commodity/openbb_commodity/commodity_router.py @@ -12,7 +12,7 @@ from openbb_core.app.query import Query from openbb_core.app.router import Router from pydantic import BaseModel -router = Router(prefix="") +router = Router(prefix="", description="Commodity market data.") # pylint: disable=unused-argument diff --git a/openbb_platform/extensions/commodity/poetry.lock b/openbb_platform/extensions/commodity/poetry.lock index a5af39a01ec..c3aaff6a76a 100644 --- a/openbb_platform/extensions/commodity/poetry.lock +++ b/openbb_platform/extensions/commodity/poetry.lock @@ -2,87 +2,87 @@ [[package]] name = "aiohttp" -version = "3.9.3" +version = "3.9.5" description = "Async http client/server framework (asyncio)" optional = false python-versions = ">=3.8" files = [ - {file = "aiohttp-3.9.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:939677b61f9d72a4fa2a042a5eee2a99a24001a67c13da113b2e30396567db54"}, - {file = "aiohttp-3.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1f5cd333fcf7590a18334c90f8c9147c837a6ec8a178e88d90a9b96ea03194cc"}, - {file = "aiohttp-3.9.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:82e6aa28dd46374f72093eda8bcd142f7771ee1eb9d1e223ff0fa7177a96b4a5"}, - {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f56455b0c2c7cc3b0c584815264461d07b177f903a04481dfc33e08a89f0c26b"}, - {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bca77a198bb6e69795ef2f09a5f4c12758487f83f33d63acde5f0d4919815768"}, - {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e083c285857b78ee21a96ba1eb1b5339733c3563f72980728ca2b08b53826ca5"}, - {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab40e6251c3873d86ea9b30a1ac6d7478c09277b32e14745d0d3c6e76e3c7e29"}, - {file = "aiohttp-3.9.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df822ee7feaaeffb99c1a9e5e608800bd8eda6e5f18f5cfb0dc7eeb2eaa6bbec"}, - {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:acef0899fea7492145d2bbaaaec7b345c87753168589cc7faf0afec9afe9b747"}, - {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cd73265a9e5ea618014802ab01babf1940cecb90c9762d8b9e7d2cc1e1969ec6"}, - {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:a78ed8a53a1221393d9637c01870248a6f4ea5b214a59a92a36f18151739452c"}, - {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:6b0e029353361f1746bac2e4cc19b32f972ec03f0f943b390c4ab3371840aabf"}, - {file = "aiohttp-3.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7cf5c9458e1e90e3c390c2639f1017a0379a99a94fdfad3a1fd966a2874bba52"}, - {file = "aiohttp-3.9.3-cp310-cp310-win32.whl", hash = "sha256:3e59c23c52765951b69ec45ddbbc9403a8761ee6f57253250c6e1536cacc758b"}, - {file = "aiohttp-3.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:055ce4f74b82551678291473f66dc9fb9048a50d8324278751926ff0ae7715e5"}, - {file = "aiohttp-3.9.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6b88f9386ff1ad91ace19d2a1c0225896e28815ee09fc6a8932fded8cda97c3d"}, - {file = "aiohttp-3.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c46956ed82961e31557b6857a5ca153c67e5476972e5f7190015018760938da2"}, - {file = "aiohttp-3.9.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:07b837ef0d2f252f96009e9b8435ec1fef68ef8b1461933253d318748ec1acdc"}, - {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad46e6f620574b3b4801c68255492e0159d1712271cc99d8bdf35f2043ec266"}, - {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ed3e046ea7b14938112ccd53d91c1539af3e6679b222f9469981e3dac7ba1ce"}, - {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:039df344b45ae0b34ac885ab5b53940b174530d4dd8a14ed8b0e2155b9dddccb"}, - {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7943c414d3a8d9235f5f15c22ace69787c140c80b718dcd57caaade95f7cd93b"}, - {file = "aiohttp-3.9.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84871a243359bb42c12728f04d181a389718710129b36b6aad0fc4655a7647d4"}, - {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5eafe2c065df5401ba06821b9a054d9cb2848867f3c59801b5d07a0be3a380ae"}, - {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9d3c9b50f19704552f23b4eaea1fc082fdd82c63429a6506446cbd8737823da3"}, - {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:f033d80bc6283092613882dfe40419c6a6a1527e04fc69350e87a9df02bbc283"}, - {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:2c895a656dd7e061b2fd6bb77d971cc38f2afc277229ce7dd3552de8313a483e"}, - {file = "aiohttp-3.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1f5a71d25cd8106eab05f8704cd9167b6e5187bcdf8f090a66c6d88b634802b4"}, - {file = "aiohttp-3.9.3-cp311-cp311-win32.whl", hash = "sha256:50fca156d718f8ced687a373f9e140c1bb765ca16e3d6f4fe116e3df7c05b2c5"}, - {file = "aiohttp-3.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:5fe9ce6c09668063b8447f85d43b8d1c4e5d3d7e92c63173e6180b2ac5d46dd8"}, - {file = "aiohttp-3.9.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:38a19bc3b686ad55804ae931012f78f7a534cce165d089a2059f658f6c91fa60"}, - {file = "aiohttp-3.9.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:770d015888c2a598b377bd2f663adfd947d78c0124cfe7b959e1ef39f5b13869"}, - {file = "aiohttp-3.9.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee43080e75fc92bf36219926c8e6de497f9b247301bbf88c5c7593d931426679"}, - {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:52df73f14ed99cee84865b95a3d9e044f226320a87af208f068ecc33e0c35b96"}, - {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc9b311743a78043b26ffaeeb9715dc360335e5517832f5a8e339f8a43581e4d"}, - {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b955ed993491f1a5da7f92e98d5dad3c1e14dc175f74517c4e610b1f2456fb11"}, - {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:504b6981675ace64c28bf4a05a508af5cde526e36492c98916127f5a02354d53"}, - {file = "aiohttp-3.9.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6fe5571784af92b6bc2fda8d1925cccdf24642d49546d3144948a6a1ed58ca5"}, - {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ba39e9c8627edc56544c8628cc180d88605df3892beeb2b94c9bc857774848ca"}, - {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e5e46b578c0e9db71d04c4b506a2121c0cb371dd89af17a0586ff6769d4c58c1"}, - {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:938a9653e1e0c592053f815f7028e41a3062e902095e5a7dc84617c87267ebd5"}, - {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:c3452ea726c76e92f3b9fae4b34a151981a9ec0a4847a627c43d71a15ac32aa6"}, - {file = "aiohttp-3.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:ff30218887e62209942f91ac1be902cc80cddb86bf00fbc6783b7a43b2bea26f"}, - {file = "aiohttp-3.9.3-cp312-cp312-win32.whl", hash = "sha256:38f307b41e0bea3294a9a2a87833191e4bcf89bb0365e83a8be3a58b31fb7f38"}, - {file = "aiohttp-3.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:b791a3143681a520c0a17e26ae7465f1b6f99461a28019d1a2f425236e6eedb5"}, - {file = "aiohttp-3.9.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0ed621426d961df79aa3b963ac7af0d40392956ffa9be022024cd16297b30c8c"}, - {file = "aiohttp-3.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7f46acd6a194287b7e41e87957bfe2ad1ad88318d447caf5b090012f2c5bb528"}, - {file = "aiohttp-3.9.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:feeb18a801aacb098220e2c3eea59a512362eb408d4afd0c242044c33ad6d542"}, - {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f734e38fd8666f53da904c52a23ce517f1b07722118d750405af7e4123933511"}, - {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b40670ec7e2156d8e57f70aec34a7216407848dfe6c693ef131ddf6e76feb672"}, - {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fdd215b7b7fd4a53994f238d0f46b7ba4ac4c0adb12452beee724ddd0743ae5d"}, - {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:017a21b0df49039c8f46ca0971b3a7fdc1f56741ab1240cb90ca408049766168"}, - {file = "aiohttp-3.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e99abf0bba688259a496f966211c49a514e65afa9b3073a1fcee08856e04425b"}, - {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:648056db9a9fa565d3fa851880f99f45e3f9a771dd3ff3bb0c048ea83fb28194"}, - {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8aacb477dc26797ee089721536a292a664846489c49d3ef9725f992449eda5a8"}, - {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:522a11c934ea660ff8953eda090dcd2154d367dec1ae3c540aff9f8a5c109ab4"}, - {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5bce0dc147ca85caa5d33debc4f4d65e8e8b5c97c7f9f660f215fa74fc49a321"}, - {file = "aiohttp-3.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b4af9f25b49a7be47c0972139e59ec0e8285c371049df1a63b6ca81fdd216a2"}, - {file = "aiohttp-3.9.3-cp38-cp38-win32.whl", hash = "sha256:298abd678033b8571995650ccee753d9458dfa0377be4dba91e4491da3f2be63"}, - {file = "aiohttp-3.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:69361bfdca5468c0488d7017b9b1e5ce769d40b46a9f4a2eed26b78619e9396c"}, - {file = "aiohttp-3.9.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0fa43c32d1643f518491d9d3a730f85f5bbaedcbd7fbcae27435bb8b7a061b29"}, - {file = "aiohttp-3.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:835a55b7ca49468aaaac0b217092dfdff370e6c215c9224c52f30daaa735c1c1"}, - {file = "aiohttp-3.9.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06a9b2c8837d9a94fae16c6223acc14b4dfdff216ab9b7202e07a9a09541168f"}, - {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abf151955990d23f84205286938796c55ff11bbfb4ccfada8c9c83ae6b3c89a3"}, - {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59c26c95975f26e662ca78fdf543d4eeaef70e533a672b4113dd888bd2423caa"}, - {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f95511dd5d0e05fd9728bac4096319f80615aaef4acbecb35a990afebe953b0e"}, - {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:595f105710293e76b9dc09f52e0dd896bd064a79346234b521f6b968ffdd8e58"}, - {file = "aiohttp-3.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7c8b816c2b5af5c8a436df44ca08258fc1a13b449393a91484225fcb7545533"}, - {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f1088fa100bf46e7b398ffd9904f4808a0612e1d966b4aa43baa535d1b6341eb"}, - {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f59dfe57bb1ec82ac0698ebfcdb7bcd0e99c255bd637ff613760d5f33e7c81b3"}, - {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:361a1026c9dd4aba0109e4040e2aecf9884f5cfe1b1b1bd3d09419c205e2e53d"}, - {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:363afe77cfcbe3a36353d8ea133e904b108feea505aa4792dad6585a8192c55a"}, - {file = "aiohttp-3.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e2c45c208c62e955e8256949eb225bd8b66a4c9b6865729a786f2aa79b72e9d"}, - {file = "aiohttp-3.9.3-cp39-cp39-win32.whl", hash = "sha256:f7217af2e14da0856e082e96ff637f14ae45c10a5714b63c77f26d8884cf1051"}, - {file = "aiohttp-3.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:27468897f628c627230dba07ec65dc8d0db566923c48f29e084ce382119802bc"}, - {file = "aiohttp-3.9.3.tar.gz", hash = "sha256:90842933e5d1ff760fae6caca4b2b3edba53ba8f4b71e95dacf2818a2aca06f7"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10"}, + {file = "aiohttp-3.9.5-cp310-cp310-win32.whl", hash = "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb"}, + {file = "aiohttp-3.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"}, + {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da"}, + {file = "aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59"}, + {file = "aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe"}, + {file = "aiohttp-3.9.5-cp38-cp38-win32.whl", hash = "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da"}, + {file = "aiohttp-3.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-win32.whl", hash = "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09"}, + {file = "aiohttp-3.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1"}, + {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"}, ] [package.dependencies] @@ -323,13 +323,13 @@ files = [ [[package]] name = "ecdsa" -version = "0.18.0" +version = "0.19.0" description = "ECDSA cryptographic signature library (pure python)" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.6" files = [ - {file = "ecdsa-0.18.0-py2.py3-none-any.whl", hash = "sha256:80600258e7ed2f16b9aa1d7c295bd70194109ad5a30fdee0eaeefef1d4c559dd"}, - {file = "ecdsa-0.18.0.tar.gz", hash = "sha256:190348041559e21b22a1d65cee485282ca11a6f81d503fddb84d5017e9ed1e49"}, + {file = "ecdsa-0.19.0-py2.py3-none-any.whl", hash = "sha256:2cea9b88407fdac7bbeca0833b189e4c9c53f2ef1e1eaa29f6224dbc809b707a"}, + {file = "ecdsa-0.19.0.tar.gz", hash = "sha256:60eaad1199659900dd0af521ed462b793bbdf867432b3948e87416ae4caf6bf8"}, ] [package.dependencies] @@ -341,13 +341,13 @@ gmpy2 = ["gmpy2"] [[package]] name = "exceptiongroup" -version = "1.2.0" +version = "1.2.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, - {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, + {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, + {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, ] [package.extras] @@ -493,13 +493,13 @@ lxml = ["lxml"] [[package]] name = "idna" -version = "3.6" +version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, - {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] @@ -670,58 +670,58 @@ files = [ [[package]] name = "numpy" -version = "1.26.3" +version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.26.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:806dd64230dbbfaca8a27faa64e2f414bf1c6622ab78cc4264f7f5f028fee3bf"}, - {file = "numpy-1.26.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02f98011ba4ab17f46f80f7f8f1c291ee7d855fcef0a5a98db80767a468c85cd"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d45b3ec2faed4baca41c76617fcdcfa4f684ff7a151ce6fc78ad3b6e85af0a6"}, - {file = "numpy-1.26.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bdd2b45bf079d9ad90377048e2747a0c82351989a2165821f0c96831b4a2a54b"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:211ddd1e94817ed2d175b60b6374120244a4dd2287f4ece45d49228b4d529178"}, - {file = "numpy-1.26.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1240f767f69d7c4c8a29adde2310b871153df9b26b5cb2b54a561ac85146485"}, - {file = "numpy-1.26.3-cp310-cp310-win32.whl", hash = "sha256:21a9484e75ad018974a2fdaa216524d64ed4212e418e0a551a2d83403b0531d3"}, - {file = "numpy-1.26.3-cp310-cp310-win_amd64.whl", hash = "sha256:9e1591f6ae98bcfac2a4bbf9221c0b92ab49762228f38287f6eeb5f3f55905ce"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b831295e5472954104ecb46cd98c08b98b49c69fdb7040483aff799a755a7374"}, - {file = "numpy-1.26.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9e87562b91f68dd8b1c39149d0323b42e0082db7ddb8e934ab4c292094d575d6"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c66d6fec467e8c0f975818c1796d25c53521124b7cfb760114be0abad53a0a2"}, - {file = "numpy-1.26.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25e2811a9c932e43943a2615e65fc487a0b6b49218899e62e426e7f0a57eeda"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:af36e0aa45e25c9f57bf684b1175e59ea05d9a7d3e8e87b7ae1a1da246f2767e"}, - {file = "numpy-1.26.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:51c7f1b344f302067b02e0f5b5d2daa9ed4a721cf49f070280ac202738ea7f00"}, - {file = "numpy-1.26.3-cp311-cp311-win32.whl", hash = "sha256:7ca4f24341df071877849eb2034948459ce3a07915c2734f1abb4018d9c49d7b"}, - {file = "numpy-1.26.3-cp311-cp311-win_amd64.whl", hash = "sha256:39763aee6dfdd4878032361b30b2b12593fb445ddb66bbac802e2113eb8a6ac4"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a7081fd19a6d573e1a05e600c82a1c421011db7935ed0d5c483e9dd96b99cf13"}, - {file = "numpy-1.26.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12c70ac274b32bc00c7f61b515126c9205323703abb99cd41836e8125ea0043e"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7f784e13e598e9594750b2ef6729bcd5a47f6cfe4a12cca13def35e06d8163e3"}, - {file = "numpy-1.26.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f24750ef94d56ce6e33e4019a8a4d68cfdb1ef661a52cdaee628a56d2437419"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:77810ef29e0fb1d289d225cabb9ee6cf4d11978a00bb99f7f8ec2132a84e0166"}, - {file = "numpy-1.26.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8ed07a90f5450d99dad60d3799f9c03c6566709bd53b497eb9ccad9a55867f36"}, - {file = "numpy-1.26.3-cp312-cp312-win32.whl", hash = "sha256:f73497e8c38295aaa4741bdfa4fda1a5aedda5473074369eca10626835445511"}, - {file = "numpy-1.26.3-cp312-cp312-win_amd64.whl", hash = "sha256:da4b0c6c699a0ad73c810736303f7fbae483bcb012e38d7eb06a5e3b432c981b"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1666f634cb3c80ccbd77ec97bc17337718f56d6658acf5d3b906ca03e90ce87f"}, - {file = "numpy-1.26.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18c3319a7d39b2c6a9e3bb75aab2304ab79a811ac0168a671a62e6346c29b03f"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b7e807d6888da0db6e7e75838444d62495e2b588b99e90dd80c3459594e857b"}, - {file = "numpy-1.26.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4d362e17bcb0011738c2d83e0a65ea8ce627057b2fdda37678f4374a382a137"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b8c275f0ae90069496068c714387b4a0eba5d531aace269559ff2b43655edd58"}, - {file = "numpy-1.26.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cc0743f0302b94f397a4a65a660d4cd24267439eb16493fb3caad2e4389bccbb"}, - {file = "numpy-1.26.3-cp39-cp39-win32.whl", hash = "sha256:9bc6d1a7f8cedd519c4b7b1156d98e051b726bf160715b769106661d567b3f03"}, - {file = "numpy-1.26.3-cp39-cp39-win_amd64.whl", hash = "sha256:867e3644e208c8922a3be26fc6bbf112a035f50f0a86497f98f228c50c607bb2"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3c67423b3703f8fbd90f5adaa37f85b5794d3366948efe9a5190a5f3a83fc34e"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46f47ee566d98849323f01b349d58f2557f02167ee301e5e28809a8c0e27a2d0"}, - {file = "numpy-1.26.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8474703bffc65ca15853d5fd4d06b18138ae90c17c8d12169968e998e448bb5"}, - {file = "numpy-1.26.3.tar.gz", hash = "sha256:697df43e2b6310ecc9d95f05d5ef20eacc09c7c4ecc9da3f235d39e71b7da1e4"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -778,8 +778,8 @@ files = [ [package.dependencies] numpy = [ {version = ">=1.20.3", markers = "python_version < \"3.10\""}, - {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, {version = ">=1.21.0", markers = "python_version >= \"3.10\" and python_version < \"3.11\""}, + {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, ] python-dateutil = ">=2.8.2" pytz = ">=2020.1" @@ -810,13 +810,13 @@ xml = ["lxml (>=4.6.3)"] [[package]] name = "posthog" -version = "3.3.4" +version = "3.5.0" description = "Integrate PostHog into any python application." optional = false python-versions = "*" files = [ - {file = "posthog-3.3.4-py2.py3-none-any.whl", hash = "sha256:2fec5112c6df1d6a214a899e409659ed354511236537e861f1556a0c88e3fd26"}, - {file = "posthog-3.3.4.tar.gz", hash = "sha256:23a891639bc0a4f6fe4d04864d02410c60b7ee5d523de79becbc7325c983dba9"}, + {file = "posthog-3.5.0-py2.py3-none-any.whl", hash = "sha256:3c672be7ba6f95d555ea207d4486c171d06657eb34b3ce25eb043bfe7b6b5b76"}, + {file = "posthog-3.5.0.tar.gz", hash = "sha256:8f7e3b2c6e8714d0c0c542a2109b83a7549f63b7113a133ab2763a89245ef2ef"}, ] [package.dependencies] @@ -833,29 +833,29 @@ test = ["coverage", "flake8", "freezegun (==0.3.15)", "mock (>=2.0.0)", "pylint" [[package]] name = "pyasn1" -version = "0.5.1" +version = "0.6.0" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = ">=3.8" files = [ - {file = "pyasn1-0.5.1-py2.py3-none-any.whl", hash = "sha256:4439847c58d40b1d0a573d07e3856e95333f1976294494c325775aeca506eb58"}, - {file = "pyasn1-0.5.1.tar.gz", hash = "sha256:6d391a96e59b23130a5cfa74d6fd7f388dbbe26cc8f1edf39fdddf08d9d6676c"}, + {file = "pyasn1-0.6.0-py2.py3-none-any.whl", hash = "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473"}, + {file = "pyasn1-0.6.0.tar.gz", hash = "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c"}, ] [[package]] name = "pydantic" -version = "2.6.0" +version = "2.7.0" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic-2.6.0-py3-none-any.whl", hash = "sha256:1440966574e1b5b99cf75a13bec7b20e3512e8a61b894ae252f56275e2c465ae"}, - {file = "pydantic-2.6.0.tar.gz", hash = "sha256:ae887bd94eb404b09d86e4d12f93893bdca79d766e738528c6fa1c849f3c6bcf"}, + {file = "pydantic-2.7.0-py3-none-any.whl", hash = "sha256:9dee74a271705f14f9a1567671d144a851c675b072736f0a7b2608fd9e495352"}, + {file = "pydantic-2.7.0.tar.gz", hash = "sha256:b5ecdd42262ca2462e2624793551e80911a1e989f462910bb81aef974b4bb383"}, ] [package.dependencies] annotated-types = ">=0.4.0" -pydantic-core = "2.16.1" +pydantic-core = "2.18.1" typing-extensions = ">=4.6.1" [package.extras] @@ -863,90 +863,90 @@ email = ["email-validator (>=2.0.0)"] [[package]] name = "pydantic-core" -version = "2.16.1" -description = "" +version = "2.18.1" +description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" files = [ - {file = "pydantic_core-2.16.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:300616102fb71241ff477a2cbbc847321dbec49428434a2f17f37528721c4948"}, - {file = "pydantic_core-2.16.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5511f962dd1b9b553e9534c3b9c6a4b0c9ded3d8c2be96e61d56f933feef9e1f"}, - {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98f0edee7ee9cc7f9221af2e1b95bd02810e1c7a6d115cfd82698803d385b28f"}, - {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9795f56aa6b2296f05ac79d8a424e94056730c0b860a62b0fdcfe6340b658cc8"}, - {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c45f62e4107ebd05166717ac58f6feb44471ed450d07fecd90e5f69d9bf03c48"}, - {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:462d599299c5971f03c676e2b63aa80fec5ebc572d89ce766cd11ca8bcb56f3f"}, - {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ebaa4bf6386a3b22eec518da7d679c8363fb7fb70cf6972161e5542f470798"}, - {file = "pydantic_core-2.16.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:99f9a50b56713a598d33bc23a9912224fc5d7f9f292444e6664236ae471ddf17"}, - {file = "pydantic_core-2.16.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8ec364e280db4235389b5e1e6ee924723c693cbc98e9d28dc1767041ff9bc388"}, - {file = "pydantic_core-2.16.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:653a5dfd00f601a0ed6654a8b877b18d65ac32c9d9997456e0ab240807be6cf7"}, - {file = "pydantic_core-2.16.1-cp310-none-win32.whl", hash = "sha256:1661c668c1bb67b7cec96914329d9ab66755911d093bb9063c4c8914188af6d4"}, - {file = "pydantic_core-2.16.1-cp310-none-win_amd64.whl", hash = "sha256:561be4e3e952c2f9056fba5267b99be4ec2afadc27261505d4992c50b33c513c"}, - {file = "pydantic_core-2.16.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:102569d371fadc40d8f8598a59379c37ec60164315884467052830b28cc4e9da"}, - {file = "pydantic_core-2.16.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:735dceec50fa907a3c314b84ed609dec54b76a814aa14eb90da31d1d36873a5e"}, - {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e83ebbf020be727d6e0991c1b192a5c2e7113eb66e3def0cd0c62f9f266247e4"}, - {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:30a8259569fbeec49cfac7fda3ec8123486ef1b729225222f0d41d5f840b476f"}, - {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:920c4897e55e2881db6a6da151198e5001552c3777cd42b8a4c2f72eedc2ee91"}, - {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5247a3d74355f8b1d780d0f3b32a23dd9f6d3ff43ef2037c6dcd249f35ecf4c"}, - {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d5bea8012df5bb6dda1e67d0563ac50b7f64a5d5858348b5c8cb5043811c19d"}, - {file = "pydantic_core-2.16.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ed3025a8a7e5a59817b7494686d449ebfbe301f3e757b852c8d0d1961d6be864"}, - {file = "pydantic_core-2.16.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:06f0d5a1d9e1b7932477c172cc720b3b23c18762ed7a8efa8398298a59d177c7"}, - {file = "pydantic_core-2.16.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:150ba5c86f502c040b822777e2e519b5625b47813bd05f9273a8ed169c97d9ae"}, - {file = "pydantic_core-2.16.1-cp311-none-win32.whl", hash = "sha256:d6cbdf12ef967a6aa401cf5cdf47850559e59eedad10e781471c960583f25aa1"}, - {file = "pydantic_core-2.16.1-cp311-none-win_amd64.whl", hash = "sha256:afa01d25769af33a8dac0d905d5c7bb2d73c7c3d5161b2dd6f8b5b5eea6a3c4c"}, - {file = "pydantic_core-2.16.1-cp311-none-win_arm64.whl", hash = "sha256:1a2fe7b00a49b51047334d84aafd7e39f80b7675cad0083678c58983662da89b"}, - {file = "pydantic_core-2.16.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:0f478ec204772a5c8218e30eb813ca43e34005dff2eafa03931b3d8caef87d51"}, - {file = "pydantic_core-2.16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f1936ef138bed2165dd8573aa65e3095ef7c2b6247faccd0e15186aabdda7f66"}, - {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99d3a433ef5dc3021c9534a58a3686c88363c591974c16c54a01af7efd741f13"}, - {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bd88f40f2294440d3f3c6308e50d96a0d3d0973d6f1a5732875d10f569acef49"}, - {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fac641bbfa43d5a1bed99d28aa1fded1984d31c670a95aac1bf1d36ac6ce137"}, - {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:72bf9308a82b75039b8c8edd2be2924c352eda5da14a920551a8b65d5ee89253"}, - {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb4363e6c9fc87365c2bc777a1f585a22f2f56642501885ffc7942138499bf54"}, - {file = "pydantic_core-2.16.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:20f724a023042588d0f4396bbbcf4cffd0ddd0ad3ed4f0d8e6d4ac4264bae81e"}, - {file = "pydantic_core-2.16.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fb4370b15111905bf8b5ba2129b926af9470f014cb0493a67d23e9d7a48348e8"}, - {file = "pydantic_core-2.16.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:23632132f1fd608034f1a56cc3e484be00854db845b3a4a508834be5a6435a6f"}, - {file = "pydantic_core-2.16.1-cp312-none-win32.whl", hash = "sha256:b9f3e0bffad6e238f7acc20c393c1ed8fab4371e3b3bc311020dfa6020d99212"}, - {file = "pydantic_core-2.16.1-cp312-none-win_amd64.whl", hash = "sha256:a0b4cfe408cd84c53bab7d83e4209458de676a6ec5e9c623ae914ce1cb79b96f"}, - {file = "pydantic_core-2.16.1-cp312-none-win_arm64.whl", hash = "sha256:d195add190abccefc70ad0f9a0141ad7da53e16183048380e688b466702195dd"}, - {file = "pydantic_core-2.16.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:502c062a18d84452858f8aea1e520e12a4d5228fc3621ea5061409d666ea1706"}, - {file = "pydantic_core-2.16.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d8c032ccee90b37b44e05948b449a2d6baed7e614df3d3f47fe432c952c21b60"}, - {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:920f4633bee43d7a2818e1a1a788906df5a17b7ab6fe411220ed92b42940f818"}, - {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9f5d37ff01edcbace53a402e80793640c25798fb7208f105d87a25e6fcc9ea06"}, - {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:399166f24c33a0c5759ecc4801f040dbc87d412c1a6d6292b2349b4c505effc9"}, - {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ac89ccc39cd1d556cc72d6752f252dc869dde41c7c936e86beac5eb555041b66"}, - {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:73802194f10c394c2bedce7a135ba1d8ba6cff23adf4217612bfc5cf060de34c"}, - {file = "pydantic_core-2.16.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8fa00fa24ffd8c31fac081bf7be7eb495be6d248db127f8776575a746fa55c95"}, - {file = "pydantic_core-2.16.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:601d3e42452cd4f2891c13fa8c70366d71851c1593ed42f57bf37f40f7dca3c8"}, - {file = "pydantic_core-2.16.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:07982b82d121ed3fc1c51faf6e8f57ff09b1325d2efccaa257dd8c0dd937acca"}, - {file = "pydantic_core-2.16.1-cp38-none-win32.whl", hash = "sha256:d0bf6f93a55d3fa7a079d811b29100b019784e2ee6bc06b0bb839538272a5610"}, - {file = "pydantic_core-2.16.1-cp38-none-win_amd64.whl", hash = "sha256:fbec2af0ebafa57eb82c18c304b37c86a8abddf7022955d1742b3d5471a6339e"}, - {file = "pydantic_core-2.16.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:a497be217818c318d93f07e14502ef93d44e6a20c72b04c530611e45e54c2196"}, - {file = "pydantic_core-2.16.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:694a5e9f1f2c124a17ff2d0be613fd53ba0c26de588eb4bdab8bca855e550d95"}, - {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d4dfc66abea3ec6d9f83e837a8f8a7d9d3a76d25c9911735c76d6745950e62c"}, - {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8655f55fe68c4685673265a650ef71beb2d31871c049c8b80262026f23605ee3"}, - {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:21e3298486c4ea4e4d5cc6fb69e06fb02a4e22089304308817035ac006a7f506"}, - {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:71b4a48a7427f14679f0015b13c712863d28bb1ab700bd11776a5368135c7d60"}, - {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10dca874e35bb60ce4f9f6665bfbfad050dd7573596608aeb9e098621ac331dc"}, - {file = "pydantic_core-2.16.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fa496cd45cda0165d597e9d6f01e36c33c9508f75cf03c0a650018c5048f578e"}, - {file = "pydantic_core-2.16.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5317c04349472e683803da262c781c42c5628a9be73f4750ac7d13040efb5d2d"}, - {file = "pydantic_core-2.16.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:42c29d54ed4501a30cd71015bf982fa95e4a60117b44e1a200290ce687d3e640"}, - {file = "pydantic_core-2.16.1-cp39-none-win32.whl", hash = "sha256:ba07646f35e4e49376c9831130039d1b478fbfa1215ae62ad62d2ee63cf9c18f"}, - {file = "pydantic_core-2.16.1-cp39-none-win_amd64.whl", hash = "sha256:2133b0e412a47868a358713287ff9f9a328879da547dc88be67481cdac529118"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:d25ef0c33f22649b7a088035fd65ac1ce6464fa2876578df1adad9472f918a76"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:99c095457eea8550c9fa9a7a992e842aeae1429dab6b6b378710f62bfb70b394"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b49c604ace7a7aa8af31196abbf8f2193be605db6739ed905ecaf62af31ccae0"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c56da23034fe66221f2208c813d8aa509eea34d97328ce2add56e219c3a9f41c"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cebf8d56fee3b08ad40d332a807ecccd4153d3f1ba8231e111d9759f02edfd05"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:1ae8048cba95f382dba56766525abca438328455e35c283bb202964f41a780b0"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:780daad9e35b18d10d7219d24bfb30148ca2afc309928e1d4d53de86822593dc"}, - {file = "pydantic_core-2.16.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c94b5537bf6ce66e4d7830c6993152940a188600f6ae044435287753044a8fe2"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:adf28099d061a25fbcc6531febb7a091e027605385de9fe14dd6a97319d614cf"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:644904600c15816a1f9a1bafa6aab0d21db2788abcdf4e2a77951280473f33e1"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87bce04f09f0552b66fca0c4e10da78d17cb0e71c205864bab4e9595122cb9d9"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:877045a7969ace04d59516d5d6a7dee13106822f99a5d8df5e6822941f7bedc8"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9c46e556ee266ed3fb7b7a882b53df3c76b45e872fdab8d9cf49ae5e91147fd7"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:4eebbd049008eb800f519578e944b8dc8e0f7d59a5abb5924cc2d4ed3a1834ff"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:c0be58529d43d38ae849a91932391eb93275a06b93b79a8ab828b012e916a206"}, - {file = "pydantic_core-2.16.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b1fc07896fc1851558f532dffc8987e526b682ec73140886c831d773cef44b76"}, - {file = "pydantic_core-2.16.1.tar.gz", hash = "sha256:daff04257b49ab7f4b3f73f98283d3dbb1a65bf3500d55c7beac3c66c310fe34"}, + {file = "pydantic_core-2.18.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:ee9cf33e7fe14243f5ca6977658eb7d1042caaa66847daacbd2117adb258b226"}, + {file = "pydantic_core-2.18.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6b7bbb97d82659ac8b37450c60ff2e9f97e4eb0f8a8a3645a5568b9334b08b50"}, + {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df4249b579e75094f7e9bb4bd28231acf55e308bf686b952f43100a5a0be394c"}, + {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d0491006a6ad20507aec2be72e7831a42efc93193d2402018007ff827dc62926"}, + {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ae80f72bb7a3e397ab37b53a2b49c62cc5496412e71bc4f1277620a7ce3f52b"}, + {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:58aca931bef83217fca7a390e0486ae327c4af9c3e941adb75f8772f8eeb03a1"}, + {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1be91ad664fc9245404a789d60cba1e91c26b1454ba136d2a1bf0c2ac0c0505a"}, + {file = "pydantic_core-2.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:667880321e916a8920ef49f5d50e7983792cf59f3b6079f3c9dac2b88a311d17"}, + {file = "pydantic_core-2.18.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f7054fdc556f5421f01e39cbb767d5ec5c1139ea98c3e5b350e02e62201740c7"}, + {file = "pydantic_core-2.18.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:030e4f9516f9947f38179249778709a460a3adb516bf39b5eb9066fcfe43d0e6"}, + {file = "pydantic_core-2.18.1-cp310-none-win32.whl", hash = "sha256:2e91711e36e229978d92642bfc3546333a9127ecebb3f2761372e096395fc649"}, + {file = "pydantic_core-2.18.1-cp310-none-win_amd64.whl", hash = "sha256:9a29726f91c6cb390b3c2338f0df5cd3e216ad7a938762d11c994bb37552edb0"}, + {file = "pydantic_core-2.18.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:9ece8a49696669d483d206b4474c367852c44815fca23ac4e48b72b339807f80"}, + {file = "pydantic_core-2.18.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7a5d83efc109ceddb99abd2c1316298ced2adb4570410defe766851a804fcd5b"}, + {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7973c381283783cd1043a8c8f61ea5ce7a3a58b0369f0ee0ee975eaf2f2a1b"}, + {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:54c7375c62190a7845091f521add19b0f026bcf6ae674bdb89f296972272e86d"}, + {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd63cec4e26e790b70544ae5cc48d11b515b09e05fdd5eff12e3195f54b8a586"}, + {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:561cf62c8a3498406495cfc49eee086ed2bb186d08bcc65812b75fda42c38294"}, + {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68717c38a68e37af87c4da20e08f3e27d7e4212e99e96c3d875fbf3f4812abfc"}, + {file = "pydantic_core-2.18.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2d5728e93d28a3c63ee513d9ffbac9c5989de8c76e049dbcb5bfe4b923a9739d"}, + {file = "pydantic_core-2.18.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f0f17814c505f07806e22b28856c59ac80cee7dd0fbb152aed273e116378f519"}, + {file = "pydantic_core-2.18.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d816f44a51ba5175394bc6c7879ca0bd2be560b2c9e9f3411ef3a4cbe644c2e9"}, + {file = "pydantic_core-2.18.1-cp311-none-win32.whl", hash = "sha256:09f03dfc0ef8c22622eaa8608caa4a1e189cfb83ce847045eca34f690895eccb"}, + {file = "pydantic_core-2.18.1-cp311-none-win_amd64.whl", hash = "sha256:27f1009dc292f3b7ca77feb3571c537276b9aad5dd4efb471ac88a8bd09024e9"}, + {file = "pydantic_core-2.18.1-cp311-none-win_arm64.whl", hash = "sha256:48dd883db92e92519201f2b01cafa881e5f7125666141a49ffba8b9facc072b0"}, + {file = "pydantic_core-2.18.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:b6b0e4912030c6f28bcb72b9ebe4989d6dc2eebcd2a9cdc35fefc38052dd4fe8"}, + {file = "pydantic_core-2.18.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3202a429fe825b699c57892d4371c74cc3456d8d71b7f35d6028c96dfecad31"}, + {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a3982b0a32d0a88b3907e4b0dc36809fda477f0757c59a505d4e9b455f384b8b"}, + {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25595ac311f20e5324d1941909b0d12933f1fd2171075fcff763e90f43e92a0d"}, + {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:14fe73881cf8e4cbdaded8ca0aa671635b597e42447fec7060d0868b52d074e6"}, + {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca976884ce34070799e4dfc6fbd68cb1d181db1eefe4a3a94798ddfb34b8867f"}, + {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:684d840d2c9ec5de9cb397fcb3f36d5ebb6fa0d94734f9886032dd796c1ead06"}, + {file = "pydantic_core-2.18.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:54764c083bbe0264f0f746cefcded6cb08fbbaaf1ad1d78fb8a4c30cff999a90"}, + {file = "pydantic_core-2.18.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:201713f2f462e5c015b343e86e68bd8a530a4f76609b33d8f0ec65d2b921712a"}, + {file = "pydantic_core-2.18.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fd1a9edb9dd9d79fbeac1ea1f9a8dd527a6113b18d2e9bcc0d541d308dae639b"}, + {file = "pydantic_core-2.18.1-cp312-none-win32.whl", hash = "sha256:d5e6b7155b8197b329dc787356cfd2684c9d6a6b1a197f6bbf45f5555a98d411"}, + {file = "pydantic_core-2.18.1-cp312-none-win_amd64.whl", hash = "sha256:9376d83d686ec62e8b19c0ac3bf8d28d8a5981d0df290196fb6ef24d8a26f0d6"}, + {file = "pydantic_core-2.18.1-cp312-none-win_arm64.whl", hash = "sha256:c562b49c96906b4029b5685075fe1ebd3b5cc2601dfa0b9e16c2c09d6cbce048"}, + {file = "pydantic_core-2.18.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:3e352f0191d99fe617371096845070dee295444979efb8f27ad941227de6ad09"}, + {file = "pydantic_core-2.18.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c0295d52b012cbe0d3059b1dba99159c3be55e632aae1999ab74ae2bd86a33d7"}, + {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56823a92075780582d1ffd4489a2e61d56fd3ebb4b40b713d63f96dd92d28144"}, + {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:dd3f79e17b56741b5177bcc36307750d50ea0698df6aa82f69c7db32d968c1c2"}, + {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38a5024de321d672a132b1834a66eeb7931959c59964b777e8f32dbe9523f6b1"}, + {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2ce426ee691319d4767748c8e0895cfc56593d725594e415f274059bcf3cb76"}, + {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2adaeea59849ec0939af5c5d476935f2bab4b7f0335b0110f0f069a41024278e"}, + {file = "pydantic_core-2.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9b6431559676a1079eac0f52d6d0721fb8e3c5ba43c37bc537c8c83724031feb"}, + {file = "pydantic_core-2.18.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:85233abb44bc18d16e72dc05bf13848a36f363f83757541f1a97db2f8d58cfd9"}, + {file = "pydantic_core-2.18.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:641a018af4fe48be57a2b3d7a1f0f5dbca07c1d00951d3d7463f0ac9dac66622"}, + {file = "pydantic_core-2.18.1-cp38-none-win32.whl", hash = "sha256:63d7523cd95d2fde0d28dc42968ac731b5bb1e516cc56b93a50ab293f4daeaad"}, + {file = "pydantic_core-2.18.1-cp38-none-win_amd64.whl", hash = "sha256:907a4d7720abfcb1c81619863efd47c8a85d26a257a2dbebdb87c3b847df0278"}, + {file = "pydantic_core-2.18.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:aad17e462f42ddbef5984d70c40bfc4146c322a2da79715932cd8976317054de"}, + {file = "pydantic_core-2.18.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:94b9769ba435b598b547c762184bcfc4783d0d4c7771b04a3b45775c3589ca44"}, + {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:80e0e57cc704a52fb1b48f16d5b2c8818da087dbee6f98d9bf19546930dc64b5"}, + {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:76b86e24039c35280ceee6dce7e62945eb93a5175d43689ba98360ab31eebc4a"}, + {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12a05db5013ec0ca4a32cc6433f53faa2a014ec364031408540ba858c2172bb0"}, + {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:250ae39445cb5475e483a36b1061af1bc233de3e9ad0f4f76a71b66231b07f88"}, + {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a32204489259786a923e02990249c65b0f17235073149d0033efcebe80095570"}, + {file = "pydantic_core-2.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6395a4435fa26519fd96fdccb77e9d00ddae9dd6c742309bd0b5610609ad7fb2"}, + {file = "pydantic_core-2.18.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2533ad2883f001efa72f3d0e733fb846710c3af6dcdd544fe5bf14fa5fe2d7db"}, + {file = "pydantic_core-2.18.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b560b72ed4816aee52783c66854d96157fd8175631f01ef58e894cc57c84f0f6"}, + {file = "pydantic_core-2.18.1-cp39-none-win32.whl", hash = "sha256:582cf2cead97c9e382a7f4d3b744cf0ef1a6e815e44d3aa81af3ad98762f5a9b"}, + {file = "pydantic_core-2.18.1-cp39-none-win_amd64.whl", hash = "sha256:ca71d501629d1fa50ea7fa3b08ba884fe10cefc559f5c6c8dfe9036c16e8ae89"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:e178e5b66a06ec5bf51668ec0d4ac8cfb2bdcb553b2c207d58148340efd00143"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:72722ce529a76a4637a60be18bd789d8fb871e84472490ed7ddff62d5fed620d"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fe0c1ce5b129455e43f941f7a46f61f3d3861e571f2905d55cdbb8b5c6f5e2c"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4284c621f06a72ce2cb55f74ea3150113d926a6eb78ab38340c08f770eb9b4d"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a0c3e718f4e064efde68092d9d974e39572c14e56726ecfaeebbe6544521f47"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2027493cc44c23b598cfaf200936110433d9caa84e2c6cf487a83999638a96ac"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:76909849d1a6bffa5a07742294f3fa1d357dc917cb1fe7b470afbc3a7579d539"}, + {file = "pydantic_core-2.18.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ee7ccc7fb7e921d767f853b47814c3048c7de536663e82fbc37f5eb0d532224b"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:ee2794111c188548a4547eccc73a6a8527fe2af6cf25e1a4ebda2fd01cdd2e60"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:a139fe9f298dc097349fb4f28c8b81cc7a202dbfba66af0e14be5cfca4ef7ce5"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d074b07a10c391fc5bbdcb37b2f16f20fcd9e51e10d01652ab298c0d07908ee2"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c69567ddbac186e8c0aadc1f324a60a564cfe25e43ef2ce81bcc4b8c3abffbae"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:baf1c7b78cddb5af00971ad5294a4583188bda1495b13760d9f03c9483bb6203"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:2684a94fdfd1b146ff10689c6e4e815f6a01141781c493b97342cdc5b06f4d5d"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:73c1bc8a86a5c9e8721a088df234265317692d0b5cd9e86e975ce3bc3db62a59"}, + {file = "pydantic_core-2.18.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e60defc3c15defb70bb38dd605ff7e0fae5f6c9c7cbfe0ad7868582cb7e844a6"}, + {file = "pydantic_core-2.18.1.tar.gz", hash = "sha256:de9d3e8717560eb05e28739d1b35e4eac2e458553a52a301e51352a7ffc86a35"}, ] [package.dependencies] @@ -954,13 +954,13 @@ typing-extensions = ">=4.6.0,<4.7.0 || >4.7.0" [[package]] name = "python-dateutil" -version = "2.8.2" +version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, ] [package.dependencies] @@ -1100,13 +1100,13 @@ files = [ [[package]] name = "sniffio" -version = "1.3.0" +version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] [[package]] @@ -1129,35 +1129,35 @@ full = ["httpx (>=0.22.0)", "itsdangerous", "jinja2", "python-multipart", "pyyam [[package]] name = "typing-extensions" -version = "4.9.0" +version = "4.11.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, - {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, + {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, + {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, ] [[package]] name = "tzdata" -version = "2023.4" +version = "2024.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2023.4-py2.py3-none-any.whl", hash = "sha256:aa3ace4329eeacda5b7beb7ea08ece826c28d761cda36e747cfbf97996d39bf3"}, - {file = "tzdata-2023.4.tar.gz", hash = "sha256:dd54c94f294765522c77399649b4fefd95522479a664a0cec87f41bebc6148c9"}, + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, ] [[package]] name = "urllib3" -version = "2.2.0" +version = "2.2.1" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.8" files = [ - {file = "urllib3-2.2.0-py3-none-any.whl", hash = "sha256:ce3711610ddce217e6d113a2732fafad960a03fd0318c91faa79481e35c11224"}, - {file = "urllib3-2.2.0.tar.gz", hash = "sha256:051d961ad0c62a94e50ecf1af379c3aba230c66c710493493560c0c223c49f20"}, + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, ] [package.extras] @@ -1393,20 +1393,20 @@ multidict = ">=4.0" [[package]] name = "zipp" -version = "3.17.0" +version = "3.18.1" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, - {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, + {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, + {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, ] [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e5a1c1f22e0b8e42343cef04f6f23281c7d6441df13f2be91584098c856ab1f0" +content-hash = "ca421fe0dbae56150a2fc3a7978ad65f3dd4e70025bc4da4a7f1338b8eca522c" diff --git a/openbb_platform/extensions/commodity/pyproject.toml b/openbb_platform/extensions/commodity/pyproject.toml index 269d2ed093f..44dcb993f70 100644 --- a/openbb_platform/extensions/commodity/pyproject.toml +++ b/openbb_platform/extensions/commodity/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-commodity" -version = "1.0.2" +version = "1.0.4" description = "Commodity extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_commodity" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/extensions/crypto/integration/test_crypto_api.py b/openbb_platform/extensions/crypto/integration/test_crypto_api.py index 6d38f1681a5..96a2fec3806 100644 --- a/openbb_platform/extensions/crypto/integration/test_crypto_api.py +++ b/openbb_platform/extensions/crypto/integration/test_crypto_api.py @@ -13,6 +13,7 @@ from openbb_core.provider.utils.helpers import get_querystring @pytest.fixture(scope="session") def headers(): + """Get the headers for the API request.""" userpass = f"{Env().API_USERNAME}:{Env().API_PASSWORD}" userpass_bytes = userpass.encode("ascii") base64_bytes = base64.b64encode(userpass_bytes) @@ -29,6 +30,7 @@ def headers(): ) @pytest.mark.integration def test_crypto_search(params, headers): + """Test the crypto search endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -114,6 +116,7 @@ def test_crypto_search(params, headers): ) @pytest.mark.integration def test_crypto_price_historical(params, headers): + """Test the crypto historical price endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) diff --git a/openbb_platform/extensions/crypto/integration/test_crypto_python.py b/openbb_platform/extensions/crypto/integration/test_crypto_python.py index b22c29d4dae..7a3073620ef 100644 --- a/openbb_platform/extensions/crypto/integration/test_crypto_python.py +++ b/openbb_platform/extensions/crypto/integration/test_crypto_python.py @@ -25,6 +25,7 @@ def obb(pytestconfig): # pylint: disable=inconsistent-return-statements ) @pytest.mark.integration def test_crypto_search(params, obb): + """Test the crypto search endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.crypto.search(**params) @@ -109,6 +110,7 @@ def test_crypto_search(params, obb): ) @pytest.mark.integration def test_crypto_price_historical(params, obb): + """Test crypto price historical.""" result = obb.crypto.price.historical(**params) assert result assert isinstance(result, OBBject) diff --git a/openbb_platform/extensions/crypto/openbb_crypto/__init__.py b/openbb_platform/extensions/crypto/openbb_crypto/__init__.py index e69de29bb2d..2ce9b051267 100644 --- a/openbb_platform/extensions/crypto/openbb_crypto/__init__.py +++ b/openbb_platform/extensions/crypto/openbb_crypto/__init__.py @@ -0,0 +1 @@ +"""OpenBB Crypto Extension.""" diff --git a/openbb_platform/extensions/crypto/openbb_crypto/crypto_router.py b/openbb_platform/extensions/crypto/openbb_crypto/crypto_router.py index 1f92af05c97..bc81b7db88c 100644 --- a/openbb_platform/extensions/crypto/openbb_crypto/crypto_router.py +++ b/openbb_platform/extensions/crypto/openbb_crypto/crypto_router.py @@ -13,7 +13,7 @@ from openbb_core.app.router import Router from openbb_crypto.price.price_router import router as price_router -router = Router(prefix="") +router = Router(prefix="", description="Cryptocurrency market data.") router.include_router(price_router) diff --git a/openbb_platform/extensions/crypto/openbb_crypto/price/__init__.py b/openbb_platform/extensions/crypto/openbb_crypto/price/__init__.py index e69de29bb2d..71f078e3f0a 100644 --- a/openbb_platform/extensions/crypto/openbb_crypto/price/__init__.py +++ b/openbb_platform/extensions/crypto/openbb_crypto/price/__init__.py @@ -0,0 +1 @@ +"""OpenBB Crypto Price Router.""" diff --git a/openbb_platform/extensions/crypto/poetry.lock b/openbb_platform/extensions/crypto/poetry.lock index 1f872410758..45aff8d211b 100644 --- a/openbb_platform/extensions/crypto/poetry.lock +++ b/openbb_platform/extensions/crypto/poetry.lock @@ -697,13 +697,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1416,4 +1416,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e5a1c1f22e0b8e42343cef04f6f23281c7d6441df13f2be91584098c856ab1f0" +content-hash = "ca421fe0dbae56150a2fc3a7978ad65f3dd4e70025bc4da4a7f1338b8eca522c" diff --git a/openbb_platform/extensions/crypto/pyproject.toml b/openbb_platform/extensions/crypto/pyproject.toml index e76484ba8e6..71e244683c7 100644 --- a/openbb_platform/extensions/crypto/pyproject.toml +++ b/openbb_platform/extensions/crypto/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-crypto" -version = "1.1.4" +version = "1.1.5" description = "Crypto extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_crypto" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/extensions/currency/integration/test_currency_api.py b/openbb_platform/extensions/currency/integration/test_currency_api.py index bc80a5d75bc..f2f5d56e34e 100644 --- a/openbb_platform/extensions/currency/integration/test_currency_api.py +++ b/openbb_platform/extensions/currency/integration/test_currency_api.py @@ -13,6 +13,7 @@ from openbb_core.provider.utils.helpers import get_querystring @pytest.fixture(scope="session") def headers(): + """Get the headers for the API request.""" userpass = f"{Env().API_USERNAME}:{Env().API_PASSWORD}" userpass_bytes = userpass.encode("ascii") base64_bytes = base64.b64encode(userpass_bytes) @@ -49,6 +50,7 @@ def headers(): ) @pytest.mark.integration def test_currency_search(params, headers): + """Test the currency search endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -141,6 +143,7 @@ def test_currency_search(params, headers): ) @pytest.mark.integration def test_currency_price_historical(params, headers): + """Test the currency historical price endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -156,6 +159,7 @@ def test_currency_price_historical(params, headers): ) @pytest.mark.integration def test_currency_reference_rates(params, headers): + """Test the currency reference rates endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -180,6 +184,7 @@ def test_currency_reference_rates(params, headers): ) @pytest.mark.integration def test_currency_snapshots(params, headers): + """Test the currency snapshots endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) diff --git a/openbb_platform/extensions/currency/integration/test_currency_python.py b/openbb_platform/extensions/currency/integration/test_currency_python.py index 445e4293838..f2352a1669c 100644 --- a/openbb_platform/extensions/currency/integration/test_currency_python.py +++ b/openbb_platform/extensions/currency/integration/test_currency_python.py @@ -47,6 +47,7 @@ def obb(pytestconfig): ) @pytest.mark.integration def test_currency_search(params, obb): + """Test the currency search endpoint.""" result = obb.currency.search(**params) assert result assert isinstance(result, OBBject) @@ -136,6 +137,7 @@ def test_currency_search(params, obb): ) @pytest.mark.integration def test_currency_price_historical(params, obb): + """Test the currency historical price endpoint.""" result = obb.currency.price.historical(**params) assert result assert isinstance(result, OBBject) @@ -148,6 +150,7 @@ def test_currency_price_historical(params, obb): ) @pytest.mark.integration def test_currency_reference_rates(params, obb): + """Test the currency reference rates endpoint.""" result = obb.currency.reference_rates(**params) assert result assert isinstance(result, OBBject) @@ -169,6 +172,7 @@ def test_currency_reference_rates(params, obb): ) @pytest.mark.integration def test_currency_snapshots(params, obb): + """Test the currency snapshots endpoint.""" result = obb.currency.snapshots(**params) assert result assert isinstance(result, OBBject) diff --git a/openbb_platform/extensions/currency/openbb_currency/currency_router.py b/openbb_platform/extensions/currency/openbb_currency/currency_router.py index 669b463869a..111acd3b5e2 100644 --- a/openbb_platform/extensions/currency/openbb_currency/currency_router.py +++ b/openbb_platform/extensions/currency/openbb_currency/currency_router.py @@ -13,7 +13,7 @@ from openbb_core.app.router import Router from openbb_currency.price.price_router import router as price_router -router = Router(prefix="") +router = Router(prefix="", description="Foreign exchange (FX) market data.") router.include_router(price_router) @@ -65,7 +65,7 @@ async def reference_rates( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject: - """Current, official, currency reference rates. + """Get current, official, currency reference rates. Foreign exchange reference rates are the exchange rates set by a major financial institution or regulatory body, serving as a benchmark for the value of currencies around the world. diff --git a/openbb_platform/extensions/currency/poetry.lock b/openbb_platform/extensions/currency/poetry.lock index 1f872410758..45aff8d211b 100644 --- a/openbb_platform/extensions/currency/poetry.lock +++ b/openbb_platform/extensions/currency/poetry.lock @@ -697,13 +697,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1416,4 +1416,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e5a1c1f22e0b8e42343cef04f6f23281c7d6441df13f2be91584098c856ab1f0" +content-hash = "ca421fe0dbae56150a2fc3a7978ad65f3dd4e70025bc4da4a7f1338b8eca522c" diff --git a/openbb_platform/extensions/currency/pyproject.toml b/openbb_platform/extensions/currency/pyproject.toml index d42e483b1bf..3dfe060edad 100644 --- a/openbb_platform/extensions/currency/pyproject.toml +++ b/openbb_platform/extensions/currency/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-currency" -version = "1.1.4" +version = "1.1.5" description = "Currency extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_currency" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/extensions/derivatives/integration/test_derivatives_api.py b/openbb_platform/extensions/derivatives/integration/test_derivatives_api.py index aa8103f2cf0..a777ddb3bf5 100644 --- a/openbb_platform/extensions/derivatives/integration/test_derivatives_api.py +++ b/openbb_platform/extensions/derivatives/integration/test_derivatives_api.py @@ -13,6 +13,7 @@ from openbb_core.provider.utils.helpers import get_querystring @pytest.fixture(scope="session") def headers(): + """Get the headers for the API request.""" userpass = f"{Env().API_USERNAME}:{Env().API_PASSWORD}" userpass_bytes = userpass.encode("ascii") base64_bytes = base64.b64encode(userpass_bytes) @@ -38,6 +39,7 @@ def headers(): ) @pytest.mark.integration def test_derivatives_options_chains(params, headers): + """Test the options chains endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -68,6 +70,7 @@ def test_derivatives_options_chains(params, headers): ) @pytest.mark.integration def test_derivatives_options_unusual(params, headers): + """Test the unusual options endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -94,6 +97,7 @@ def test_derivatives_options_unusual(params, headers): ) @pytest.mark.integration def test_derivatives_futures_historical(params, headers): + """Test the futures historical endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -112,6 +116,7 @@ def test_derivatives_futures_historical(params, headers): ) @pytest.mark.integration def test_derivatives_futures_curve(params, headers): + """Test the futures curve endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) diff --git a/openbb_platform/extensions/derivatives/integration/test_derivatives_python.py b/openbb_platform/extensions/derivatives/integration/test_derivatives_python.py index 8a961c6f652..1ba7c63fd2d 100644 --- a/openbb_platform/extensions/derivatives/integration/test_derivatives_python.py +++ b/openbb_platform/extensions/derivatives/integration/test_derivatives_python.py @@ -35,6 +35,7 @@ def obb(pytestconfig): ) @pytest.mark.integration def test_derivatives_options_chains(params, obb): + """Test the options chains endpoint.""" result = obb.derivatives.options.chains(**params) assert result assert isinstance(result, OBBject) @@ -62,6 +63,7 @@ def test_derivatives_options_chains(params, obb): ) @pytest.mark.integration def test_derivatives_options_unusual(params, obb): + """Test the unusual options endpoint.""" result = obb.derivatives.options.unusual(**params) assert result assert isinstance(result, OBBject) @@ -85,6 +87,7 @@ def test_derivatives_options_unusual(params, obb): ) @pytest.mark.integration def test_derivatives_futures_historical(params, obb): + """Test the futures historical endpoint.""" result = obb.derivatives.futures.historical(**params) assert result assert isinstance(result, OBBject) @@ -100,6 +103,7 @@ def test_derivatives_futures_historical(params, obb): ) @pytest.mark.integration def test_derivatives_futures_curve(params, obb): + """Test the futures curve endpoint.""" result = obb.derivatives.futures.curve(**params) assert result assert isinstance(result, OBBject) diff --git a/openbb_platform/extensions/derivatives/openbb_derivatives/derivatives_router.py b/openbb_platform/extensions/derivatives/openbb_derivatives/derivatives_router.py index 48b81aa3a5e..040720ecd60 100644 --- a/openbb_platform/extensions/derivatives/openbb_derivatives/derivatives_router.py +++ b/openbb_platform/extensions/derivatives/openbb_derivatives/derivatives_router.py @@ -5,6 +5,6 @@ from openbb_core.app.router import Router from openbb_derivatives.futures.futures_router import router as futures_router from openbb_derivatives.options.options_router import router as options_router -router = Router(prefix="") +router = Router(prefix="", description="Derivatives market data.") router.include_router(options_router) router.include_router(futures_router) diff --git a/openbb_platform/extensions/derivatives/poetry.lock b/openbb_platform/extensions/derivatives/poetry.lock index 12b9fd975a0..718edef43ca 100644 --- a/openbb_platform/extensions/derivatives/poetry.lock +++ b/openbb_platform/extensions/derivatives/poetry.lock @@ -712,13 +712,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1431,4 +1431,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e5a1c1f22e0b8e42343cef04f6f23281c7d6441df13f2be91584098c856ab1f0" +content-hash = "ca421fe0dbae56150a2fc3a7978ad65f3dd4e70025bc4da4a7f1338b8eca522c" diff --git a/openbb_platform/extensions/derivatives/pyproject.toml b/openbb_platform/extensions/derivatives/pyproject.toml index 89a176987aa..bddb388ea12 100644 --- a/openbb_platform/extensions/derivatives/pyproject.toml +++ b/openbb_platform/extensions/derivatives/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-derivatives" -version = "1.1.4" +version = "1.1.5" description = "Derivatives extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_derivatives" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/extensions/devtools/pyproject.toml b/openbb_platform/extensions/devtools/pyproject.toml index dd5f6cddd19..7840fa90c98 100644 --- a/openbb_platform/extensions/devtools/pyproject.toml +++ b/openbb_platform/extensions/devtools/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-devtools" -version = "1.1.5" +version = "1.1.6" description = "Tools for OpenBB Platform Developers" authors = ["OpenBB Team "] readme = "README.md" diff --git a/openbb_platform/extensions/econometrics/integration/test_econometrics_api.py b/openbb_platform/extensions/econometrics/integration/test_econometrics_api.py index 0cf0851b451..068c6d02e3a 100644 --- a/openbb_platform/extensions/econometrics/integration/test_econometrics_api.py +++ b/openbb_platform/extensions/econometrics/integration/test_econometrics_api.py @@ -14,6 +14,7 @@ data: Dict = {} def get_headers(): + """Get the headers for the API request.""" if "headers" in data: return data["headers"] @@ -33,6 +34,7 @@ def request_data(menu: str, symbol: str, provider: str): def get_equity_data(): + """Get equity data.""" if "equity_data" in data: return data["equity_data"] @@ -44,6 +46,7 @@ def get_equity_data(): def get_crypto_data(): + """Get crypto data.""" if "crypto_data" in data: return data["crypto_data"] @@ -60,6 +63,7 @@ def get_crypto_data(): def get_data(menu: Literal["equity", "crypto"]): + """Get data based on the selected menu.""" funcs = {"equity": get_equity_data, "crypto": get_crypto_data} return funcs[menu]() @@ -73,6 +77,7 @@ def get_data(menu: Literal["equity", "crypto"]): ) @pytest.mark.integration def test_econometrics_correlation_matrix(params, data_type): + """Test the correlation matrix endpoint.""" params = {p: v for p, v in params.items() if v} body = json.dumps(get_data(data_type)) @@ -99,6 +104,7 @@ def test_econometrics_correlation_matrix(params, data_type): ) @pytest.mark.integration def test_econometrics_ols_regression_summary(params, data_type): + """Test the OLS regression summary endpoint.""" params = {p: v for p, v in params.items() if v} body = json.dumps( @@ -130,6 +136,7 @@ def test_econometrics_ols_regression_summary(params, data_type): ) @pytest.mark.integration def test_econometrics_autocorrelation(params, data_type): + """Test the autocorrelation endpoint.""" params = {p: v for p, v in params.items() if v} body = json.dumps( @@ -171,6 +178,7 @@ def test_econometrics_autocorrelation(params, data_type): ) @pytest.mark.integration def test_econometrics_residual_autocorrelation(params, data_type): + """Test the residual autocorrelation endpoint.""" params = {p: v for p, v in params.items() if v} body = json.dumps( @@ -210,6 +218,7 @@ def test_econometrics_residual_autocorrelation(params, data_type): ) @pytest.mark.integration def test_econometrics_cointegration(params, data_type): + """Test the cointegration endpoint.""" params = {p: v for p, v in params.items() if v} body = json.dumps( @@ -241,6 +250,7 @@ def test_econometrics_cointegration(params, data_type): ) @pytest.mark.integration def test_econometrics_causality(params, data_type): + """Test the causality endpoint.""" params = {p: v for p, v in params.items() if v} body = json.dumps(get_data(data_type)) @@ -257,6 +267,7 @@ def test_econometrics_causality(params, data_type): ) @pytest.mark.integration def test_econometrics_unit_root(params, data_type): + """Test the unit root endpoint.""" params = {p: v for p, v in params.items() if v} body = json.dumps(get_data(data_type)) diff --git a/openbb_platform/extensions/econometrics/integration/test_econometrics_python.py b/openbb_platform/extensions/econometrics/integration/test_econometrics_python.py index ec67c062f36..752156ed6df 100644 --- a/openbb_platform/extensions/econometrics/integration/test_econometrics_python.py +++ b/openbb_platform/extensions/econometrics/integration/test_econometrics_python.py @@ -25,6 +25,7 @@ data: dict = {} def get_stocks_data(): + """Get stocks data.""" import openbb # pylint:disable=import-outside-toplevel if "stocks_data" in data: @@ -40,6 +41,7 @@ def get_stocks_data(): def get_crypto_data(): + """Get crypto data.""" import openbb # pylint:disable=import-outside-toplevel if "crypto_data" in data: @@ -56,6 +58,7 @@ def get_crypto_data(): def get_data(menu: Literal["equity", "crypto"]): + """Get data.""" funcs = {"equity": get_stocks_data, "crypto": get_crypto_data} return funcs[menu]() @@ -69,6 +72,7 @@ def get_data(menu: Literal["equity", "crypto"]): ) @pytest.mark.integration def test_econometrics_correlation_matrix(params, data_type, obb): + """Test the econometrics correlation matrix.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -94,6 +98,7 @@ def test_econometrics_correlation_matrix(params, data_type, obb): ) @pytest.mark.integration def test_econometrics_ols_regression(params, data_type, obb): + """Test the econometrics OLS regression.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -119,6 +124,7 @@ def test_econometrics_ols_regression(params, data_type, obb): ) @pytest.mark.integration def test_econometrics_ols_regression_summary(params, data_type, obb): + """Test the econometrics OLS regression summary.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -143,6 +149,7 @@ def test_econometrics_ols_regression_summary(params, data_type, obb): ) @pytest.mark.integration def test_econometrics_autocorrelation(params, data_type, obb): + """Test the econometrics autocorrelation.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -177,6 +184,7 @@ def test_econometrics_autocorrelation(params, data_type, obb): ) @pytest.mark.integration def test_econometrics_residual_autocorrelation(params, data_type, obb): + """Test the econometrics residual autocorrelation.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -207,6 +215,7 @@ def test_econometrics_residual_autocorrelation(params, data_type, obb): ) @pytest.mark.integration def test_econometrics_cointegration(params, data_type, obb): + """Test the econometrics cointegration.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -242,6 +251,7 @@ def test_econometrics_cointegration(params, data_type, obb): ) @pytest.mark.integration def test_econometrics_causality(params, data_type, obb): + """Test the econometrics causality.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -264,6 +274,7 @@ def test_econometrics_causality(params, data_type, obb): ) @pytest.mark.integration def test_econometrics_unit_root(params, data_type, obb): + """Test the econometrics unit root.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -282,6 +293,7 @@ def test_econometrics_unit_root(params, data_type, obb): ) @pytest.mark.integration def test_econometrics_panel_random_effects(params, obb): + """Test the econometrics panel random effects.""" params = {p: v for p, v in params.items() if v} params["data"] = mock_multi_index_data() @@ -301,6 +313,7 @@ def test_econometrics_panel_random_effects(params, obb): ) @pytest.mark.integration def test_econometrics_panel_between(params, obb): + """Test the econometrics panel between.""" params = {p: v for p, v in params.items() if v} params["data"] = mock_multi_index_data() @@ -320,6 +333,7 @@ def test_econometrics_panel_between(params, obb): ) @pytest.mark.integration def test_econometrics_panel_pooled(params, obb): + """Test the econometrics panel pooled.""" params = {p: v for p, v in params.items() if v} params["data"] = mock_multi_index_data() @@ -339,6 +353,7 @@ def test_econometrics_panel_pooled(params, obb): ) @pytest.mark.integration def test_econometrics_panel_fixed(params, obb): + """Test the econometrics panel fixed.""" params = {p: v for p, v in params.items() if v} params["data"] = mock_multi_index_data() @@ -358,6 +373,7 @@ def test_econometrics_panel_fixed(params, obb): ) @pytest.mark.integration def test_econometrics_panel_first_difference(params, obb): + """Test the econometrics panel first difference.""" params = {p: v for p, v in params.items() if v} params["data"] = mock_multi_index_data() @@ -377,11 +393,13 @@ def test_econometrics_panel_first_difference(params, obb): ) @pytest.mark.integration def test_econometrics_panel_fmac(params, obb): + """Test the econometrics panel fmac.""" params = {p: v for p, v in params.items() if v} params["data"] = mock_multi_index_data() result = obb.econometrics.panel_fmac(**params) + """Test the econometrics panel fmac.""" assert result assert isinstance(result, OBBject) assert len(result.results) > 0 diff --git a/openbb_platform/extensions/econometrics/openbb_econometrics/__init__.py b/openbb_platform/extensions/econometrics/openbb_econometrics/__init__.py index e69de29bb2d..cd48520387f 100644 --- a/openbb_platform/extensions/econometrics/openbb_econometrics/__init__.py +++ b/openbb_platform/extensions/econometrics/openbb_econometrics/__init__.py @@ -0,0 +1 @@ +"""OpenBB Econometrics Extension.""" diff --git a/openbb_platform/extensions/econometrics/openbb_econometrics/econometrics_router.py b/openbb_platform/extensions/econometrics/openbb_econometrics/econometrics_router.py index f4c8f48386e..cbd7773de1d 100644 --- a/openbb_platform/extensions/econometrics/openbb_econometrics/econometrics_router.py +++ b/openbb_platform/extensions/econometrics/openbb_econometrics/econometrics_router.py @@ -27,7 +27,7 @@ from statsmodels.tsa.stattools import adfuller, grangercausalitytests # type: i from openbb_econometrics.utils import get_engle_granger_two_step_cointegration_test -router = Router(prefix="") +router = Router(prefix="", description="Econometrics analysis tools.") @router.command( diff --git a/openbb_platform/extensions/econometrics/openbb_econometrics/utils.py b/openbb_platform/extensions/econometrics/openbb_econometrics/utils.py index 008c23fce72..6e3745fa54e 100644 --- a/openbb_platform/extensions/econometrics/openbb_econometrics/utils.py +++ b/openbb_platform/extensions/econometrics/openbb_econometrics/utils.py @@ -1,3 +1,5 @@ +"""Utility functions for the econometrics extension of the OpenBB platform.""" + import warnings from typing import Tuple @@ -10,8 +12,9 @@ from statsmodels.tsa.stattools import adfuller def get_engle_granger_two_step_cointegration_test( dependent_series: pd.Series, independent_series: pd.Series ) -> Tuple[float, float, float, pd.Series, float, float]: - """Estimates long-run and short-run cointegration relationship for series y and x and apply - the two-step Engle & Granger test for cointegration. + """Estimate long-run and short-run cointegration relationship for series y and x. + + Then apply the two-step Engle & Granger test for cointegration. Uses a 2-step process to first estimate coefficients for the long-run relationship y_t = c + gamma * x_t + z_t @@ -87,7 +90,7 @@ def get_engle_granger_two_step_cointegration_test( def mock_multi_index_data(): - """Creates a mock multi-index dataframe for testing purposes.""" + """Create a mock multi-index dataframe for testing purposes.""" arrays = [ ["individual_" + str(i) for i in range(1, 11) for _ in range(5)], list(range(1, 6)) * 10, diff --git a/openbb_platform/extensions/econometrics/poetry.lock b/openbb_platform/extensions/econometrics/poetry.lock index a60439738d4..dfd886fe1e0 100644 --- a/openbb_platform/extensions/econometrics/poetry.lock +++ b/openbb_platform/extensions/econometrics/poetry.lock @@ -841,13 +841,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1794,4 +1794,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.12" -content-hash = "0eb5845fa3d270ce5789362bb52c5ecbb5f8d2fc540c35cc5e99a4aa16906644" +content-hash = "922546305cb41e3b30455219cc4c77b840601f4cf605f47d6a515050af1c23fd" diff --git a/openbb_platform/extensions/econometrics/pyproject.toml b/openbb_platform/extensions/econometrics/pyproject.toml index cebb10be85f..dd006eab8da 100644 --- a/openbb_platform/extensions/econometrics/pyproject.toml +++ b/openbb_platform/extensions/econometrics/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-econometrics" -version = "1.1.4" +version = "1.1.5" description = "Econometrics Toolkit for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -12,7 +12,7 @@ scipy = "^1.10.1" statsmodels = "^0.14.0" arch = "^5.5.0" linearmodels = "<=4.25" # ^4.26 has setuptools-scm in setup_requires -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/extensions/economy/integration/test_economy_api.py b/openbb_platform/extensions/economy/integration/test_economy_api.py index 8ce32c0e1db..9563b719459 100644 --- a/openbb_platform/extensions/economy/integration/test_economy_api.py +++ b/openbb_platform/extensions/economy/integration/test_economy_api.py @@ -1,3 +1,5 @@ +"""Test Economy API.""" + import base64 import pytest @@ -9,6 +11,7 @@ from openbb_core.provider.utils.helpers import get_querystring @pytest.fixture(scope="session") def headers(): + """Get the headers for the API request.""" userpass = f"{Env().API_USERNAME}:{Env().API_PASSWORD}" userpass_bytes = userpass.encode("ascii") base64_bytes = base64.b64encode(userpass_bytes) @@ -49,6 +52,7 @@ def headers(): ) @pytest.mark.integration def test_economy_calendar(params, headers): + """Test the economy calendar endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -87,6 +91,7 @@ def test_economy_calendar(params, headers): ) @pytest.mark.integration def test_economy_cpi(params, headers): + """Test the economy CPI endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -102,6 +107,7 @@ def test_economy_cpi(params, headers): ) @pytest.mark.integration def test_economy_risk_premium(params, headers): + """Test the economy risk premium endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -137,6 +143,7 @@ def test_economy_risk_premium(params, headers): ) @pytest.mark.integration def test_economy_gdp_forecast(params, headers): + """Test the economy GDP forecast endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -170,6 +177,7 @@ def test_economy_gdp_forecast(params, headers): ) @pytest.mark.integration def test_economy_gdp_nominal(params, headers): + """Test the economy GDP nominal endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -203,6 +211,7 @@ def test_economy_gdp_nominal(params, headers): ) @pytest.mark.integration def test_economy_gdp_real(params, headers): + """Test the economy GDP real endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -243,6 +252,7 @@ def test_economy_gdp_real(params, headers): ) @pytest.mark.integration def test_economy_balance_of_payments(params, headers): + """Test the economy balance of payments endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -319,6 +329,7 @@ def test_economy_balance_of_payments(params, headers): ) @pytest.mark.integration def test_economy_fred_search(params, headers): + """Test the economy FRED search endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -358,6 +369,7 @@ def test_economy_fred_search(params, headers): ) @pytest.mark.integration def test_economy_fred_series(params, headers): + """Test the economy FRED series endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -383,6 +395,7 @@ def test_economy_fred_series(params, headers): ) @pytest.mark.integration def test_economy_money_measures(params, headers): + """Test the economy money measures endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -412,6 +425,7 @@ def test_economy_money_measures(params, headers): ) @pytest.mark.integration def test_economy_unemployment(params, headers): + """Test the economy unemployment endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -437,6 +451,7 @@ def test_economy_unemployment(params, headers): ) @pytest.mark.integration def test_economy_composite_leading_indicator(params, headers): + """Test the economy composite leading indicator endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -463,6 +478,7 @@ def test_economy_composite_leading_indicator(params, headers): ) @pytest.mark.integration def test_economy_short_term_interest_rate(params, headers): + """Test the economy short term interest rate endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -489,6 +505,7 @@ def test_economy_short_term_interest_rate(params, headers): ) @pytest.mark.integration def test_economy_long_term_interest_rate(params, headers): + """Test the economy long term interest rate endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -537,6 +554,7 @@ def test_economy_long_term_interest_rate(params, headers): ) @pytest.mark.integration def test_economy_fred_regional(params, headers): + """Test the economy FRED regional endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) diff --git a/openbb_platform/extensions/economy/integration/test_economy_python.py b/openbb_platform/extensions/economy/integration/test_economy_python.py index 8973e268884..bf9c7bfa1e7 100644 --- a/openbb_platform/extensions/economy/integration/test_economy_python.py +++ b/openbb_platform/extensions/economy/integration/test_economy_python.py @@ -44,6 +44,7 @@ def obb(pytestconfig): # pylint: disable=inconsistent-return-statements ) @pytest.mark.integration def test_economy_calendar(params, obb): + """Test economy calendar.""" params = {p: v for p, v in params.items() if v} result = obb.economy.calendar(**params) @@ -69,6 +70,7 @@ def test_economy_calendar(params, obb): ) @pytest.mark.integration def test_economy_cpi(params, obb): + """Test economy cpi.""" result = obb.economy.cpi(**params) assert result assert isinstance(result, OBBject) @@ -83,6 +85,7 @@ def test_economy_cpi(params, obb): ) @pytest.mark.integration def test_economy_risk_premium(params, obb): + """Test economy risk premium.""" result = obb.economy.risk_premium(**params) assert result assert isinstance(result, OBBject) @@ -114,6 +117,7 @@ def test_economy_risk_premium(params, obb): ) @pytest.mark.integration def test_economy_gdp_forecast(params, obb): + """Test economy gdp forecast.""" params = {p: v for p, v in params.items() if v} result = obb.economy.gdp.forecast(**params) @@ -139,6 +143,7 @@ def test_economy_gdp_forecast(params, obb): ) @pytest.mark.integration def test_economy_gdp_nominal(params, obb): + """Test economy gdp nominal.""" params = {p: v for p, v in params.items() if v} result = obb.economy.gdp.nominal(**params) @@ -164,6 +169,7 @@ def test_economy_gdp_nominal(params, obb): ) @pytest.mark.integration def test_economy_gdp_real(params, obb): + """Test economy gdp real.""" params = {p: v for p, v in params.items() if v} result = obb.economy.gdp.real(**params) @@ -203,6 +209,7 @@ def test_economy_gdp_real(params, obb): ) @pytest.mark.integration def test_economy_balance_of_payments(params, obb): + """Test economy balance of payments.""" params = {p: v for p, v in params.items() if v} result = obb.economy.balance_of_payments(**params) @@ -278,6 +285,7 @@ def test_economy_balance_of_payments(params, obb): ) @pytest.mark.integration def test_economy_fred_search(params, obb): + """Test economy fred search.""" params = {p: v for p, v in params.items() if v} result = obb.economy.fred_search(**params) @@ -316,6 +324,7 @@ def test_economy_fred_search(params, obb): ) @pytest.mark.integration def test_economy_fred_series(params, obb): + """Test economy fred series.""" params = {p: v for p, v in params.items() if v} result = obb.economy.fred_series(**params) @@ -340,6 +349,7 @@ def test_economy_fred_series(params, obb): ) @pytest.mark.integration def test_economy_money_measures(params, obb): + """Test economy money measures.""" params = {p: v for p, v in params.items() if v} result = obb.economy.money_measures(**params) @@ -368,6 +378,7 @@ def test_economy_money_measures(params, obb): ) @pytest.mark.integration def test_economy_unemployment(params, obb): + """Test economy unemployment.""" params = {p: v for p, v in params.items() if v} result = obb.economy.unemployment(**params) @@ -392,6 +403,7 @@ def test_economy_unemployment(params, obb): ) @pytest.mark.integration def test_economy_composite_leading_indicator(params, obb): + """Test economy composite leading indicator.""" params = {p: v for p, v in params.items() if v} result = obb.economy.composite_leading_indicator(**params) @@ -417,6 +429,7 @@ def test_economy_composite_leading_indicator(params, obb): ) @pytest.mark.integration def test_economy_short_term_interest_rate(params, obb): + """Test economy short term interest rate.""" params = {p: v for p, v in params.items() if v} result = obb.economy.short_term_interest_rate(**params) @@ -442,6 +455,7 @@ def test_economy_short_term_interest_rate(params, obb): ) @pytest.mark.integration def test_economy_long_term_interest_rate(params, obb): + """Test economy long term interest rate.""" params = {p: v for p, v in params.items() if v} result = obb.economy.long_term_interest_rate(**params) @@ -489,6 +503,7 @@ def test_economy_long_term_interest_rate(params, obb): ) @pytest.mark.integration def test_economy_fred_regional(params, obb): + """Test economy fred regional.""" params = {p: v for p, v in params.items() if v} result = obb.economy.fred_regional(**params) diff --git a/openbb_platform/extensions/economy/openbb_economy/__init__.py b/openbb_platform/extensions/economy/openbb_economy/__init__.py index e69de29bb2d..8eb8dbd57c8 100644 --- a/openbb_platform/extensions/economy/openbb_economy/__init__.py +++ b/openbb_platform/extensions/economy/openbb_economy/__init__.py @@ -0,0 +1 @@ +"""OpenBB Economy Extension.""" diff --git a/openbb_platform/extensions/economy/openbb_economy/economy_router.py b/openbb_platform/extensions/economy/openbb_economy/economy_router.py index 9cf8fdfcfd8..9f3b6e05577 100644 --- a/openbb_platform/extensions/economy/openbb_economy/economy_router.py +++ b/openbb_platform/extensions/economy/openbb_economy/economy_router.py @@ -13,7 +13,7 @@ from openbb_core.app.router import Router from openbb_economy.gdp.gdp_router import router as gdp_router -router = Router(prefix="") +router = Router(prefix="", description="Economic data.") router.include_router(gdp_router) # pylint: disable=unused-argument @@ -69,7 +69,10 @@ async def cpi( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject: - """Consumer Price Index (CPI). Returns either the rescaled index value, or a rate of change (inflation).""" + """Get Consumer Price Index (CPI). + + Returns either the rescaled index value, or a rate of change (inflation). + """ return await OBBject.from_query(Query(**locals())) @@ -83,7 +86,7 @@ async def risk_premium( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject: - """Market Risk Premium by country.""" + """Get Market Risk Premium by country.""" return await OBBject.from_query(Query(**locals())) @@ -115,8 +118,8 @@ async def fred_search( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject: - """ - Search for FRED series or economic releases by ID or string. + """Search for FRED series or economic releases by ID or string. + This does not return the observation values, only the metadata. Use this function to find series IDs for `fred_series()`. """ @@ -160,7 +163,10 @@ async def money_measures( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject: - """Money Measures (M1/M2 and components). The Federal Reserve publishes as part of the H.6 Release.""" + """Get Money Measures (M1/M2 and components). + + The Federal Reserve publishes as part of the H.6 Release. + """ return await OBBject.from_query(Query(**locals())) @@ -188,7 +194,7 @@ async def unemployment( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject: - """Global unemployment data.""" + """Get global unemployment data.""" return await OBBject.from_query(Query(**locals())) @@ -205,8 +211,11 @@ async def composite_leading_indicator( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject: - """The composite leading indicator (CLI) is designed to provide early signals of turning points + """Use the composite leading indicator (CLI). + + It is designed to provide early signals of turning points in business cycles showing fluctuation of the economic activity around its long term potential level. + CLIs show short-term economic movements in qualitative rather than quantitative terms. """ return await OBBject.from_query(Query(**locals())) @@ -227,9 +236,11 @@ async def short_term_interest_rate( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject: - """ - Short-term interest rates are the rates at which short-term borrowings are effected between + """Get Short-term interest rates. + + They are the rates at which short-term borrowings are effected between financial institutions or the rate at which short-term government paper is issued or traded in the market. + Short-term interest rates are generally averages of daily rates, measured as a percentage. Short-term interest rates are based on three-month money market rates where available. Typical standardised names are "money market rate" and "treasury bill rate". @@ -252,8 +263,8 @@ async def long_term_interest_rate( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject: - """ - Long-term interest rates refer to government bonds maturing in ten years. + """Get Long-term interest rates that refer to government bonds maturing in ten years. + Rates are mainly determined by the price charged by the lender, the risk from the borrower and the fall in the capital value. Long-term interest rates are generally averages of daily rates, measured as a percentage. These interest rates are implied by the prices at which the government bonds are @@ -261,7 +272,8 @@ async def long_term_interest_rate( In all cases, they refer to bonds whose capital repayment is guaranteed by governments. Long-term interest rates are one of the determinants of business investment. Low long-term interest rates encourage investment in new equipment and high interest rates discourage it. - Investment is, in turn, a major source of economic growth.""" + Investment is, in turn, a major source of economic growth. + """ return await OBBject.from_query(Query(**locals())) @@ -289,8 +301,8 @@ async def fred_regional( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject: - """ - Query the Geo Fred API for regional economic data by series group. + """Query the Geo Fred API for regional economic data by series group. + The series group ID is found by using `fred_search` and the `series_id` parameter. """ return await OBBject.from_query(Query(**locals())) diff --git a/openbb_platform/extensions/economy/openbb_economy/gdp/gdp_router.py b/openbb_platform/extensions/economy/openbb_economy/gdp/gdp_router.py index 024fc8e2ff8..a257a1e2c85 100644 --- a/openbb_platform/extensions/economy/openbb_economy/gdp/gdp_router.py +++ b/openbb_platform/extensions/economy/openbb_economy/gdp/gdp_router.py @@ -29,7 +29,7 @@ async def forecast( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject: - """Forecasted GDP Data.""" + """Get Forecasted GDP Data.""" return await OBBject.from_query(Query(**locals())) @@ -46,7 +46,7 @@ async def nominal( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject: - """Nominal GDP Data.""" + """Get Nominal GDP Data.""" return await OBBject.from_query(Query(**locals())) @@ -63,5 +63,5 @@ async def real( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject: - """Real GDP Data.""" + """Get Real GDP Data.""" return await OBBject.from_query(Query(**locals())) diff --git a/openbb_platform/extensions/economy/poetry.lock b/openbb_platform/extensions/economy/poetry.lock index 1f872410758..45aff8d211b 100644 --- a/openbb_platform/extensions/economy/poetry.lock +++ b/openbb_platform/extensions/economy/poetry.lock @@ -697,13 +697,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1416,4 +1416,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e5a1c1f22e0b8e42343cef04f6f23281c7d6441df13f2be91584098c856ab1f0" +content-hash = "ca421fe0dbae56150a2fc3a7978ad65f3dd4e70025bc4da4a7f1338b8eca522c" diff --git a/openbb_platform/extensions/economy/pyproject.toml b/openbb_platform/extensions/economy/pyproject.toml index cf43f9e6d75..b4482731c85 100644 --- a/openbb_platform/extensions/economy/pyproject.toml +++ b/openbb_platform/extensions/economy/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-economy" -version = "1.1.4" +version = "1.1.5" description = "Economy extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_economy" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/extensions/equity/integration/test_equity_api.py b/openbb_platform/extensions/equity/integration/test_equity_api.py index 511b4305417..84aaba03678 100644 --- a/openbb_platform/extensions/equity/integration/test_equity_api.py +++ b/openbb_platform/extensions/equity/integration/test_equity_api.py @@ -13,6 +13,7 @@ from openbb_core.provider.utils.helpers import get_querystring @pytest.fixture(scope="session") def headers(): + """Get the headers for the API request.""" userpass = f"{Env().API_USERNAME}:{Env().API_PASSWORD}" userpass_bytes = userpass.encode("ascii") base64_bytes = base64.b64encode(userpass_bytes) @@ -74,6 +75,7 @@ def headers(): ) @pytest.mark.integration def test_equity_fundamental_balance(params, headers): + """Test the equity fundamental balance endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -89,6 +91,7 @@ def test_equity_fundamental_balance(params, headers): ) @pytest.mark.integration def test_equity_fundamental_balance_growth(params, headers): + """Test the equity fundamental balance growth endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -107,6 +110,7 @@ def test_equity_fundamental_balance_growth(params, headers): ) @pytest.mark.integration def test_equity_calendar_dividend(params, headers): + """Test the equity calendar dividend endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -124,6 +128,7 @@ def test_equity_calendar_dividend(params, headers): ) @pytest.mark.integration def test_equity_calendar_splits(params, headers): + """Test the equity calendar splits endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -143,6 +148,7 @@ def test_equity_calendar_splits(params, headers): ) @pytest.mark.integration def test_equity_calendar_earnings(params, headers): + """Test the equity calendar earnings endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -205,6 +211,7 @@ def test_equity_calendar_earnings(params, headers): ) @pytest.mark.integration def test_equity_fundamental_cash(params, headers): + """Test the equity fundamental cash endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -220,6 +227,7 @@ def test_equity_fundamental_cash(params, headers): ) @pytest.mark.integration def test_equity_fundamental_cash_growth(params, headers): + """Test the equity fundamental cash growth endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -257,6 +265,7 @@ def test_equity_fundamental_cash_growth(params, headers): ) @pytest.mark.integration def test_equity_fundamental_management_compensation(params, headers): + """Test the equity fundamental management compensation endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -272,6 +281,7 @@ def test_equity_fundamental_management_compensation(params, headers): ) @pytest.mark.integration def test_equity_fundamental_historical_splits(params, headers): + """Test the equity fundamental historical splits endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -333,6 +343,7 @@ def test_equity_fundamental_historical_splits(params, headers): ) @pytest.mark.integration def test_equity_fundamental_dividends(params, headers): + """Test the equity fundamental dividends endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -348,6 +359,7 @@ def test_equity_fundamental_dividends(params, headers): ) @pytest.mark.integration def test_equity_fundamental_employee_count(params, headers): + """Test the equity fundamental employee count endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -359,10 +371,11 @@ def test_equity_fundamental_employee_count(params, headers): @parametrize( "params", - [({"symbol": "AAPL", "period": "annual", "limit": 30})], + [({"symbol": "AAPL,MSFT", "period": "annual", "limit": 30})], ) @pytest.mark.integration def test_equity_estimates_historical(params, headers): + """Test the equity estimates historical endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -372,6 +385,69 @@ def test_equity_estimates_historical(params, headers): assert result.status_code == 200 +@parametrize( + "params", + [ + ( + { + "symbol": "AAPL,MSFT", + "fiscal_period": "fy", + "fiscal_year": None, + "calendar_year": None, + "calendar_period": None, + "provider": "intrinio", + } + ) + ], +) +@pytest.mark.integration +def test_equity_estimates_forward_sales(params, headers): + """Test the equity estimates forward sales endpoint.""" + params = {p: v for p, v in params.items() if v} + + query_str = get_querystring(params, []) + url = f"http://0.0.0.0:8000/api/v1/equity/estimates/forward_sales?{query_str}" + result = requests.get(url, headers=headers, timeout=10) + assert isinstance(result, requests.Response) + assert result.status_code == 200 + + +@parametrize( + "params", + [ + ( + { + "symbol": "AAPL,MSFT", + "fiscal_period": "fy", + "fiscal_year": None, + "calendar_year": None, + "calendar_period": None, + "provider": "intrinio", + } + ), + ( + { + "symbol": "AAPL,MSFT", + "fiscal_period": "annual", + "limit": None, + "include_historical": False, + "provider": "fmp", + } + ), + ], +) +@pytest.mark.integration +def test_equity_estimates_forward_eps(params, headers): + """Test the equity estimates forward EPS endpoint.""" + params = {p: v for p, v in params.items() if v} + + query_str = get_querystring(params, []) + url = f"http://0.0.0.0:8000/api/v1/equity/estimates/forward_eps?{query_str}" + result = requests.get(url, headers=headers, timeout=10) + assert isinstance(result, requests.Response) + assert result.status_code == 200 + + @parametrize( "params", [ @@ -426,6 +502,7 @@ def test_equity_estimates_historical(params, headers): ) @pytest.mark.integration def test_equity_fundamental_income(params, headers): + """Test the equity fundamental income endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -441,6 +518,7 @@ def test_equity_fundamental_income(params, headers): ) @pytest.mark.integration def test_equity_fundamental_income_growth(params, headers): + """Test the equity fundamental income growth endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -483,6 +561,7 @@ def test_equity_fundamental_income_growth(params, headers): ) @pytest.mark.integration def test_equity_ownership_insider_trading(params, headers): + """Test the equity ownership insider trading endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -515,6 +594,7 @@ def test_equity_ownership_insider_trading(params, headers): ) @pytest.mark.integration def test_equity_ownership_institutional(params, headers): + """Test the equity ownership institutional endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -549,6 +629,7 @@ def test_equity_ownership_institutional(params, headers): ) @pytest.mark.integration def test_equity_calendar_ipo(params, headers): + """Test the equity calendar IPO endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -577,6 +658,7 @@ def test_equity_calendar_ipo(params, headers): ) @pytest.mark.integration def test_equity_fundamental_metrics(params, headers): + """Test the equity fundamental metrics endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -595,6 +677,7 @@ def test_equity_fundamental_metrics(params, headers): ) @pytest.mark.integration def test_equity_fundamental_management(params, headers): + """Test the equity fundamental management endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -610,6 +693,7 @@ def test_equity_fundamental_management(params, headers): ) @pytest.mark.integration def test_equity_fundamental_overview(params, headers): + """Test the equity fundamental overview endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -625,6 +709,7 @@ def test_equity_fundamental_overview(params, headers): ) @pytest.mark.integration def test_equity_ownership_major_holders(params, headers): + """Test the equity ownership major holders endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -661,6 +746,7 @@ def test_equity_ownership_major_holders(params, headers): ) @pytest.mark.integration def test_equity_estimates_price_target(params, headers): + """Test the equity estimates price target endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -703,6 +789,7 @@ def test_equity_estimates_price_target(params, headers): ) @pytest.mark.integration def test_equity_estimates_analyst_search(params, headers): + """Test the equity estimates analyst search endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -718,10 +805,18 @@ def test_equity_estimates_analyst_search(params, headers): ({"symbol": "AAPL", "provider": "fmp"}), ({"symbol": "AAPL,AMZN,RELIANCE.NS", "provider": "yfinance"}), ({"symbol": "TD:US", "provider": "tmx"}), + ( + { + "symbol": "AAPL,MSFT", + "industry_group_number": None, + "provider": "intrinio", + } + ), ], ) @pytest.mark.integration def test_equity_estimates_consensus(params, headers): + """Test the equity estimates consensus endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -748,6 +843,7 @@ def test_equity_estimates_consensus(params, headers): ) @pytest.mark.integration def test_equity_fundamental_ratios(params, headers): + """Test the equity fundamental ratios endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -763,6 +859,7 @@ def test_equity_fundamental_ratios(params, headers): ) @pytest.mark.integration def test_equity_fundamental_revenue_per_geography(params, headers): + """Test the equity fundamental revenue per geography endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -778,6 +875,7 @@ def test_equity_fundamental_revenue_per_geography(params, headers): ) @pytest.mark.integration def test_equity_fundamental_revenue_per_segment(params, headers): + """Test the equity fundamental revenue per segment endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -838,6 +936,7 @@ def test_equity_fundamental_revenue_per_segment(params, headers): ) @pytest.mark.integration def test_equity_fundamental_filings(params, headers): + """Test the equity fundamental filings endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -857,6 +956,7 @@ def test_equity_fundamental_filings(params, headers): ) @pytest.mark.integration def test_equity_ownership_share_statistics(params, headers): + """Test the equity ownership share statistics endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -872,6 +972,7 @@ def test_equity_ownership_share_statistics(params, headers): ) @pytest.mark.integration def test_equity_fundamental_transcript(params, headers): + """Test the equity fundamental transcript endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -887,6 +988,7 @@ def test_equity_fundamental_transcript(params, headers): ) @pytest.mark.integration def test_equity_compare_peers(params, headers): + """Test the equity compare peers endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -902,6 +1004,7 @@ def test_equity_compare_peers(params, headers): ) @pytest.mark.integration def test_equity_compare_groups(params, headers): + """Test the equity compare groups endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1095,6 +1198,7 @@ def test_equity_compare_groups(params, headers): ) @pytest.mark.integration def test_equity_price_historical(params, headers): + """Test the equity price historical endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1111,6 +1215,7 @@ def test_equity_price_historical(params, headers): ) @pytest.mark.integration def test_equity_fundamental_multiples(params, headers): + """Test the equity fundamental multiples endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1128,6 +1233,7 @@ def test_equity_fundamental_multiples(params, headers): ) @pytest.mark.integration def test_equity_fundamental_search_attributes(params, headers): + """Test the equity fundamental search attributes endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1209,6 +1315,7 @@ def test_equity_fundamental_search_attributes(params, headers): ) @pytest.mark.integration def test_equity_fundamental_historical_attributes(params, headers): + """Test the equity fundamental historical attributes endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1267,6 +1374,7 @@ def test_equity_fundamental_historical_attributes(params, headers): ) @pytest.mark.integration def test_equity_fundamental_latest_attributes(params, headers): + """Test the equity fundamental latest attributes endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1297,6 +1405,7 @@ def test_equity_fundamental_latest_attributes(params, headers): ) @pytest.mark.integration def test_equity_search(params, headers): + """Test the equity search endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1335,6 +1444,7 @@ def test_equity_search(params, headers): ) @pytest.mark.integration def test_equity_screener(params, headers): + """Test the equity screener endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1357,6 +1467,7 @@ def test_equity_screener(params, headers): ) @pytest.mark.integration def test_equity_price_quote(params, headers): + """Test the equity price quote endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1379,6 +1490,7 @@ def test_equity_price_quote(params, headers): ) @pytest.mark.integration def test_equity_profile(params, headers): + """Test the equity profile endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1397,6 +1509,7 @@ def test_equity_profile(params, headers): ) @pytest.mark.integration def test_equity_discovery_gainers(params, headers): + """Test the equity discovery gainers endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1412,6 +1525,7 @@ def test_equity_discovery_gainers(params, headers): ) @pytest.mark.integration def test_equity_discovery_losers(params, headers): + """Test the equity discovery losers endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1427,6 +1541,7 @@ def test_equity_discovery_losers(params, headers): ) @pytest.mark.integration def test_equity_discovery_active(params, headers): + """Test the equity discovery active endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1445,6 +1560,7 @@ def test_equity_discovery_active(params, headers): ) @pytest.mark.integration def test_equity_price_performance(params, headers): + """Test the equity price performance endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1460,6 +1576,7 @@ def test_equity_price_performance(params, headers): ) @pytest.mark.integration def test_equity_discovery_undervalued_large_caps(params, headers): + """Test the equity discovery undervalued large caps endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1475,6 +1592,7 @@ def test_equity_discovery_undervalued_large_caps(params, headers): ) @pytest.mark.integration def test_equity_discovery_undervalued_growth(params, headers): + """Test the equity discovery undervalued growth endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1490,6 +1608,7 @@ def test_equity_discovery_undervalued_growth(params, headers): ) @pytest.mark.integration def test_equity_discovery_aggressive_small_caps(params, headers): + """Test the equity discovery aggressive small caps endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1507,6 +1626,7 @@ def test_equity_discovery_aggressive_small_caps(params, headers): ) @pytest.mark.integration def test_equity_discovery_growth_tech(params, headers): + """Test the equity discovery growth tech endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1522,6 +1642,7 @@ def test_equity_discovery_growth_tech(params, headers): ) @pytest.mark.integration def test_equity_discovery_top_retail(params, headers): + """Test the equity discovery top retail endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1537,6 +1658,7 @@ def test_equity_discovery_top_retail(params, headers): ) @pytest.mark.integration def test_equity_discovery_upcoming_release_days(params, headers): + """Test the equity discovery upcoming release days endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1575,6 +1697,7 @@ def test_equity_discovery_upcoming_release_days(params, headers): ) @pytest.mark.integration def test_equity_discovery_filings(params, headers): + """Test the equity discovery filings endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1593,6 +1716,7 @@ def test_equity_discovery_filings(params, headers): ) @pytest.mark.integration def test_equity_shorts_fails_to_deliver(params, headers): + """Test the equity shorts fails to deliver endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1608,6 +1732,7 @@ def test_equity_shorts_fails_to_deliver(params, headers): ) @pytest.mark.integration def test_equity_shorts_short_volume(params, headers): + """Test the equity shorts short volume endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1623,6 +1748,7 @@ def test_equity_shorts_short_volume(params, headers): ) @pytest.mark.integration def test_equity_shorts_short_interest(params, headers): + """Test the equity shorts short interest endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1651,6 +1777,7 @@ def test_equity_shorts_short_interest(params, headers): ) @pytest.mark.integration def test_equity_price_nbbo(params, headers): + """Test the equity price NBBO endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1669,6 +1796,7 @@ def test_equity_price_nbbo(params, headers): ) @pytest.mark.integration def test_equity_darkpool_otc(params, headers): + """Test the equity darkpool otc endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1693,6 +1821,7 @@ def test_equity_darkpool_otc(params, headers): ) @pytest.mark.integration def test_equity_market_snapshots(params, headers): + """Test the equity market snapshots endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1718,6 +1847,7 @@ def test_equity_market_snapshots(params, headers): ) @pytest.mark.integration def test_equity_fundamental_historical_eps(params, headers): + """Test the equity fundamental historical eps endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1733,6 +1863,7 @@ def test_equity_fundamental_historical_eps(params, headers): ) @pytest.mark.integration def test_equity_fundamental_trailing_dividend_yield(params, headers): + """Test the equity fundamental trailing dividend yield endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1779,6 +1910,7 @@ def test_equity_fundamental_trailing_dividend_yield(params, headers): ) @pytest.mark.integration def test_equity_fundamental_reported_financials(params, headers): + """Test the equity fundamental reported financials endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -1805,6 +1937,7 @@ def test_equity_fundamental_reported_financials(params, headers): ) @pytest.mark.integration def test_equity_ownership_form_13f(params, headers): + """Test the equity ownership form 13f endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) diff --git a/openbb_platform/extensions/equity/integration/test_equity_python.py b/openbb_platform/extensions/equity/integration/test_equity_python.py index 671df076840..9b0f5bb530d 100644 --- a/openbb_platform/extensions/equity/integration/test_equity_python.py +++ b/openbb_platform/extensions/equity/integration/test_equity_python.py @@ -73,6 +73,7 @@ def obb(pytestconfig): ) @pytest.mark.integration def test_equity_fundamental_balance(params, obb): + """Test the equity fundamental balance endpoint.""" result = obb.equity.fundamental.balance(**params) assert result assert isinstance(result, OBBject) @@ -87,6 +88,7 @@ def test_equity_fundamental_balance(params, obb): ) @pytest.mark.integration def test_equity_fundamental_balance_growth(params, obb): + """Test the equity fundamental balance growth endpoint.""" result = obb.equity.fundamental.balance_growth(**params) assert result assert isinstance(result, OBBject) @@ -102,6 +104,7 @@ def test_equity_fundamental_balance_growth(params, obb): ) @pytest.mark.integration def test_equity_calendar_dividend(params, obb): + """Test the equity calendar dividend endpoint.""" result = obb.equity.calendar.dividend(**params) assert result assert isinstance(result, OBBject) @@ -116,6 +119,7 @@ def test_equity_calendar_dividend(params, obb): ) @pytest.mark.integration def test_equity_calendar_splits(params, obb): + """Test the equity calendar splits endpoint.""" result = obb.equity.calendar.splits(**params) assert result assert isinstance(result, OBBject) @@ -132,6 +136,7 @@ def test_equity_calendar_splits(params, obb): ) @pytest.mark.integration def test_equity_calendar_earnings(params, obb): + """Test the equity calendar earnings endpoint.""" result = obb.equity.calendar.earnings(**params) assert result assert isinstance(result, OBBject) @@ -191,6 +196,7 @@ def test_equity_calendar_earnings(params, obb): ) @pytest.mark.integration def test_equity_fundamental_cash(params, obb): + """Test the equity fundamental cash endpoint.""" result = obb.equity.fundamental.cash(**params) assert result assert isinstance(result, OBBject) @@ -205,6 +211,7 @@ def test_equity_fundamental_cash(params, obb): ) @pytest.mark.integration def test_equity_fundamental_cash_growth(params, obb): + """Test the equity fundamental cash growth endpoint.""" result = obb.equity.fundamental.cash_growth(**params) assert result assert isinstance(result, OBBject) @@ -239,6 +246,7 @@ def test_equity_fundamental_cash_growth(params, obb): ) @pytest.mark.integration def test_equity_fundamental_management_compensation(params, obb): + """Test the equity fundamental management compensation endpoint.""" result = obb.equity.fundamental.management_compensation(**params) assert result assert isinstance(result, OBBject) @@ -253,6 +261,7 @@ def test_equity_fundamental_management_compensation(params, obb): ) @pytest.mark.integration def test_equity_fundamental_historical_splits(params, obb): + """Test the equity fundamental historical splits endpoint.""" result = obb.equity.fundamental.historical_splits(**params) assert result assert isinstance(result, OBBject) @@ -311,6 +320,7 @@ def test_equity_fundamental_historical_splits(params, obb): ) @pytest.mark.integration def test_equity_fundamental_dividends(params, obb): + """Test the equity fundamental dividends endpoint.""" result = obb.equity.fundamental.dividends(**params) assert result assert isinstance(result, OBBject) @@ -325,6 +335,7 @@ def test_equity_fundamental_dividends(params, obb): ) @pytest.mark.integration def test_equity_fundamental_employee_count(params, obb): + """Test the equity fundamental employee count endpoint.""" result = obb.equity.fundamental.employee_count(**params) assert result assert isinstance(result, OBBject) @@ -334,11 +345,12 @@ def test_equity_fundamental_employee_count(params, obb): @parametrize( "params", [ - ({"symbol": "AAPL", "period": "annual", "limit": 30}), + ({"symbol": "AAPL,MSFT", "period": "annual", "limit": 30}), ], ) @pytest.mark.integration def test_equity_estimates_historical(params, obb): + """Test the equity estimates historical endpoint.""" result = obb.equity.estimates.historical(**params) assert result assert isinstance(result, OBBject) @@ -399,6 +411,7 @@ def test_equity_estimates_historical(params, obb): ) @pytest.mark.integration def test_equity_fundamental_income(params, obb): + """Test the equity fundamental income endpoint.""" result = obb.equity.fundamental.income(**params) assert result assert isinstance(result, OBBject) @@ -411,6 +424,7 @@ def test_equity_fundamental_income(params, obb): ) @pytest.mark.integration def test_equity_fundamental_income_growth(params, obb): + """Test the equity fundamental income growth endpoint.""" result = obb.equity.fundamental.income_growth(**params) assert result assert isinstance(result, OBBject) @@ -450,6 +464,7 @@ def test_equity_fundamental_income_growth(params, obb): ) @pytest.mark.integration def test_equity_ownership_insider_trading(params, obb): + """Test the equity ownership insider trading endpoint.""" result = obb.equity.ownership.insider_trading(**params) assert result assert isinstance(result, OBBject) @@ -479,6 +494,7 @@ def test_equity_ownership_insider_trading(params, obb): ) @pytest.mark.integration def test_equity_ownership_institutional(params, obb): + """Test the equity ownership institutional endpoint.""" result = obb.equity.ownership.institutional(**params) assert result assert isinstance(result, OBBject) @@ -510,6 +526,7 @@ def test_equity_ownership_institutional(params, obb): ) @pytest.mark.integration def test_equity_calendar_ipo(params, obb): + """Test the equity calendar IPO endpoint.""" result = obb.equity.calendar.ipo(**params) assert result assert isinstance(result, OBBject) @@ -536,6 +553,7 @@ def test_equity_calendar_ipo(params, obb): ) @pytest.mark.integration def test_equity_fundamental_metrics(params, obb): + """Test the equity fundamental metrics endpoint.""" result = obb.equity.fundamental.metrics(**params) assert result assert isinstance(result, OBBject) @@ -554,6 +572,7 @@ def test_equity_fundamental_metrics(params, obb): ) @pytest.mark.integration def test_equity_fundamental_management(params, obb): + """Test the equity fundamental management endpoint.""" result = obb.equity.fundamental.management(**params) assert result assert isinstance(result, OBBject) @@ -568,6 +587,7 @@ def test_equity_fundamental_management(params, obb): ) @pytest.mark.integration def test_equity_fundamental_overview(params, obb): + """Test the equity fundamental overview endpoint.""" result = obb.equity.fundamental.overview(**params) assert result assert isinstance(result, OBBject) @@ -582,6 +602,7 @@ def test_equity_fundamental_overview(params, obb): ) @pytest.mark.integration def test_equity_ownership_major_holders(params, obb): + """Test the equity ownership major holders endpoint.""" result = obb.equity.ownership.major_holders(**params) assert result assert isinstance(result, OBBject) @@ -615,6 +636,7 @@ def test_equity_ownership_major_holders(params, obb): ) @pytest.mark.integration def test_equity_estimates_price_target(params, obb): + """Test the equity estimates price target endpoint.""" result = obb.equity.estimates.price_target(**params) assert result assert isinstance(result, OBBject) @@ -640,6 +662,7 @@ def test_equity_estimates_price_target(params, obb): ) @pytest.mark.integration def test_equity_estimates_analyst_search(params, obb): + """Test the equity estimates analyst search endpoint.""" result = obb.equity.estimates.analyst_search(**params) assert result assert isinstance(result, OBBject) @@ -652,16 +675,81 @@ def test_equity_estimates_analyst_search(params, obb): ({"symbol": "AAPL", "provider": "fmp"}), ({"symbol": "AAPL,AMZN,RELIANCE.NS", "provider": "yfinance"}), ({"symbol": "TD:US", "provider": "tmx"}), + ( + { + "symbol": "AAPL,MSFT", + "industry_group_number": None, + "provider": "intrinio", + } + ), ], ) @pytest.mark.integration def test_equity_estimates_consensus(params, obb): + """Test the equity estimates consensus endpoint.""" result = obb.equity.estimates.consensus(**params) assert result assert isinstance(result, OBBject) assert result.results is not None +@parametrize( + "params", + [ + ( + { + "symbol": "AAPL,MSFT", + "fiscal_period": "fy", + "fiscal_year": None, + "calendar_year": None, + "calendar_period": None, + "provider": "intrinio", + } + ) + ], +) +@pytest.mark.integration +def test_equity_estimates_forward_sales(params, obb): + """Test the equity estimates forward sales endpoint.""" + result = obb.equity.estimates.forward_sales(**params) + assert result + assert isinstance(result, OBBject) + assert len(result.results) > 0 + + +@parametrize( + "params", + [ + ( + { + "symbol": "AAPL,MSFT", + "fiscal_period": "fy", + "fiscal_year": None, + "calendar_year": None, + "calendar_period": None, + "provider": "intrinio", + } + ), + ( + { + "symbol": "AAPL,MSFT", + "fiscal_period": "annual", + "limit": None, + "include_historical": False, + "provider": "fmp", + } + ), + ], +) +@pytest.mark.integration +def test_equity_estimates_forward_eps(params, obb): + """Test the equity estimates forward EPS endpoint.""" + result = obb.equity.estimates.forward_eps(**params) + assert result + assert isinstance(result, OBBject) + assert len(result.results) > 0 + + @parametrize( "params", [ @@ -679,6 +767,7 @@ def test_equity_estimates_consensus(params, obb): ) @pytest.mark.integration def test_equity_fundamental_ratios(params, obb): + """Test the equity fundamental ratios endpoint.""" result = obb.equity.fundamental.ratios(**params) assert result assert isinstance(result, OBBject) @@ -700,6 +789,7 @@ def test_equity_fundamental_ratios(params, obb): ) @pytest.mark.integration def test_equity_fundamental_revenue_per_geography(params, obb): + """Test the equity fundamental revenue per geography endpoint.""" result = obb.equity.fundamental.revenue_per_geography(**params) assert result assert isinstance(result, OBBject) @@ -721,6 +811,7 @@ def test_equity_fundamental_revenue_per_geography(params, obb): ) @pytest.mark.integration def test_equity_fundamental_revenue_per_segment(params, obb): + """Test the equity fundamental revenue per segment endpoint.""" result = obb.equity.fundamental.revenue_per_segment(**params) assert result assert isinstance(result, OBBject) @@ -774,6 +865,7 @@ def test_equity_fundamental_revenue_per_segment(params, obb): ) @pytest.mark.integration def test_equity_fundamental_filings(params, obb): + """Test the equity fundamental filings endpoint.""" result = obb.equity.fundamental.filings(**params) assert result assert isinstance(result, OBBject) @@ -790,6 +882,7 @@ def test_equity_fundamental_filings(params, obb): ) @pytest.mark.integration def test_equity_ownership_share_statistics(params, obb): + """Test the equity ownership share statistics endpoint.""" result = obb.equity.ownership.share_statistics(**params) assert result assert isinstance(result, OBBject) @@ -804,6 +897,7 @@ def test_equity_ownership_share_statistics(params, obb): ) @pytest.mark.integration def test_equity_fundamental_transcript(params, obb): + """Test the equity fundamental transcript endpoint.""" result = obb.equity.fundamental.transcript(**params) assert result assert isinstance(result, OBBject) @@ -818,6 +912,7 @@ def test_equity_fundamental_transcript(params, obb): ) @pytest.mark.integration def test_equity_compare_peers(params, obb): + """Test the equity compare peers endpoint.""" result = obb.equity.compare.peers(**params) assert result assert isinstance(result, OBBject) @@ -830,6 +925,7 @@ def test_equity_compare_peers(params, obb): ) @pytest.mark.integration def test_equity_compare_groups(params, obb): + """Test the equity compare groups endpoint.""" result = obb.equity.compare.groups(**params) assert result assert isinstance(result, OBBject) @@ -1020,6 +1116,7 @@ def test_equity_compare_groups(params, obb): ) @pytest.mark.integration def test_equity_price_historical(params, obb): + """Test the equity price historical endpoint.""" result = obb.equity.price.historical(**params) assert result assert isinstance(result, OBBject) @@ -1034,6 +1131,7 @@ def test_equity_price_historical(params, obb): ) @pytest.mark.integration def test_equity_fundamental_multiples(params, obb): + """Test the equity fundamental multiples endpoint.""" result = obb.equity.fundamental.multiples(**params) assert result assert isinstance(result, OBBject) @@ -1048,6 +1146,7 @@ def test_equity_fundamental_multiples(params, obb): ) @pytest.mark.integration def test_equity_fundamental_search_attributes(params, obb): + """Test the equity fundamental search attributes endpoint.""" result = obb.equity.fundamental.search_attributes(**params) assert result assert isinstance(result, OBBject) @@ -1126,6 +1225,7 @@ def test_equity_fundamental_search_attributes(params, obb): ) @pytest.mark.integration def test_equity_fundamental_historical_attributes(params, obb): + """Test the equity fundamental historical attributes endpoint.""" result = obb.equity.fundamental.historical_attributes(**params) assert result assert isinstance(result, OBBject) @@ -1181,6 +1281,7 @@ def test_equity_fundamental_historical_attributes(params, obb): ) @pytest.mark.integration def test_equity_fundamental_latest_attributes(params, obb): + """Test the equity fundamental latest attributes endpoint.""" result = obb.equity.fundamental.latest_attributes(**params) assert result assert isinstance(result, OBBject) @@ -1211,6 +1312,7 @@ def test_equity_fundamental_latest_attributes(params, obb): ) @pytest.mark.integration def test_equity_search(params, obb): + """Test the equity search endpoint.""" result = obb.equity.search(**params) assert result assert isinstance(result, OBBject) @@ -1246,6 +1348,7 @@ def test_equity_search(params, obb): ) @pytest.mark.integration def test_equity_screener(params, obb): + """Test the equity screener endpoint.""" result = obb.equity.screener(**params) assert result assert isinstance(result, OBBject) @@ -1266,6 +1369,7 @@ def test_equity_screener(params, obb): ) @pytest.mark.integration def test_equity_price_quote(params, obb): + """Test the equity price quote endpoint.""" result = obb.equity.price.quote(**params) assert result assert isinstance(result, OBBject) @@ -1285,6 +1389,7 @@ def test_equity_price_quote(params, obb): ) @pytest.mark.integration def test_equity_profile(params, obb): + """Test the equity profile endpoint.""" result = obb.equity.profile(**params) assert result assert isinstance(result, OBBject) @@ -1303,6 +1408,7 @@ def test_equity_profile(params, obb): ) @pytest.mark.integration def test_equity_discovery_gainers(params, obb): + """Test the equity discovery gainers endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.equity.discovery.gainers(**params) @@ -1317,6 +1423,7 @@ def test_equity_discovery_gainers(params, obb): ) @pytest.mark.integration def test_equity_discovery_losers(params, obb): + """Test the equity discovery losers endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.equity.discovery.losers(**params) @@ -1331,6 +1438,7 @@ def test_equity_discovery_losers(params, obb): ) @pytest.mark.integration def test_equity_discovery_active(params, obb): + """Test the equity discovery active endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.equity.discovery.active(**params) @@ -1348,6 +1456,7 @@ def test_equity_discovery_active(params, obb): ) @pytest.mark.integration def test_equity_price_performance(params, obb): + """Test the equity price performance endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.equity.price.performance(**params) @@ -1362,6 +1471,7 @@ def test_equity_price_performance(params, obb): ) @pytest.mark.integration def test_equity_discovery_undervalued_large_caps(params, obb): + """Test the equity discovery undervalued large caps endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.equity.discovery.undervalued_large_caps(**params) @@ -1376,6 +1486,7 @@ def test_equity_discovery_undervalued_large_caps(params, obb): ) @pytest.mark.integration def test_equity_discovery_undervalued_growth(params, obb): + """Test the equity discovery undervalued growth endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.equity.discovery.undervalued_growth(**params) @@ -1390,6 +1501,7 @@ def test_equity_discovery_undervalued_growth(params, obb): ) @pytest.mark.integration def test_equity_discovery_aggressive_small_caps(params, obb): + """Test the equity discovery aggressive small caps endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.equity.discovery.aggressive_small_caps(**params) @@ -1404,6 +1516,7 @@ def test_equity_discovery_aggressive_small_caps(params, obb): ) @pytest.mark.integration def test_equity_discovery_growth_tech(params, obb): + """Test the equity discovery growth tech endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.equity.discovery.growth_tech(**params) @@ -1418,6 +1531,7 @@ def test_equity_discovery_growth_tech(params, obb): ) @pytest.mark.integration def test_equity_discovery_top_retail(params, obb): + """Test the equity discovery top retail endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.equity.discovery.top_retail(**params) @@ -1432,6 +1546,7 @@ def test_equity_discovery_top_retail(params, obb): ) @pytest.mark.integration def test_equity_discovery_upcoming_release_days(params, obb): + """Test the equity discovery upcoming release days endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.equity.discovery.upcoming_release_days(**params) @@ -1467,6 +1582,7 @@ def test_equity_discovery_upcoming_release_days(params, obb): ) @pytest.mark.integration def test_equity_discovery_filings(params, obb): + """Test the equity discovery filings endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.equity.discovery.filings(**params) @@ -1487,6 +1603,7 @@ def test_equity_discovery_filings(params, obb): ) @pytest.mark.integration def test_equity_shorts_fails_to_deliver(params, obb): + """Test the equity shorts fails to deliver endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.equity.shorts.fails_to_deliver(**params) @@ -1501,6 +1618,7 @@ def test_equity_shorts_fails_to_deliver(params, obb): ) @pytest.mark.integration def test_equity_shorts_short_volume(params, obb): + """Test the equity shorts short volume endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.equity.shorts.short_volume(**params) @@ -1515,6 +1633,7 @@ def test_equity_shorts_short_volume(params, obb): ) @pytest.mark.integration def test_equity_shorts_short_interest(params, obb): + """Test the equity shorts short interest endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.equity.shorts.short_interest(**params) @@ -1542,6 +1661,7 @@ def test_equity_shorts_short_interest(params, obb): ) @pytest.mark.integration def test_equity_price_nbbo(params, obb): + """Test the equity price nbbo endpoint.""" result = obb.equity.price.nbbo(**params) assert result assert isinstance(result, OBBject) @@ -1557,6 +1677,7 @@ def test_equity_price_nbbo(params, obb): ) @pytest.mark.integration def test_equity_darkpool_otc(params, obb): + """Test the equity darkpool otc endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.equity.darkpool.otc(**params) @@ -1575,6 +1696,7 @@ def test_equity_darkpool_otc(params, obb): ) @pytest.mark.integration def test_equity_market_snapshots(params, obb): + """Test the equity market snapshots endpoint.""" result = obb.equity.market_snapshots(**params) assert result assert isinstance(result, OBBject) @@ -1597,6 +1719,7 @@ def test_equity_market_snapshots(params, obb): ) @pytest.mark.integration def test_equity_fundamental_historical_eps(params, obb): + """Test the equity fundamental historical eps endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.equity.fundamental.historical_eps(**params) @@ -1611,6 +1734,7 @@ def test_equity_fundamental_historical_eps(params, obb): ) @pytest.mark.integration def test_equity_fundamental_trailing_dividend_yield(params, obb): + """Test the equity fundamental trailing dividend yield endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.equity.fundamental.trailing_dividend_yield(**params) @@ -1656,6 +1780,7 @@ def test_equity_fundamental_trailing_dividend_yield(params, obb): ) @pytest.mark.integration def test_equity_fundamental_reported_financials(params, obb): + """Test the equity fundamental reported financials endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.equity.fundamental.reported_financials(**params) @@ -1679,6 +1804,7 @@ def test_equity_fundamental_reported_financials(params, obb): ) @pytest.mark.integration def test_equity_ownership_form_13f(params, obb): + """Test the equity ownership form 13f endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.equity.ownership.form_13f(**params) diff --git a/openbb_platform/extensions/equity/openbb_equity/compare/compare_router.py b/openbb_platform/extensions/equity/openbb_equity/compare/compare_router.py index 2f585055e3f..1737cd2dd08 100644 --- a/openbb_platform/extensions/equity/openbb_equity/compare/compare_router.py +++ b/openbb_platform/extensions/equity/openbb_equity/compare/compare_router.py @@ -28,7 +28,8 @@ async def peers( """Get the closest peers for a given company. Peers consist of companies trading on the same exchange, operating within the same sector - and with comparable market capitalizations.""" + and with comparable market capitalizations. + """ return await OBBject.from_query(Query(**locals())) @@ -67,5 +68,6 @@ async def groups( """Get company data grouped by sector, industry or country and display either performance or valuation metrics. Valuation metrics include price to earnings, price to book, price to sales ratios and price to cash flow. - Performance metrics include the stock price change for different time periods.""" + Performance metrics include the stock price change for different time periods. + """ return await OBBject.from_query(Query(**locals())) diff --git a/openbb_platform/extensions/equity/openbb_equity/darkpool/darkpool_router.py b/openbb_platform/extensions/equity/openbb_equity/darkpool/darkpool_router.py index 67307cbeec0..e9db292bceb 100644 --- a/openbb_platform/extensions/equity/openbb_equity/darkpool/darkpool_router.py +++ b/openbb_platform/extensions/equity/openbb_equity/darkpool/darkpool_router.py @@ -35,5 +35,6 @@ async def otc( """Get the weekly aggregate trade data for Over The Counter deals. ATS and non-ATS trading data for each ATS/firm - with trade reporting obligations under FINRA rules.""" + with trade reporting obligations under FINRA rules. + """ return await OBBject.from_query(Query(**locals())) diff --git a/openbb_platform/extensions/equity/openbb_equity/discovery/discovery_router.py b/openbb_platform/extensions/equity/openbb_equity/discovery/discovery_router.py index 86ccde2857d..b8fbbc1a7be 100644 --- a/openbb_platform/extensions/equity/openbb_equity/discovery/discovery_router.py +++ b/openbb_platform/extensions/equity/openbb_equity/discovery/discovery_router.py @@ -144,10 +144,11 @@ async def top_retail( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject: - """Tracks over $30B USD/day of individual investors trades. + """Track over $30B USD/day of individual investors trades. It gives a daily view into retail activity and sentiment for over 9,500 US traded stocks, - ADRs, and ETPs.""" + ADRs, and ETPs. + """ return await OBBject.from_query(Query(**locals())) @@ -186,8 +187,9 @@ async def filings( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject: - """Get the URLs to SEC filings reported to EDGAR database, such as 10-K, 10-Q, 8-K, and more. SEC - filings include Form 10-K, Form 10-Q, Form 8-K, the proxy statement, Forms 3, 4, and 5, Schedule 13, Form 114, + """Get the URLs to SEC filings reported to EDGAR database, such as 10-K, 10-Q, 8-K, and more. + + SEC filings include Form 10-K, Form 10-Q, Form 8-K, the proxy statement, Forms 3, 4, and 5, Schedule 13, Form 114, Foreign Investment Disclosures and others. The annual 10-K report is required to be filed annually and includes the company's financial statements, management discussion and analysis, and audited financial statements. diff --git a/openbb_platform/extensions/equity/openbb_equity/equity_router.py b/openbb_platform/extensions/equity/openbb_equity/equity_router.py index 9da54b7678c..1ba9b021587 100644 --- a/openbb_platform/extensions/equity/openbb_equity/equity_router.py +++ b/openbb_platform/extensions/equity/openbb_equity/equity_router.py @@ -21,7 +21,7 @@ from openbb_equity.ownership.ownership_router import router as ownership_router from openbb_equity.price.price_router import router as price_router from openbb_equity.shorts.shorts_router import router as shorts_router -router = Router(prefix="") +router = Router(prefix="", description="Equity market data.") router.include_router(calendar_router) router.include_router(compare_router) router.include_router(estimates_router) @@ -68,8 +68,10 @@ async def screener( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject: - """Screen for companies meeting various criteria. These criteria include - market cap, price, beta, volume, and dividend yield.""" + """Screen for companies meeting various criteria. + + These criteria include market cap, price, beta, volume, and dividend yield. + """ return await OBBject.from_query(Query(**locals())) diff --git a/openbb_platform/extensions/equity/openbb_equity/estimates/estimates_router.py b/openbb_platform/extensions/equity/openbb_equity/estimates/estimates_router.py index 07c328c334c..d321c3a9d31 100644 --- a/openbb_platform/extensions/equity/openbb_equity/estimates/estimates_router.py +++ b/openbb_platform/extensions/equity/openbb_equity/estimates/estimates_router.py @@ -91,3 +91,49 @@ async def analyst_search( ) -> OBBject: """Search for specific analysts and get their forecast track record.""" return await OBBject.from_query(Query(**locals())) + + +@router.command( + model="ForwardSalesEstimates", + examples=[ + APIEx(parameters={"symbol": "AAPL", "provider": "intrinio"}), + APIEx( + parameters={ + "fiscal_year": 2025, + "fiscal_period": "fy", + "provider": "intrinio", + } + ), + ], +) +async def forward_sales( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, + extra_params: ExtraParams, +) -> OBBject: + """Get forward sales estimates.""" + return await OBBject.from_query(Query(**locals())) + + +@router.command( + model="ForwardEpsEstimates", + examples=[ + APIEx(parameters={"symbol": "AAPL", "provider": "intrinio"}), + APIEx( + parameters={ + "fiscal_year": 2025, + "fiscal_period": "fy", + "provider": "intrinio", + } + ), + ], +) +async def forward_eps( + cc: CommandContext, + provider_choices: ProviderChoices, + standard_params: StandardParams, + extra_params: ExtraParams, +) -> OBBject: + """Get forward EPS estimates.""" + return await OBBject.from_query(Query(**locals())) diff --git a/openbb_platform/extensions/equity/openbb_equity/ownership/ownership_router.py b/openbb_platform/extensions/equity/openbb_equity/ownership/ownership_router.py index 8095164823e..4f118d27b63 100644 --- a/openbb_platform/extensions/equity/openbb_equity/ownership/ownership_router.py +++ b/openbb_platform/extensions/equity/openbb_equity/ownership/ownership_router.py @@ -102,7 +102,8 @@ async def form_13f( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject: - """ + """Get the form 13F. + The Securities and Exchange Commission's (SEC) Form 13F is a quarterly report that is required to be filed by all institutional investment managers with at least $100 million in assets under management. diff --git a/openbb_platform/extensions/equity/poetry.lock b/openbb_platform/extensions/equity/poetry.lock index 1f872410758..45aff8d211b 100644 --- a/openbb_platform/extensions/equity/poetry.lock +++ b/openbb_platform/extensions/equity/poetry.lock @@ -697,13 +697,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1416,4 +1416,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e5a1c1f22e0b8e42343cef04f6f23281c7d6441df13f2be91584098c856ab1f0" +content-hash = "ca421fe0dbae56150a2fc3a7978ad65f3dd4e70025bc4da4a7f1338b8eca522c" diff --git a/openbb_platform/extensions/equity/pyproject.toml b/openbb_platform/extensions/equity/pyproject.toml index 0b4702b29d6..18b460a6f12 100644 --- a/openbb_platform/extensions/equity/pyproject.toml +++ b/openbb_platform/extensions/equity/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-equity" -version = "1.1.4" +version = "1.1.5" description = "Equity extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_equity" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/extensions/etf/integration/test_etf_api.py b/openbb_platform/extensions/etf/integration/test_etf_api.py index 850998dd540..04029f6d6d9 100644 --- a/openbb_platform/extensions/etf/integration/test_etf_api.py +++ b/openbb_platform/extensions/etf/integration/test_etf_api.py @@ -1,3 +1,5 @@ +"""Integration tests for the ETF API.""" + import base64 import pytest @@ -9,6 +11,7 @@ from openbb_core.provider.utils.helpers import get_querystring @pytest.fixture(scope="session") def headers(): + """Get the headers for the API request.""" userpass = f"{Env().API_USERNAME}:{Env().API_PASSWORD}" userpass_bytes = userpass.encode("ascii") base64_bytes = base64.b64encode(userpass_bytes) @@ -43,6 +46,7 @@ def headers(): ) @pytest.mark.integration def test_etf_search(params, headers): + """Test the ETF search endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -227,6 +231,7 @@ def test_etf_search(params, headers): ) @pytest.mark.integration def test_etf_historical(params, headers): + """Test the ETF historical endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -247,6 +252,7 @@ def test_etf_historical(params, headers): ) @pytest.mark.integration def test_etf_info(params, headers): + """Test the ETF info endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -265,6 +271,7 @@ def test_etf_info(params, headers): ) @pytest.mark.integration def test_etf_sectors(params, headers): + """Test the ETF sectors endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -282,6 +289,7 @@ def test_etf_sectors(params, headers): ) @pytest.mark.integration def test_etf_holdings_date(params, headers): + """Test the ETF holdings date endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -337,12 +345,21 @@ def test_etf_holdings_date(params, headers): { "symbol": "DJIA", "provider": "intrinio", + "date": None, + } + ), + ( + { + "symbol": "QQQ", + "provider": "intrinio", + "date": "2020-04-03", } ), ], ) @pytest.mark.integration def test_etf_holdings(params, headers): + """Test the ETF holdings endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -369,6 +386,7 @@ def test_etf_holdings(params, headers): ) @pytest.mark.integration def test_etf_price_performance(params, headers): + """Test the ETF price performance endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -387,6 +405,7 @@ def test_etf_price_performance(params, headers): ) @pytest.mark.integration def test_etf_countries(params, headers): + """Test the ETF countries endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -402,6 +421,7 @@ def test_etf_countries(params, headers): ) @pytest.mark.integration def test_etf_discovery_gainers(params, headers): + """Test the ETF discovery gainers endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -417,6 +437,7 @@ def test_etf_discovery_gainers(params, headers): ) @pytest.mark.integration def test_etf_discovery_losers(params, headers): + """Test the ETF discovery losers endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -432,6 +453,7 @@ def test_etf_discovery_losers(params, headers): ) @pytest.mark.integration def test_etf_discovery_active(params, headers): + """Test the ETF discovery active endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -450,6 +472,7 @@ def test_etf_discovery_active(params, headers): ) @pytest.mark.integration def test_etf_holdings_performance(params, headers): + """Test the ETF holdings performance endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -467,6 +490,7 @@ def test_etf_holdings_performance(params, headers): ) @pytest.mark.integration def test_etf_equity_exposure(params, headers): + """Test the ETF equity exposure endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) diff --git a/openbb_platform/extensions/etf/integration/test_etf_python.py b/openbb_platform/extensions/etf/integration/test_etf_python.py index f3d966b831b..ed8ba2f99ce 100644 --- a/openbb_platform/extensions/etf/integration/test_etf_python.py +++ b/openbb_platform/extensions/etf/integration/test_etf_python.py @@ -42,6 +42,7 @@ def obb(pytestconfig): # pylint: disable=inconsistent-return-statements ) @pytest.mark.integration def test_etf_search(params, obb): + """Test the ETF search endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.etf.search(**params) @@ -225,6 +226,7 @@ def test_etf_search(params, obb): ) @pytest.mark.integration def test_etf_historical(params, obb): + """Test the ETF historical endpoint.""" result = obb.equity.price.historical(**params) assert result assert isinstance(result, OBBject) @@ -242,6 +244,7 @@ def test_etf_historical(params, obb): ) @pytest.mark.integration def test_etf_info(params, obb): + """Test the ETF info endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.etf.info(**params) @@ -259,6 +262,7 @@ def test_etf_info(params, obb): ) @pytest.mark.integration def test_etf_sectors(params, obb): + """Test the ETF sectors endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.etf.sectors(**params) @@ -275,6 +279,7 @@ def test_etf_sectors(params, obb): ) @pytest.mark.integration def test_etf_holdings_date(params, obb): + """Test the ETF holdings date endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.etf.holdings_date(**params) @@ -329,12 +334,21 @@ def test_etf_holdings_date(params, obb): { "symbol": "DJIA", "provider": "intrinio", + "date": None, + } + ), + ( + { + "symbol": "QQQ", + "provider": "intrinio", + "date": "2020-04-03", } ), ], ) @pytest.mark.integration def test_etf_holdings(params, obb): + """Test the ETF holdings endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.etf.holdings(**params) @@ -360,6 +374,7 @@ def test_etf_holdings(params, obb): ) @pytest.mark.integration def test_etf_price_performance(params, obb): + """Test the ETF price performance endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.etf.price_performance(**params) @@ -377,6 +392,7 @@ def test_etf_price_performance(params, obb): ) @pytest.mark.integration def test_etf_countries(params, obb): + """Test the ETF countries endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.etf.countries(**params) @@ -391,6 +407,7 @@ def test_etf_countries(params, obb): ) @pytest.mark.integration def test_etf_discovery_gainers(params, obb): + """Test the ETF discovery gainers endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.etf.discovery.gainers(**params) @@ -405,6 +422,7 @@ def test_etf_discovery_gainers(params, obb): ) @pytest.mark.integration def test_etf_discovery_losers(params, obb): + """Test the ETF discovery losers endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.etf.discovery.losers(**params) @@ -419,6 +437,7 @@ def test_etf_discovery_losers(params, obb): ) @pytest.mark.integration def test_etf_discovery_active(params, obb): + """Test the ETF discovery active endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.etf.discovery.active(**params) @@ -436,6 +455,7 @@ def test_etf_discovery_active(params, obb): ) @pytest.mark.integration def test_etf_holdings_performance(params, obb): + """Test the ETF holdings performance endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.etf.holdings_performance(**params) @@ -452,6 +472,7 @@ def test_etf_holdings_performance(params, obb): ) @pytest.mark.integration def test_etf_equity_exposure(params, obb): + """Test the ETF equity exposure endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.etf.equity_exposure(**params) diff --git a/openbb_platform/extensions/etf/openbb_etf/etf_router.py b/openbb_platform/extensions/etf/openbb_etf/etf_router.py index 3476644510d..52c367864fe 100644 --- a/openbb_platform/extensions/etf/openbb_etf/etf_router.py +++ b/openbb_platform/extensions/etf/openbb_etf/etf_router.py @@ -1,5 +1,6 @@ """ETF Router.""" +from openbb_core.app.deprecation import OpenBBDeprecationWarning from openbb_core.app.model.command_context import CommandContext from openbb_core.app.model.example import APIEx from openbb_core.app.model.obbject import OBBject @@ -13,7 +14,7 @@ from openbb_core.app.router import Router from openbb_etf.discovery.discovery_router import router as discovery_router -router = Router(prefix="") +router = Router(prefix="", description="Exchange Traded Funds market data.") router.include_router(discovery_router) # pylint: disable=unused-argument @@ -172,6 +173,13 @@ async def holdings_date( @router.command( model="EtfHoldingsPerformance", + deprecated=True, + deprecation=OpenBBDeprecationWarning( + message="This endpoint is deprecated; pass a list of holdings symbols directly to" + + " `/equity/price/performance` instead.", + since=(4, 1), + expected_removal=(4, 2), + ), examples=[APIEx(parameters={"symbol": "XLK", "provider": "fmp"})], ) async def holdings_performance( diff --git a/openbb_platform/extensions/etf/poetry.lock b/openbb_platform/extensions/etf/poetry.lock index 36725a9dbe9..c19757ae31a 100644 --- a/openbb_platform/extensions/etf/poetry.lock +++ b/openbb_platform/extensions/etf/poetry.lock @@ -678,13 +678,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1397,4 +1397,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.12" -content-hash = "75f551243cc84ea3dcba416d86f4ef5669b5b8b5fcf4781a0d8e3e69360b28e4" +content-hash = "df0539c34df30b9f361fb9099e221e5a86ba5c1ea1451a0748d7b87dba2203b0" diff --git a/openbb_platform/extensions/etf/pyproject.toml b/openbb_platform/extensions/etf/pyproject.toml index 05f6486a21e..0cc625ad03a 100644 --- a/openbb_platform/extensions/etf/pyproject.toml +++ b/openbb_platform/extensions/etf/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-etf" -version = "1.1.4" +version = "1.1.5" description = "ETF extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_etf" }] [tool.poetry.dependencies] python = ">=3.8,<3.12" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/extensions/fixedincome/integration/test_fixedincome_api.py b/openbb_platform/extensions/fixedincome/integration/test_fixedincome_api.py index 95b759beaac..da9c88c77c4 100644 --- a/openbb_platform/extensions/fixedincome/integration/test_fixedincome_api.py +++ b/openbb_platform/extensions/fixedincome/integration/test_fixedincome_api.py @@ -1,3 +1,5 @@ +"""Test fixedincome API endpoints.""" + import base64 import pytest @@ -11,6 +13,7 @@ from openbb_core.provider.utils.helpers import get_querystring @pytest.fixture(scope="session") def headers(): + """Get the headers for the API request.""" userpass = f"{Env().API_USERNAME}:{Env().API_PASSWORD}" userpass_bytes = userpass.encode("ascii") base64_bytes = base64.b64encode(userpass_bytes) @@ -24,6 +27,7 @@ def headers(): ) @pytest.mark.integration def test_fixedincome_government_treasury_rates(params, headers): + """Test the treasury rates endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -41,6 +45,7 @@ def test_fixedincome_government_treasury_rates(params, headers): ) @pytest.mark.integration def test_fixedincome_government_us_yield_curve(params, headers): + """Test the US yield curve endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -68,6 +73,7 @@ def test_fixedincome_government_us_yield_curve(params, headers): ) @pytest.mark.integration def test_fixedincome_sofr(params, headers): + """Test the SOFR endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -93,6 +99,7 @@ def test_fixedincome_sofr(params, headers): ) @pytest.mark.integration def test_fixedincome_rate_estr(params, headers): + """Test the ESTR rate endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -118,6 +125,7 @@ def test_fixedincome_rate_estr(params, headers): ) @pytest.mark.integration def test_fixedincome_rate_sonia(params, headers): + """Test the SONIA rate endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -143,6 +151,7 @@ def test_fixedincome_rate_sonia(params, headers): ) @pytest.mark.integration def test_fixedincome_rate_ameribor(params, headers): + """Test the Ameribor rate endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -174,6 +183,7 @@ def test_fixedincome_rate_ameribor(params, headers): ) @pytest.mark.integration def test_fixedincome_rate_effr(params, headers): + """Test the EFFR rate endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -189,6 +199,7 @@ def test_fixedincome_rate_effr(params, headers): ) @pytest.mark.integration def test_fixedincome_rate_effr_forecast(params, headers): + """Test the EFFR forecast rate endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -204,6 +215,7 @@ def test_fixedincome_rate_effr_forecast(params, headers): ) @pytest.mark.integration def test_fixedincome_rate_iorb(params, headers): + """Test the IORB rate endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -229,6 +241,7 @@ def test_fixedincome_rate_iorb(params, headers): ) @pytest.mark.integration def test_fixedincome_rate_dpcredit(params, headers): + """Test the DPCredit rate endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -252,6 +265,7 @@ def test_fixedincome_rate_dpcredit(params, headers): ) @pytest.mark.integration def test_fixedincome_rate_ecb(params, headers): + """Test the ECB rate endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -281,6 +295,7 @@ def test_fixedincome_rate_ecb(params, headers): ) @pytest.mark.integration def test_fixedincome_corporate_ice_bofa(params, headers): + """Test the ICE BofA corporate yield index endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -296,6 +311,7 @@ def test_fixedincome_corporate_ice_bofa(params, headers): ) @pytest.mark.integration def test_fixedincome_corporate_moody(params, headers): + """Test the Moody's corporate yield index endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -322,6 +338,7 @@ def test_fixedincome_corporate_moody(params, headers): ) @pytest.mark.integration def test_fixedincome_corporate_commercial_paper(params, headers): + """Test the commercial paper endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -365,6 +382,7 @@ def test_fixedincome_corporate_commercial_paper(params, headers): ) @pytest.mark.integration def test_fixedincome_corporate_spot_rates(params, headers): + """Test the corporate spot rates endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -380,6 +398,7 @@ def test_fixedincome_corporate_spot_rates(params, headers): ) @pytest.mark.integration def test_fixedincome_corporate_hqm(params, headers): + """Test the HQM corporate yield curve endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -395,6 +414,7 @@ def test_fixedincome_corporate_hqm(params, headers): ) @pytest.mark.integration def test_fixedincome_spreads_tcm(params, headers): + """Test the TCM spreads endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -419,6 +439,7 @@ def test_fixedincome_spreads_tcm(params, headers): ) @pytest.mark.integration def test_fixedincome_spreads_tcm_effr(params, headers): + """Test the TCM EFFR spreads endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -443,6 +464,7 @@ def test_fixedincome_spreads_tcm_effr(params, headers): ) @pytest.mark.integration def test_fixedincome_spreads_treasury_effr(params, headers): + """Test the treasury EFFR spreads endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -467,6 +489,7 @@ def test_fixedincome_spreads_treasury_effr(params, headers): ) @pytest.mark.integration def test_fixedincome_government_eu_yield_curve(params, headers): + """Test the EU yield curve endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -507,6 +530,7 @@ def test_fixedincome_government_eu_yield_curve(params, headers): ) @pytest.mark.integration def test_fixedincome_government_treasury_auctions(params, headers): + """Test the treasury auctions endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -552,13 +576,14 @@ def test_fixedincome_government_treasury_auctions(params, headers): ) @pytest.mark.integration def test_fixedincome_government_treasury_prices(params, headers): + """Test the treasury prices endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) url = ( f"http://0.0.0.0:8000/api/v1/fixedincome/government/treasury_prices?{query_str}" ) - result = requests.get(url, headers=headers, timeout=30) + result = requests.get(url, headers=headers, timeout=40) assert isinstance(result, requests.Response) assert result.status_code == 200 @@ -590,10 +615,11 @@ def test_fixedincome_government_treasury_prices(params, headers): ) @pytest.mark.integration def test_fixedincome_corporate_bond_prices(params, headers): + """Test the corporate bond prices endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) url = f"http://0.0.0.0:8000/api/v1/fixedincome/corporate/bond_prices?{query_str}" - result = requests.get(url, headers=headers, timeout=30) + result = requests.get(url, headers=headers, timeout=40) assert isinstance(result, requests.Response) assert result.status_code == 200 diff --git a/openbb_platform/extensions/fixedincome/integration/test_fixedincome_python.py b/openbb_platform/extensions/fixedincome/integration/test_fixedincome_python.py index 40c73bf077d..57ba30d7fad 100644 --- a/openbb_platform/extensions/fixedincome/integration/test_fixedincome_python.py +++ b/openbb_platform/extensions/fixedincome/integration/test_fixedincome_python.py @@ -26,6 +26,7 @@ def obb(pytestconfig): ) @pytest.mark.integration def test_fixedincome_government_treasury_rates(params, obb): + """Test the treasury rates endpoint.""" result = obb.fixedincome.government.treasury_rates(**params) assert result assert isinstance(result, OBBject) @@ -40,6 +41,7 @@ def test_fixedincome_government_treasury_rates(params, obb): ) @pytest.mark.integration def test_fixedincome_government_us_yield_curve(params, obb): + """Test the US yield curve endpoint.""" result = obb.fixedincome.government.us_yield_curve(**params) assert result assert isinstance(result, OBBject) @@ -62,6 +64,7 @@ def test_fixedincome_government_us_yield_curve(params, obb): ) @pytest.mark.integration def test_fixedincome_sofr(params, obb): + """Test the SOFR endpoint.""" result = obb.fixedincome.sofr(**params) assert result assert isinstance(result, OBBject) @@ -84,6 +87,7 @@ def test_fixedincome_sofr(params, obb): ) @pytest.mark.integration def test_fixedincome_rate_estr(params, obb): + """Test the ESTR endpoint.""" result = obb.fixedincome.rate.estr(**params) assert result assert isinstance(result, OBBject) @@ -106,6 +110,7 @@ def test_fixedincome_rate_estr(params, obb): ) @pytest.mark.integration def test_fixedincome_rate_sonia(params, obb): + """Test the SONIA endpoint.""" result = obb.fixedincome.rate.sonia(**params) assert result assert isinstance(result, OBBject) @@ -128,6 +133,7 @@ def test_fixedincome_rate_sonia(params, obb): ) @pytest.mark.integration def test_fixedincome_rate_ameribor(params, obb): + """Test the Ameribor endpoint.""" result = obb.fixedincome.rate.ameribor(**params) assert result assert isinstance(result, OBBject) @@ -156,6 +162,7 @@ def test_fixedincome_rate_ameribor(params, obb): ) @pytest.mark.integration def test_fixedincome_rate_effr(params, obb): + """Test the EFFR endpoint.""" result = obb.fixedincome.rate.effr(**params) assert result assert isinstance(result, OBBject) @@ -171,6 +178,7 @@ def test_fixedincome_rate_effr(params, obb): ) @pytest.mark.integration def test_fixedincome_rate_effr_forecast(params, obb): + """Test the EFFR forecast endpoint.""" result = obb.fixedincome.rate.effr_forecast(**params) assert result assert isinstance(result, OBBject) @@ -185,6 +193,7 @@ def test_fixedincome_rate_effr_forecast(params, obb): ) @pytest.mark.integration def test_fixedincome_rate_iorb(params, obb): + """Test the IORB endpoint.""" result = obb.fixedincome.rate.iorb(**params) assert result assert isinstance(result, OBBject) @@ -207,6 +216,7 @@ def test_fixedincome_rate_iorb(params, obb): ) @pytest.mark.integration def test_fixedincome_rate_dpcredit(params, obb): + """Test the DPCREDIT endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.fixedincome.rate.dpcredit(**params) @@ -229,6 +239,7 @@ def test_fixedincome_rate_dpcredit(params, obb): ) @pytest.mark.integration def test_fixedincome_rate_ecb(params, obb): + """Test the ECB endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.fixedincome.rate.ecb(**params) @@ -257,6 +268,7 @@ def test_fixedincome_rate_ecb(params, obb): ) @pytest.mark.integration def test_fixedincome_corporate_ice_bofa(params, obb): + """Test the ICE BofA endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.fixedincome.corporate.ice_bofa(**params) @@ -271,6 +283,7 @@ def test_fixedincome_corporate_ice_bofa(params, obb): ) @pytest.mark.integration def test_fixedincome_corporate_moody(params, obb): + """Test the Moody endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.fixedincome.corporate.moody(**params) @@ -296,6 +309,7 @@ def test_fixedincome_corporate_moody(params, obb): ) @pytest.mark.integration def test_fixedincome_corporate_commercial_paper(params, obb): + """Test the commercial paper endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.fixedincome.corporate.commercial_paper(**params) @@ -336,6 +350,7 @@ def test_fixedincome_corporate_commercial_paper(params, obb): ) @pytest.mark.integration def test_fixedincome_corporate_spot_rates(params, obb): + """Test the spot rates endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.fixedincome.corporate.spot_rates(**params) @@ -350,6 +365,7 @@ def test_fixedincome_corporate_spot_rates(params, obb): ) @pytest.mark.integration def test_fixedincome_corporate_hqm(params, obb): + """Test the HQM endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.fixedincome.corporate.hqm(**params) @@ -364,6 +380,7 @@ def test_fixedincome_corporate_hqm(params, obb): ) @pytest.mark.integration def test_fixedincome_spreads_tcm(params, obb): + """Test the TCM endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.fixedincome.spreads.tcm(**params) @@ -387,6 +404,7 @@ def test_fixedincome_spreads_tcm(params, obb): ) @pytest.mark.integration def test_fixedincome_spreads_tcm_effr(params, obb): + """Test the TCM EFFR endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.fixedincome.spreads.tcm_effr(**params) @@ -410,6 +428,7 @@ def test_fixedincome_spreads_tcm_effr(params, obb): ) @pytest.mark.integration def test_fixedincome_spreads_treasury_effr(params, obb): + """Test the treasury EFFR endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.fixedincome.spreads.treasury_effr(**params) @@ -433,6 +452,7 @@ def test_fixedincome_spreads_treasury_effr(params, obb): ) @pytest.mark.integration def test_fixedincome_government_eu_yield_curve(params, obb): + """Test the EU yield curve endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.fixedincome.government.eu_yield_curve(**params) @@ -470,6 +490,7 @@ def test_fixedincome_government_eu_yield_curve(params, obb): ) @pytest.mark.integration def test_fixedincome_government_treasury_auctions(params, obb): + """Test the treasury auctions endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.fixedincome.government.treasury_auctions(**params) @@ -514,6 +535,7 @@ def test_fixedincome_government_treasury_auctions(params, obb): ) @pytest.mark.integration def test_fixedincome_government_treasury_prices(params, obb): + """Test the treasury prices endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.fixedincome.government.treasury_prices(**params) @@ -549,6 +571,7 @@ def test_fixedincome_government_treasury_prices(params, obb): ) @pytest.mark.integration def test_fixedincome_corporate_bond_prices(params, obb): + """Test the bond prices endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.fixedincome.corporate.bond_prices(**params) diff --git a/openbb_platform/extensions/fixedincome/openbb_fixedincome/fixedincome_router.py b/openbb_platform/extensions/fixedincome/openbb_fixedincome/fixedincome_router.py index feac9a5898e..0e232cb1cdb 100644 --- a/openbb_platform/extensions/fixedincome/openbb_fixedincome/fixedincome_router.py +++ b/openbb_platform/extensions/fixedincome/openbb_fixedincome/fixedincome_router.py @@ -18,7 +18,7 @@ from openbb_fixedincome.government.government_router import router as government from openbb_fixedincome.rate.rate_router import router as rate_router from openbb_fixedincome.spreads.spreads_router import router as spreads_router -router = Router(prefix="") +router = Router(prefix="", description="Fixed Income market data.") router.include_router(rate_router) router.include_router(spreads_router) router.include_router(government_router) diff --git a/openbb_platform/extensions/fixedincome/poetry.lock b/openbb_platform/extensions/fixedincome/poetry.lock index 1f872410758..45aff8d211b 100644 --- a/openbb_platform/extensions/fixedincome/poetry.lock +++ b/openbb_platform/extensions/fixedincome/poetry.lock @@ -697,13 +697,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1416,4 +1416,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e5a1c1f22e0b8e42343cef04f6f23281c7d6441df13f2be91584098c856ab1f0" +content-hash = "ca421fe0dbae56150a2fc3a7978ad65f3dd4e70025bc4da4a7f1338b8eca522c" diff --git a/openbb_platform/extensions/fixedincome/pyproject.toml b/openbb_platform/extensions/fixedincome/pyproject.toml index 3b887303823..a0027750f20 100644 --- a/openbb_platform/extensions/fixedincome/pyproject.toml +++ b/openbb_platform/extensions/fixedincome/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-fixedincome" -version = "1.1.4" +version = "1.1.5" description = "Fixed income extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_fixedincome" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/extensions/index/integration/test_index_api.py b/openbb_platform/extensions/index/integration/test_index_api.py index 0b5006c80f5..c7ec360663d 100644 --- a/openbb_platform/extensions/index/integration/test_index_api.py +++ b/openbb_platform/extensions/index/integration/test_index_api.py @@ -1,3 +1,5 @@ +"""Test the index API endpoints.""" + import base64 import pytest @@ -9,6 +11,7 @@ from openbb_core.provider.utils.helpers import get_querystring @pytest.fixture(scope="session") def headers(): + """Get the headers for the API request.""" userpass = f"{Env().API_USERNAME}:{Env().API_PASSWORD}" userpass_bytes = userpass.encode("ascii") base64_bytes = base64.b64encode(userpass_bytes) @@ -29,6 +32,7 @@ def headers(): ) @pytest.mark.integration def test_index_constituents(params, headers): + """Test the index constituents endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -114,6 +118,7 @@ def test_index_constituents(params, headers): ) @pytest.mark.integration def test_index_price_historical(params, headers): + """Test the index historical price endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -191,6 +196,7 @@ def test_index_price_historical(params, headers): @pytest.mark.integration @pytest.mark.skip(reason="Deprecating this endpoint") def test_index_market(params, headers): + """Test the index market endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -211,6 +217,7 @@ def test_index_market(params, headers): ) @pytest.mark.integration def test_index_available(params, headers): + """Test the index available endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -228,6 +235,7 @@ def test_index_available(params, headers): ) @pytest.mark.integration def test_index_search(params, headers): + """Test the index search endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -246,6 +254,7 @@ def test_index_search(params, headers): ) @pytest.mark.integration def test_index_snapshots(params, headers): + """Test the index snapshots endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -272,6 +281,7 @@ def test_index_snapshots(params, headers): ) @pytest.mark.integration def test_index_sp500_multiples(params, headers): + """Test the index sp500 multiples endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -289,6 +299,7 @@ def test_index_sp500_multiples(params, headers): ) @pytest.mark.integration def test_index_sectors(params, headers): + """Test the index sectors endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) diff --git a/openbb_platform/extensions/index/integration/test_index_python.py b/openbb_platform/extensions/index/integration/test_index_python.py index 1082fce00ba..af8d2b54983 100644 --- a/openbb_platform/extensions/index/integration/test_index_python.py +++ b/openbb_platform/extensions/index/integration/test_index_python.py @@ -28,6 +28,7 @@ def obb(pytestconfig): # pylint: disable=inconsistent-return-statements ) @pytest.mark.integration def test_index_constituents(params, obb): + """Test the index constituents endpoint.""" result = obb.index.constituents(**params) assert result assert isinstance(result, OBBject) @@ -110,6 +111,7 @@ def test_index_constituents(params, obb): ) @pytest.mark.integration def test_index_price_historical(params, obb): + """Test the index historical price endpoint.""" result = obb.index.price.historical(**params) assert result assert isinstance(result, OBBject) @@ -184,6 +186,7 @@ def test_index_price_historical(params, obb): @pytest.mark.integration @pytest.mark.skip(reason="Deprecating this endpoint") def test_index_market(params, obb): + """Test the index market endpoint.""" result = obb.index.market(**params) assert result assert isinstance(result, OBBject) @@ -202,6 +205,7 @@ def test_index_market(params, obb): ) @pytest.mark.integration def test_index_available(params, obb): + """Test the index available endpoint.""" result = obb.index.available(**params) assert result assert isinstance(result, OBBject) @@ -223,6 +227,7 @@ def test_index_available(params, obb): ) @pytest.mark.integration def test_index_search(params, obb): + """Test the index search endpoint.""" result = obb.index.search(**params) assert result assert isinstance(result, OBBject) @@ -238,6 +243,7 @@ def test_index_search(params, obb): ) @pytest.mark.integration def test_index_snapshots(params, obb): + """Test the index snapshots endpoint.""" result = obb.index.snapshots(**params) assert result assert isinstance(result, OBBject) @@ -261,6 +267,7 @@ def test_index_snapshots(params, obb): ) @pytest.mark.integration def test_index_sp500_multiples(params, obb): + """Test the index sp500 multiples endpoint.""" result = obb.index.sp500_multiples(**params) assert result assert isinstance(result, OBBject) @@ -275,6 +282,7 @@ def test_index_sp500_multiples(params, obb): ) @pytest.mark.integration def test_index_sectors(params, obb): + """Test the index sectors endpoint.""" result = obb.index.sectors(**params) assert result assert isinstance(result, OBBject) diff --git a/openbb_platform/extensions/index/openbb_index/index_router.py b/openbb_platform/extensions/index/openbb_index/index_router.py index 80c4b7bae5e..4ad7d393726 100644 --- a/openbb_platform/extensions/index/openbb_index/index_router.py +++ b/openbb_platform/extensions/index/openbb_index/index_router.py @@ -14,7 +14,7 @@ from openbb_core.app.router import Router from openbb_index.price.price_router import router as price_router -router = Router(prefix="") +router = Router(prefix="", description="Indices data.") router.include_router(price_router) # pylint: disable=unused-argument @@ -36,7 +36,7 @@ async def market( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject: - """Historical Market Indices.""" + """Get Historical Market Indices.""" return await OBBject.from_query(Query(**locals())) @@ -56,7 +56,7 @@ async def constituents( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject: - """Index Constituents.""" + """Get Index Constituents.""" return await OBBject.from_query(Query(**locals())) @@ -107,7 +107,7 @@ async def search( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject: - """Filters indices for rows containing the query.""" + """Filter indices for rows containing the query.""" return await OBBject.from_query(Query(**locals())) @@ -124,7 +124,7 @@ async def sp500_multiples( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject: - """Historical S&P 500 multiples and Shiller PE ratios.""" + """Get historical S&P 500 multiples and Shiller PE ratios.""" return await OBBject.from_query(Query(**locals())) @@ -138,5 +138,5 @@ async def sectors( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject: - """Index Sectors. Sector weighting of an index.""" + """Get Index Sectors. Sector weighting of an index.""" return await OBBject.from_query(Query(**locals())) diff --git a/openbb_platform/extensions/index/poetry.lock b/openbb_platform/extensions/index/poetry.lock index 7f12dfce23c..f5cf8931f29 100644 --- a/openbb_platform/extensions/index/poetry.lock +++ b/openbb_platform/extensions/index/poetry.lock @@ -682,13 +682,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1401,4 +1401,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e5a1c1f22e0b8e42343cef04f6f23281c7d6441df13f2be91584098c856ab1f0" +content-hash = "ca421fe0dbae56150a2fc3a7978ad65f3dd4e70025bc4da4a7f1338b8eca522c" diff --git a/openbb_platform/extensions/index/pyproject.toml b/openbb_platform/extensions/index/pyproject.toml index 98784a0ee69..7589baac2ff 100644 --- a/openbb_platform/extensions/index/pyproject.toml +++ b/openbb_platform/extensions/index/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-index" -version = "1.1.4" +version = "1.1.5" description = "Index extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_index" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/extensions/news/integration/test_news_api.py b/openbb_platform/extensions/news/integration/test_news_api.py index 2b685a34857..fe8fc4dac53 100644 --- a/openbb_platform/extensions/news/integration/test_news_api.py +++ b/openbb_platform/extensions/news/integration/test_news_api.py @@ -1,3 +1,5 @@ +"""Test News API.""" + import base64 import pytest @@ -9,6 +11,7 @@ from openbb_core.provider.utils.helpers import get_querystring @pytest.fixture(scope="session") def headers(): + """Generate headers for API requests with basic authentication.""" userpass = f"{Env().API_USERNAME}:{Env().API_PASSWORD}" userpass_bytes = userpass.encode("ascii") base64_bytes = base64.b64encode(userpass_bytes) @@ -83,6 +86,7 @@ def headers(): ) @pytest.mark.integration def test_news_world(params, headers): + """Test retrieval of world news with various parameters.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -187,6 +191,7 @@ def test_news_world(params, headers): ) @pytest.mark.integration def test_news_company(params, headers): + """Test retrieval of company-specific news with various parameters.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) diff --git a/openbb_platform/extensions/news/integration/test_news_python.py b/openbb_platform/extensions/news/integration/test_news_python.py index 38bbbbfded1..2b876d19391 100644 --- a/openbb_platform/extensions/news/integration/test_news_python.py +++ b/openbb_platform/extensions/news/integration/test_news_python.py @@ -82,6 +82,7 @@ def obb(pytestconfig): # pylint: disable=inconsistent-return-statements ) @pytest.mark.integration def test_news_world(params, obb): + """Test the news world endpoint.""" result = obb.news.world(**params) assert result assert isinstance(result, OBBject) @@ -172,6 +173,7 @@ def test_news_world(params, obb): ) @pytest.mark.integration def test_news_company(params, obb): + """Test the news company endpoint.""" params = {p: v for p, v in params.items() if v} result = obb.news.company(**params) diff --git a/openbb_platform/extensions/news/openbb_news/__init__.py b/openbb_platform/extensions/news/openbb_news/__init__.py index e69de29bb2d..5d818002605 100644 --- a/openbb_platform/extensions/news/openbb_news/__init__.py +++ b/openbb_platform/extensions/news/openbb_news/__init__.py @@ -0,0 +1 @@ +"""OpenBB News extension.""" diff --git a/openbb_platform/extensions/news/openbb_news/news_router.py b/openbb_platform/extensions/news/openbb_news/news_router.py index 1a964f363b9..bad1a7f21c4 100644 --- a/openbb_platform/extensions/news/openbb_news/news_router.py +++ b/openbb_platform/extensions/news/openbb_news/news_router.py @@ -12,7 +12,7 @@ from openbb_core.app.provider_interface import ( from openbb_core.app.query import Query from openbb_core.app.router import Router -router = Router(prefix="") +router = Router(prefix="", description="Financial market news data.") @router.command( diff --git a/openbb_platform/extensions/news/poetry.lock b/openbb_platform/extensions/news/poetry.lock index 1f872410758..45aff8d211b 100644 --- a/openbb_platform/extensions/news/poetry.lock +++ b/openbb_platform/extensions/news/poetry.lock @@ -697,13 +697,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1416,4 +1416,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e5a1c1f22e0b8e42343cef04f6f23281c7d6441df13f2be91584098c856ab1f0" +content-hash = "ca421fe0dbae56150a2fc3a7978ad65f3dd4e70025bc4da4a7f1338b8eca522c" diff --git a/openbb_platform/extensions/news/pyproject.toml b/openbb_platform/extensions/news/pyproject.toml index 86899175603..ac1e05a120f 100644 --- a/openbb_platform/extensions/news/pyproject.toml +++ b/openbb_platform/extensions/news/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-news" -version = "1.1.4" +version = "1.1.5" description = "News extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_news" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/extensions/quantitative/README.md b/openbb_platform/extensions/quantitative/README.md index e6958f16ef6..b1193e287d5 100644 --- a/openbb_platform/extensions/quantitative/README.md +++ b/openbb_platform/extensions/quantitative/README.md @@ -11,7 +11,7 @@ This extension works nicely with a companion `openbb-charting` extension To install the extension, run the following command in this folder: ```bash -pip install openbb-qa +pip install openbb-quantitative ``` For development please check [Contribution Guidelines](https://github.com/OpenBB-finance/OpenBBTerminal/blob/develop/openbb_platform/CONTRIBUTING.md). diff --git a/openbb_platform/extensions/quantitative/integration/test_quantitative_api.py b/openbb_platform/extensions/quantitative/integration/test_quantitative_api.py index 57782126fc7..ce16394488b 100644 --- a/openbb_platform/extensions/quantitative/integration/test_quantitative_api.py +++ b/openbb_platform/extensions/quantitative/integration/test_quantitative_api.py @@ -1,3 +1,5 @@ +"""Integration tests for the quantitative extension.""" + import base64 import json import random @@ -15,6 +17,7 @@ data: dict = {} def get_headers(): + """Get the headers for the API request.""" if "headers" in data: return data["headers"] @@ -30,12 +33,13 @@ def request_data( menu: str, symbol: str, provider: str, start_date: str = "", end_date: str = "" ): """Randomly pick a symbol and a provider and get data from the selected menu.""" - url = f"http://0.0.0.0:8000/api/v1/{menu}/price/historical?symbol={symbol}&provider={provider}&start_date={start_date}&end_date={end_date}" + url = f"http://0.0.0.0:8000/api/v1/{menu}/price/historical?symbol={symbol}&provider={provider}&start_date={start_date}&end_date={end_date}" # pylint: disable=line-too-long # noqa: E501 result = requests.get(url, headers=get_headers(), timeout=10) return result.json()["results"] def get_stocks_data(): + """Get stocks data.""" if "stocks_data" in data: return data["stocks_data"] @@ -53,6 +57,7 @@ def get_stocks_data(): def get_crypto_data(): + """Get crypto data.""" if "crypto_data" in data: return data["crypto_data"] @@ -71,6 +76,7 @@ def get_crypto_data(): def get_data(menu: Literal["equity", "crypto"]): + """Get data based on the selected menu.""" funcs = {"equity": get_stocks_data, "crypto": get_crypto_data} return funcs[menu]() @@ -84,6 +90,7 @@ def get_data(menu: Literal["equity", "crypto"]): ) @pytest.mark.integration def test_quantitative_normality(params, data_type): + """Test the normality endpoint.""" params = {p: v for p, v in params.items() if v} data = json.dumps(get_data(data_type)) @@ -103,6 +110,7 @@ def test_quantitative_normality(params, data_type): ) @pytest.mark.integration def test_quantitative_capm(params, data_type): + """Test the CAPM endpoint.""" params = {p: v for p, v in params.items() if v} data = json.dumps(get_data(data_type)) @@ -138,6 +146,7 @@ def test_quantitative_capm(params, data_type): ) @pytest.mark.integration def test_quantitative_performance_omega_ratio(params, data_type): + """Test the Omega Ratio endpoint.""" params = {p: v for p, v in params.items() if v} data = json.dumps(get_data(data_type)) @@ -157,6 +166,7 @@ def test_quantitative_performance_omega_ratio(params, data_type): ) @pytest.mark.integration def test_quantitative_rolling_kurtosis(params, data_type): + """Test the rolling kurtosis endpoint.""" params = {p: v for p, v in params.items() if v} data = json.dumps(get_data(data_type)) @@ -192,6 +202,7 @@ def test_quantitative_rolling_kurtosis(params, data_type): ) @pytest.mark.integration def test_quantitative_unitroot_test(params, data_type): + """Test the unit root test endpoint.""" params = {p: v for p, v in params.items() if v} data = json.dumps(get_data(data_type)) @@ -229,6 +240,7 @@ def test_quantitative_unitroot_test(params, data_type): ) @pytest.mark.integration def test_quantitative_performance_sharpe_ratio(params, data_type): + """Test the Sharpe Ratio endpoint.""" params = {p: v for p, v in params.items() if v} data = json.dumps(get_data(data_type)) @@ -270,6 +282,7 @@ def test_quantitative_performance_sharpe_ratio(params, data_type): ) @pytest.mark.integration def test_quantitative_performance_sortino_ratio(params, data_type): + """Test the Sortino Ratio endpoint.""" params = {p: v for p, v in params.items() if v} data = json.dumps(get_data(data_type)) @@ -290,6 +303,7 @@ def test_quantitative_performance_sortino_ratio(params, data_type): ) @pytest.mark.integration def test_quantitative_rolling_skew(params, data_type): + """Test the rolling skew endpoint.""" params = {p: v for p, v in params.items() if v} data = json.dumps(get_data(data_type)) @@ -308,6 +322,7 @@ def test_quantitative_rolling_skew(params, data_type): ) @pytest.mark.integration def test_quantitative_rolling_variance(params, data_type): + """Test the rolling variance endpoint.""" params = {p: v for p, v in params.items() if v} data = json.dumps(get_data(data_type)) @@ -326,6 +341,7 @@ def test_quantitative_rolling_variance(params, data_type): ) @pytest.mark.integration def test_quantitative_rolling_stdev(params, data_type): + """Test the rolling standard deviation endpoint.""" params = {p: v for p, v in params.items() if v} data = json.dumps(get_data(data_type)) @@ -344,6 +360,7 @@ def test_quantitative_rolling_stdev(params, data_type): ) @pytest.mark.integration def test_quantitative_rolling_mean(params, data_type): + """Test the rolling mean endpoint.""" params = {p: v for p, v in params.items() if v} data = json.dumps(get_data(data_type)) @@ -381,6 +398,7 @@ def test_quantitative_rolling_mean(params, data_type): ) @pytest.mark.integration def test_quantitative_rolling_quantile(params, data_type): + """Test the rolling quantile endpoint.""" params = {p: v for p, v in params.items() if v} data = json.dumps(get_data(data_type)) @@ -400,6 +418,7 @@ def test_quantitative_rolling_quantile(params, data_type): ) @pytest.mark.integration def test_quantitative_summary(params, data_type): + """Test the summary endpoint.""" params = {p: v for p, v in params.items() if v} data = json.dumps(get_data(data_type)) @@ -423,6 +442,7 @@ def test_quantitative_summary(params, data_type): ) @pytest.mark.integration def test_quantitative_stats_skew(params, data_type): + """Test the skew endpoint.""" params = {p: v for p, v in params.items() if v} data = json.dumps(get_data(data_type)) @@ -441,6 +461,7 @@ def test_quantitative_stats_skew(params, data_type): ) @pytest.mark.integration def test_quantitative_stats_kurtosis(params, data_type): + """Test the kurtosis endpoint.""" params = {p: v for p, v in params.items() if v} data = json.dumps(get_data(data_type)) @@ -459,6 +480,7 @@ def test_quantitative_stats_kurtosis(params, data_type): ) @pytest.mark.integration def test_quantitative_stats_mean(params, data_type): + """Test the mean endpoint.""" params = {p: v for p, v in params.items() if v} data = json.dumps(get_data(data_type)) @@ -477,6 +499,7 @@ def test_quantitative_stats_mean(params, data_type): ) @pytest.mark.integration def test_quantitative_stats_stdev(params, data_type): + """Test the standard deviation endpoint.""" params = {p: v for p, v in params.items() if v} data = json.dumps(get_data(data_type)) @@ -495,6 +518,7 @@ def test_quantitative_stats_stdev(params, data_type): ) @pytest.mark.integration def test_quantitative_stats_variance(params, data_type): + """Test the variance endpoint.""" params = {p: v for p, v in params.items() if v} data = json.dumps(get_data(data_type)) @@ -530,6 +554,7 @@ def test_quantitative_stats_variance(params, data_type): ) @pytest.mark.integration def test_quantitative_stats_quantile(params, data_type): + """Test the quantile endpoint.""" params = {p: v for p, v in params.items() if v} data = json.dumps(get_data(data_type)) diff --git a/openbb_platform/extensions/quantitative/integration/test_quantitative_python.py b/openbb_platform/extensions/quantitative/integration/test_quantitative_python.py index f9fd73b832d..4a2433e8ba7 100644 --- a/openbb_platform/extensions/quantitative/integration/test_quantitative_python.py +++ b/openbb_platform/extensions/quantitative/integration/test_quantitative_python.py @@ -24,6 +24,7 @@ data: dict = {} def get_stocks_data(): + """Get stocks data.""" import openbb # pylint:disable=import-outside-toplevel if "stocks_data" in data: @@ -39,6 +40,7 @@ def get_stocks_data(): def get_crypto_data(): + """Get crypto data.""" import openbb # pylint:disable=import-outside-toplevel if "crypto_data" in data: @@ -55,6 +57,7 @@ def get_crypto_data(): def get_data(menu: Literal["equity", "crypto"]): + """Get data.""" funcs = {"equity": get_stocks_data, "crypto": get_crypto_data} return funcs[menu]() @@ -68,6 +71,7 @@ def get_data(menu: Literal["equity", "crypto"]): ) @pytest.mark.integration def test_quantitative_normality(params, data_type, obb): + """Test normality.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -85,6 +89,7 @@ def test_quantitative_normality(params, data_type, obb): ) @pytest.mark.integration def test_quantitative_capm(params, data_type, obb): + """Test capm.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -118,6 +123,7 @@ def test_quantitative_capm(params, data_type, obb): ) @pytest.mark.integration def test_quantitative_performance_omega_ratio(params, data_type, obb): + """Test omega ratio.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -135,6 +141,7 @@ def test_quantitative_performance_omega_ratio(params, data_type, obb): ) @pytest.mark.integration def test_quantitative_rolling_kurtosis(params, data_type, obb): + """Test rolling kurtosis.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -169,6 +176,7 @@ def test_quantitative_rolling_kurtosis(params, data_type, obb): ) @pytest.mark.integration def test_quantitative_unitroot_test(params, data_type, obb): + """Test unitroot test.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -204,6 +212,7 @@ def test_quantitative_unitroot_test(params, data_type, obb): ) @pytest.mark.integration def test_quantitative_performance_sharpe_ratio(params, data_type, obb): + """Test sharpe ratio.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -241,6 +250,7 @@ def test_quantitative_performance_sharpe_ratio(params, data_type, obb): ) @pytest.mark.integration def test_quantitative_performance_sortino_ratio(params, data_type, obb): + """Test sortino ratio.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -257,6 +267,7 @@ def test_quantitative_performance_sortino_ratio(params, data_type, obb): ) @pytest.mark.integration def test_quantitative_rolling_skew(params, data_type, obb): + """Test rolling skew.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -293,6 +304,7 @@ def test_quantitative_rolling_skew(params, data_type, obb): ) @pytest.mark.integration def test_quantitative_rolling_quantile(params, data_type, obb): + """Test rolling quantile.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -311,6 +323,7 @@ def test_quantitative_rolling_quantile(params, data_type, obb): ) @pytest.mark.integration def test_quantitative_summary(params, data_type, obb): + """Test summary.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -344,6 +357,7 @@ def test_quantitative_summary(params, data_type, obb): ) @pytest.mark.integration def test_quantitative_rolling_stdev(params, data_type, obb): + """Test rolling stdev.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -378,6 +392,7 @@ def test_quantitative_rolling_stdev(params, data_type, obb): ) @pytest.mark.integration def test_quantitative_rolling_mean(params, data_type, obb): + """Test rolling mean.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -412,6 +427,7 @@ def test_quantitative_rolling_mean(params, data_type, obb): ) @pytest.mark.integration def test_quantitative_rolling_variance(params, data_type, obb): + """Test rolling variance.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -429,6 +445,7 @@ def test_quantitative_rolling_variance(params, data_type, obb): ) @pytest.mark.integration def test_quantitative_stats_skew(params, data_type, obb): + """Test skew.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -446,6 +463,7 @@ def test_quantitative_stats_skew(params, data_type, obb): ) @pytest.mark.integration def test_quantitative_stats_kurtosis(params, data_type, obb): + """Test kurtosis.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -463,6 +481,7 @@ def test_quantitative_stats_kurtosis(params, data_type, obb): ) @pytest.mark.integration def test_quantitative_stats_variance(params, data_type, obb): + """Test variance.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -480,6 +499,7 @@ def test_quantitative_stats_variance(params, data_type, obb): ) @pytest.mark.integration def test_quantitative_stats_stdev(params, data_type, obb): + """Test stdev.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -497,6 +517,7 @@ def test_quantitative_stats_stdev(params, data_type, obb): ) @pytest.mark.integration def test_quantitative_stats_mean(params, data_type, obb): + """Test mean.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -529,6 +550,7 @@ def test_quantitative_stats_mean(params, data_type, obb): ) @pytest.mark.integration def test_quantitative_stats_quantile(params, data_type, obb): + """Test quantile.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) diff --git a/openbb_platform/extensions/quantitative/openbb_quantitative/performance/performance_router.py b/openbb_platform/extensions/quantitative/openbb_quantitative/performance/performance_router.py index 025df52bb20..1f5110cc409 100644 --- a/openbb_platform/extensions/quantitative/openbb_quantitative/performance/performance_router.py +++ b/openbb_platform/extensions/quantitative/openbb_quantitative/performance/performance_router.py @@ -1,3 +1,5 @@ +"""OpenBB Performance Extension router.""" + from typing import List import numpy as np diff --git a/openbb_platform/extensions/quantitative/openbb_quantitative/quantitative_router.py b/openbb_platform/extensions/quantitative/openbb_quantitative/quantitative_router.py index 0065ec62011..9ccd89d550a 100644 --- a/openbb_platform/extensions/quantitative/openbb_quantitative/quantitative_router.py +++ b/openbb_platform/extensions/quantitative/openbb_quantitative/quantitative_router.py @@ -30,7 +30,7 @@ from .models import ( UnitRootModel, ) -router = Router(prefix="") +router = Router(prefix="", description="Quantitative analysis tools.") router.include_router(rolling_router) router.include_router(stats_router) router.include_router(performance_router) diff --git a/openbb_platform/extensions/quantitative/openbb_quantitative/rolling/rolling_router.py b/openbb_platform/extensions/quantitative/openbb_quantitative/rolling/rolling_router.py index 34ef9be67a1..8bcfaa05143 100644 --- a/openbb_platform/extensions/quantitative/openbb_quantitative/rolling/rolling_router.py +++ b/openbb_platform/extensions/quantitative/openbb_quantitative/rolling/rolling_router.py @@ -376,8 +376,7 @@ def quantile( def mean( data: List[Data], target: str, window: PositiveInt = 21, index: str = "date" ) -> OBBject[List[Data]]: - """ - Calculate the rolling mean (average) of a target column within a given window size. + """Calculate the rolling average of a target column within a given window size. The rolling mean is a simple moving average that calculates the average of a target variable over a specified window. This function is widely used in financial analysis to smooth short-term fluctuations and highlight longer-term trends diff --git a/openbb_platform/extensions/quantitative/openbb_quantitative/statistics.py b/openbb_platform/extensions/quantitative/openbb_quantitative/statistics.py index db137ac77cf..e3339107364 100644 --- a/openbb_platform/extensions/quantitative/openbb_quantitative/statistics.py +++ b/openbb_platform/extensions/quantitative/openbb_quantitative/statistics.py @@ -1,4 +1,4 @@ -"""Statistics Functions""" +"""Statistics Functions.""" from typing import Union @@ -16,26 +16,32 @@ from scipy import stats def kurtosis_(data: Union[DataFrame, Series, ndarray]) -> float: - """Kurtosis is a measure of the "tailedness" of the probability distribution of a real-valued random variable.""" + """Get Kurtosis. + + It is a measure of the "tailedness" of the probability distribution of a real-valued random variable. + """ return stats.kurtosis(data) def skew_(data: Union[DataFrame, Series, ndarray]) -> float: - """Skewness is a measure of the asymmetry of the probability distribution of a - real-valued random variable about its mean.""" + """Get Skewness. + + It is a measure of the asymmetry of the probability distribution of a + real-valued random variable about its mean. + """ return stats.skew(data) def mean_(data: Union[DataFrame, Series, ndarray]) -> float: - """Mean is the average of the numbers.""" + """Get Mean which is the average of the numbers.""" return mean_np(data) def std_dev_(data: Union[DataFrame, Series, ndarray]) -> float: - """Standard deviation is a measure of the amount of variation or dispersion of a set of values.""" + """Get Standard deviation that is a measure of the amount of variation or dispersion of a set of values.""" return std(data) def var_(data: Union[DataFrame, Series, ndarray]) -> float: - """Variance is a measure of the amount of variation or dispersion of a set of values.""" + """Get Variance that is a measure of the amount of variation or dispersion of a set of values.""" return var_np(data) diff --git a/openbb_platform/extensions/quantitative/openbb_quantitative/stats/stats_router.py b/openbb_platform/extensions/quantitative/openbb_quantitative/stats/stats_router.py index 68be4b675cf..2b32123aaac 100644 --- a/openbb_platform/extensions/quantitative/openbb_quantitative/stats/stats_router.py +++ b/openbb_platform/extensions/quantitative/openbb_quantitative/stats/stats_router.py @@ -101,8 +101,7 @@ def skew( ], ) def variance(data: List[Data], target: str) -> OBBject[List[Data]]: - """ - Calculate the variance of a target column. + """Calculate the variance of a target column. Variance measures the dispersion of a set of data points around their mean. It is a key metric for assessing the volatility and stability of financial returns or other time series data. @@ -150,8 +149,7 @@ def variance(data: List[Data], target: str) -> OBBject[List[Data]]: ], ) def stdev(data: List[Data], target: str) -> OBBject[List[Data]]: - """ - Calculate the rolling standard deviation of a target column. + """Calculate the rolling standard deviation of a target column. Standard deviation is a measure of the amount of variation or dispersion of a set of values. It is widely used to assess the risk and volatility of financial returns or other time series data @@ -200,8 +198,7 @@ def stdev(data: List[Data], target: str) -> OBBject[List[Data]]: ], ) def kurtosis(data: List[Data], target: str) -> OBBject[List[Data]]: - """ - Calculate the rolling kurtosis of a target column. + """Calculate the rolling kurtosis of a target column. Kurtosis measures the "tailedness" of the probability distribution of a real-valued random variable. High kurtosis indicates a distribution with heavy tails (outliers), suggesting a higher risk of extreme outcomes. @@ -255,8 +252,7 @@ def quantile( target: str, quantile_pct: NonNegativeFloat = 0.5, ) -> OBBject[List[Data]]: - """ - Calculate the quantile of a target column at a specified quantile percentage. + """Calculate the quantile of a target column at a specified quantile percentage. Quantiles are points dividing the range of a probability distribution into intervals with equal probabilities, or dividing the sample in the same way. @@ -312,8 +308,7 @@ def mean( data: List[Data], target: str, ) -> OBBject[List[Data]]: - """ - Calculate the mean (average) of a target column. + """Calculate the average of a target column. The rolling mean is a simple moving average that calculates the average of a target variable. This function is widely used in financial analysis to smooth short-term fluctuations and highlight longer-term trends diff --git a/openbb_platform/extensions/quantitative/poetry.lock b/openbb_platform/extensions/quantitative/poetry.lock index 9a36a8bfa16..550b59aa7cf 100644 --- a/openbb_platform/extensions/quantitative/poetry.lock +++ b/openbb_platform/extensions/quantitative/poetry.lock @@ -682,13 +682,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1538,4 +1538,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.12" -content-hash = "104e6ac1cefb99e4d26f8bab3324422380c3e2bf884179d1bea5b0eede7ba294" +content-hash = "0a8ed0269b904ec3ca1254469e4d0bbfccc50252d668bf752acb02191b0918ad" diff --git a/openbb_platform/extensions/quantitative/pyproject.toml b/openbb_platform/extensions/quantitative/pyproject.toml index 8b0a5b376a0..37d4f4b2d3b 100644 --- a/openbb_platform/extensions/quantitative/pyproject.toml +++ b/openbb_platform/extensions/quantitative/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-quantitative" -version = "1.1.4" +version = "1.1.5" description = "Quantitative Analysis extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -11,7 +11,7 @@ python = ">=3.8,<3.12" # scipy forces python <4.0 explicitly scipy = "^1.10.1" statsmodels = "^0.14.0" pandas-ta = "^0.3.14b" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/extensions/quantitative/tests/test_quantitative_helpers.py b/openbb_platform/extensions/quantitative/tests/test_quantitative_helpers.py index 82f6ae52b15..8a175957a0a 100644 --- a/openbb_platform/extensions/quantitative/tests/test_quantitative_helpers.py +++ b/openbb_platform/extensions/quantitative/tests/test_quantitative_helpers.py @@ -7,6 +7,7 @@ from extensions.quantitative.openbb_quantitative.helpers import ( def test_validate_window(): + """Test the validate_window function.""" input_data = pd.Series(range(1, 100)) validate_window( input_data=input_data, diff --git a/openbb_platform/extensions/quantitative/tests/test_statistics.py b/openbb_platform/extensions/quantitative/tests/test_statistics.py index 11c1ce2ec43..d1a34e30c8c 100644 --- a/openbb_platform/extensions/quantitative/tests/test_statistics.py +++ b/openbb_platform/extensions/quantitative/tests/test_statistics.py @@ -1,3 +1,5 @@ +"""Tests for the statistics module.""" + import pandas as pd import pytest from openbb_quantitative.statistics import kurtosis_, mean_, skew_, std_dev_, var_ @@ -6,20 +8,25 @@ test_data = pd.Series([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) def test_kurtosis(): + """Test the kurtosis function.""" assert kurtosis_(test_data) == pytest.approx(-1.224, abs=1e-3) def test_skew(): + """Test the skewness function.""" assert skew_(test_data) == pytest.approx(0.0, abs=1e-3) def test_std_dev(): + """Test the standard deviation function.""" assert std_dev_(test_data) == pytest.approx(2.872, abs=1e-3) def test_mean(): + """Test the mean function.""" assert mean_(test_data) == pytest.approx(5.5, abs=1e-3) def test_var(): + """Test the variance function.""" assert var_(test_data) == pytest.approx(8.25, abs=1e-3) diff --git a/openbb_platform/extensions/regulators/integration/test_regulators_api.py b/openbb_platform/extensions/regulators/integration/test_regulators_api.py index 997ce2a2a70..0ea5fa5a8f2 100644 --- a/openbb_platform/extensions/regulators/integration/test_regulators_api.py +++ b/openbb_platform/extensions/regulators/integration/test_regulators_api.py @@ -1,3 +1,5 @@ +"""Integration tests for the regulators API.""" + import base64 import pytest @@ -9,6 +11,7 @@ from openbb_core.provider.utils.helpers import get_querystring @pytest.fixture(scope="session") def headers(): + """Get the headers for the API request.""" userpass = f"{Env().API_USERNAME}:{Env().API_PASSWORD}" userpass_bytes = userpass.encode("ascii") base64_bytes = base64.b64encode(userpass_bytes) @@ -28,6 +31,7 @@ def headers(): ) @pytest.mark.integration def test_regulators_sec_cik_map(params, headers): + """Test the SEC CIK map endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -45,6 +49,7 @@ def test_regulators_sec_cik_map(params, headers): ) @pytest.mark.integration def test_regulators_sec_institutions_search(params, headers): + """Test the SEC institutions search endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -70,6 +75,7 @@ def test_regulators_sec_institutions_search(params, headers): ) @pytest.mark.integration def test_regulators_sec_schema_files(params, headers): + """Test the SEC schema files endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -88,6 +94,7 @@ def test_regulators_sec_schema_files(params, headers): ) @pytest.mark.integration def test_regulators_sec_symbol_map(params, headers): + """Test the SEC symbol map endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -103,6 +110,7 @@ def test_regulators_sec_symbol_map(params, headers): ) @pytest.mark.integration def test_regulators_sec_rss_litigation(params, headers): + """Test the SEC RSS litigation endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -118,6 +126,7 @@ def test_regulators_sec_rss_litigation(params, headers): ) @pytest.mark.integration def test_regulators_sec_sic_search(params, headers): + """Test the SEC SIC search endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -135,6 +144,7 @@ def test_regulators_sec_sic_search(params, headers): ) @pytest.mark.integration def test_regulators_cftc_cot_search(params, headers): + """Test the CFTC COT search endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -165,6 +175,7 @@ def test_regulators_cftc_cot_search(params, headers): ) @pytest.mark.integration def test_regulators_cftc_cot(params, headers): + """Test the CFTC COT endpoint.""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) diff --git a/openbb_platform/extensions/regulators/integration/test_regulators_python.py b/openbb_platform/extensions/regulators/integration/test_regulators_python.py index 6e5ce886686..77c2e811f53 100644 --- a/openbb_platform/extensions/regulators/integration/test_regulators_python.py +++ b/openbb_platform/extensions/regulators/integration/test_regulators_python.py @@ -28,6 +28,7 @@ def obb(pytestconfig): ) @pytest.mark.integration def test_regulators_sec_cik_map(params, obb): + """Test the SEC CIK map endpoint.""" result = obb.regulators.sec.cik_map(**params) assert result assert isinstance(result, OBBject) @@ -43,6 +44,7 @@ def test_regulators_sec_cik_map(params, obb): ) @pytest.mark.integration def test_regulators_sec_institutions_search(params, obb): + """Test the SEC institutions search endpoint.""" result = obb.regulators.sec.institutions_search(**params) assert result assert isinstance(result, OBBject) @@ -72,6 +74,7 @@ def test_regulators_sec_institutions_search(params, obb): ) @pytest.mark.integration def test_regulators_sec_schema_files(params, obb): + """Test the SEC schema files endpoint.""" result = obb.regulators.sec.schema_files(**params) assert result assert isinstance(result, OBBject) @@ -87,6 +90,7 @@ def test_regulators_sec_schema_files(params, obb): ) @pytest.mark.integration def test_regulators_sec_symbol_map(params, obb): + """Test the SEC symbol map endpoint.""" result = obb.regulators.sec.symbol_map(**params) assert result assert isinstance(result, OBBject) @@ -100,6 +104,7 @@ def test_regulators_sec_symbol_map(params, obb): ) @pytest.mark.integration def test_regulators_sec_rss_litigation(params, obb): + """Test the SEC RSS litigation endpoint.""" result = obb.regulators.sec.rss_litigation(**params) assert result assert isinstance(result, OBBject) @@ -112,6 +117,7 @@ def test_regulators_sec_rss_litigation(params, obb): ) @pytest.mark.integration def test_regulators_sec_sic_search(params, obb): + """Test the SEC SIC search endpoint.""" result = obb.regulators.sec.sic_search(**params) assert result assert isinstance(result, OBBject) @@ -126,6 +132,7 @@ def test_regulators_sec_sic_search(params, obb): ) @pytest.mark.integration def test_regulators_cftc_cot_search(params, obb): + """Test the CFTC COT search endpoint.""" result = obb.regulators.cftc.cot_search(**params) assert result assert isinstance(result, OBBject) @@ -153,6 +160,7 @@ def test_regulators_cftc_cot_search(params, obb): ) @pytest.mark.integration def test_regulators_cftc_cot(params, obb): + """Test the CFTC COT endpoint.""" result = obb.regulators.cftc.cot(**params) assert result assert isinstance(result, OBBject) diff --git a/openbb_platform/extensions/regulators/openbb_regulators/__init__.py b/openbb_platform/extensions/regulators/openbb_regulators/__init__.py index e69de29bb2d..4167ad3a36f 100644 --- a/openbb_platform/extensions/regulators/openbb_regulators/__init__.py +++ b/openbb_platform/extensions/regulators/openbb_regulators/__init__.py @@ -0,0 +1 @@ +"""OpenBB Regulators Extension.""" diff --git a/openbb_platform/extensions/regulators/openbb_regulators/cftc/cftc_router.py b/openbb_platform/extensions/regulators/openbb_regulators/cftc/cftc_router.py index eb5e1e642aa..b2a62a7ec42 100644 --- a/openbb_platform/extensions/regulators/openbb_regulators/cftc/cftc_router.py +++ b/openbb_platform/extensions/regulators/openbb_regulators/cftc/cftc_router.py @@ -59,5 +59,5 @@ async def cot( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject: - """Commitment of Traders Reports.""" + """Get Commitment of Traders Reports.""" return await OBBject.from_query(Query(**locals())) diff --git a/openbb_platform/extensions/regulators/openbb_regulators/regulators_router.py b/openbb_platform/extensions/regulators/openbb_regulators/regulators_router.py index 0a5a33f07dc..c9ad4217950 100644 --- a/openbb_platform/extensions/regulators/openbb_regulators/regulators_router.py +++ b/openbb_platform/extensions/regulators/openbb_regulators/regulators_router.py @@ -11,6 +11,6 @@ from .cftc.cftc_router import ( ) from .sec.sec_router import router as sec_router -router = Router(prefix="") +router = Router(prefix="", description="Financial market regulators data.") router.include_router(sec_router) router.include_router(cftc_router) diff --git a/openbb_platform/extensions/regulators/openbb_regulators/sec/__init__.py b/openbb_platform/extensions/regulators/openbb_regulators/sec/__init__.py index e69de29bb2d..4f3fc3a22e7 100644 --- a/openbb_platform/extensions/regulators/openbb_regulators/sec/__init__.py +++ b/openbb_platform/extensions/regulators/openbb_regulators/sec/__init__.py @@ -0,0 +1 @@ +"""Regulators for the SEC init.""" diff --git a/openbb_platform/extensions/regulators/openbb_regulators/sec/sec_router.py b/openbb_platform/extensions/regulators/openbb_regulators/sec/sec_router.py index df212ad35c7..6129d346c87 100644 --- a/openbb_platform/extensions/regulators/openbb_regulators/sec/sec_router.py +++ b/openbb_platform/extensions/regulators/openbb_regulators/sec/sec_router.py @@ -80,7 +80,7 @@ async def schema_files( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject: - """A tool for navigating the directory of SEC XML schema files by year.""" + """Use tool for navigating the directory of SEC XML schema files by year.""" return await OBBject.from_query(Query(**locals())) @@ -108,7 +108,7 @@ async def rss_litigation( standard_params: StandardParams, extra_params: ExtraParams, ) -> OBBject: - """The RSS feed provides links to litigation releases concerning civil lawsuits brought by the Commission in federal court.""" # noqa: E501 pylint: disable=C0301 + """Get the RSS feed that provides links to litigation releases concerning civil lawsuits brought by the Commission in federal court.""" # noqa: E501 pylint: disable=C0301 return await OBBject.from_query(Query(**locals())) diff --git a/openbb_platform/extensions/regulators/poetry.lock b/openbb_platform/extensions/regulators/poetry.lock index d556c640c19..9119c69fb52 100644 --- a/openbb_platform/extensions/regulators/poetry.lock +++ b/openbb_platform/extensions/regulators/poetry.lock @@ -678,13 +678,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1397,4 +1397,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.12" -content-hash = "75f551243cc84ea3dcba416d86f4ef5669b5b8b5fcf4781a0d8e3e69360b28e4" +content-hash = "df0539c34df30b9f361fb9099e221e5a86ba5c1ea1451a0748d7b87dba2203b0" diff --git a/openbb_platform/extensions/regulators/pyproject.toml b/openbb_platform/extensions/regulators/pyproject.toml index f80ceb1db42..81479ba934b 100644 --- a/openbb_platform/extensions/regulators/pyproject.toml +++ b/openbb_platform/extensions/regulators/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-regulators" -version = "1.1.4" +version = "1.1.5" description = "Markets and Agency Regulators extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_regulators" }] [tool.poetry.dependencies] python = ">=3.8,<3.12" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/extensions/technical/integration/test_technical_api.py b/openbb_platform/extensions/technical/integration/test_technical_api.py index 2fec3060fa0..481fce9f356 100644 --- a/openbb_platform/extensions/technical/integration/test_technical_api.py +++ b/openbb_platform/extensions/technical/integration/test_technical_api.py @@ -1,3 +1,5 @@ +"""Test technical api.""" + import base64 import json import random @@ -957,3 +959,42 @@ def test_technical_ema(params, data_type): result = requests.post(url, headers=get_headers(), timeout=10, data=body) assert isinstance(result, requests.Response) assert result.status_code == 200 + + +@parametrize( + "params", + [ + ( + { + "data": "", + "study": "price", + "benchmark": "SPY", + "long_period": 252, + "short_period": 21, + "window": 21, + "trading_periods": 252, + "chart_params": {"show_tails": False}, + } + ), + ], +) +@pytest.mark.integration +def test_technical_relative_rotation(params): + params = {p: v for p, v in params.items() if v} + data_params = dict( + symbol="AAPL,MSFT,GOOGL,AMZN,SPY", + provider="yfinance", + start_date="2022-01-01", + end_date="2024-01-01", + ) + data_query_str = get_querystring(data_params, []) + data_url = f"http://0.0.0.0:8000/api/v1/equity/price/historical?{data_query_str}" + data_result = requests.get(data_url, headers=get_headers(), timeout=10).json()[ + "results" + ] + body = json.dumps({"data": data_result}) + query_str = get_querystring(params, ["data"]) + url = f"http://0.0.0.0:8000/api/v1/technical/relative_rotation?{query_str}" + result = requests.post(url, headers=get_headers(), timeout=10, data=body) + assert isinstance(result, requests.Response) + assert result.status_code == 200 diff --git a/openbb_platform/extensions/technical/integration/test_technical_python.py b/openbb_platform/extensions/technical/integration/test_technical_python.py index ab51354904e..d866c3623c8 100644 --- a/openbb_platform/extensions/technical/integration/test_technical_python.py +++ b/openbb_platform/extensions/technical/integration/test_technical_python.py @@ -24,6 +24,7 @@ data: dict = {} def get_stocks_data(): + """Get stocks data.""" import openbb # pylint:disable=import-outside-toplevel if "stocks_data" in data: @@ -39,6 +40,7 @@ def get_stocks_data(): def get_crypto_data(): + """Get crypto data.""" import openbb # pylint:disable=import-outside-toplevel if "crypto_data" in data: @@ -55,6 +57,7 @@ def get_crypto_data(): def get_data(menu: Literal["stocks", "crypto"]): + """Get data.""" funcs = {"stocks": get_stocks_data, "crypto": get_crypto_data} return funcs[menu]() @@ -88,6 +91,7 @@ def get_data(menu: Literal["stocks", "crypto"]): ) @pytest.mark.integration def test_technical_atr(params, data_type, obb): + """Test atr.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -126,6 +130,7 @@ def test_technical_atr(params, data_type, obb): ) @pytest.mark.integration def test_technical_fib(params, data_type, obb): + """Test fib.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -144,6 +149,7 @@ def test_technical_fib(params, data_type, obb): ) @pytest.mark.integration def test_technical_obv(params, data_type, obb): + """Test obv.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -162,6 +168,7 @@ def test_technical_obv(params, data_type, obb): ) @pytest.mark.integration def test_technical_fisher(params, data_type, obb): + """Test fisher.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -198,6 +205,7 @@ def test_technical_fisher(params, data_type, obb): ) @pytest.mark.integration def test_technical_adosc(params, data_type, obb): + """Test adosc.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -238,6 +246,7 @@ def test_technical_adosc(params, data_type, obb): ) @pytest.mark.integration def test_technical_bbands(params, data_type, obb): + """Test bbands.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -274,6 +283,7 @@ def test_technical_bbands(params, data_type, obb): ) @pytest.mark.integration def test_technical_zlma(params, data_type, obb): + """Test zlma.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -300,6 +310,7 @@ def test_technical_zlma(params, data_type, obb): ) @pytest.mark.integration def test_technical_aroon(params, data_type, obb): + """Test aroon.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -336,6 +347,7 @@ def test_technical_aroon(params, data_type, obb): ) @pytest.mark.integration def test_technical_sma(params, data_type, obb): + """Test sma.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -374,6 +386,7 @@ def test_technical_sma(params, data_type, obb): ) @pytest.mark.integration def test_technical_demark(params, data_type, obb): + """Test demark.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -392,6 +405,7 @@ def test_technical_demark(params, data_type, obb): ) @pytest.mark.integration def test_technical_vwap(params, data_type, obb): + """Test vwap.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -430,6 +444,7 @@ def test_technical_vwap(params, data_type, obb): ) @pytest.mark.integration def test_technical_macd(params, data_type, obb): + """Test macd.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -466,6 +481,7 @@ def test_technical_macd(params, data_type, obb): ) @pytest.mark.integration def test_technical_hma(params, data_type, obb): + """Test hma.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -502,6 +518,7 @@ def test_technical_hma(params, data_type, obb): ) @pytest.mark.integration def test_technical_donchian(params, data_type, obb): + """Test donchian.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -542,6 +559,7 @@ def test_technical_donchian(params, data_type, obb): ) @pytest.mark.integration def test_technical_ichimoku(params, data_type, obb): + """Test ichimoku.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -568,6 +586,7 @@ def test_technical_ichimoku(params, data_type, obb): ) @pytest.mark.integration def test_technical_clenow(params, data_type, obb): + """Test clenow.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -604,6 +623,7 @@ def test_technical_clenow(params, data_type, obb): ) @pytest.mark.integration def test_technical_adx(params, data_type, obb): + """Test adx.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -622,6 +642,7 @@ def test_technical_adx(params, data_type, obb): ) @pytest.mark.integration def test_technical_ad(params, data_type, obb): + """Test ad.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -658,6 +679,7 @@ def test_technical_ad(params, data_type, obb): ) @pytest.mark.integration def test_technical_wma(params, data_type, obb): + """Test wma.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -684,6 +706,7 @@ def test_technical_wma(params, data_type, obb): ) @pytest.mark.integration def test_technical_cci(params, data_type, obb): + """Test cci.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -722,6 +745,7 @@ def test_technical_cci(params, data_type, obb): ) @pytest.mark.integration def test_technical_rsi(params, data_type, obb): + """Test rsi.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -758,6 +782,7 @@ def test_technical_rsi(params, data_type, obb): ) @pytest.mark.integration def test_technical_stoch(params, data_type, obb): + """Test stoch.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -796,6 +821,7 @@ def test_technical_stoch(params, data_type, obb): ) @pytest.mark.integration def test_technical_kc(params, data_type, obb): + """Test kc.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -814,6 +840,7 @@ def test_technical_kc(params, data_type, obb): ) @pytest.mark.integration def test_technical_cg(params, data_type, obb): + """Test cg.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -854,6 +881,7 @@ def test_technical_cg(params, data_type, obb): ) @pytest.mark.integration def test_technical_cones(params, data_type, obb): + """Test cones.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -890,6 +918,7 @@ def test_technical_cones(params, data_type, obb): ) @pytest.mark.integration def test_technical_ema(params, data_type, obb): + """Test ema.""" params = {p: v for p, v in params.items() if v} params["data"] = get_data(data_type) @@ -897,3 +926,45 @@ def test_technical_ema(params, data_type, obb): assert result assert isinstance(result, OBBject) assert len(result.results) > 0 + + +@parametrize( + "params", + [ + ( + { + "data": "", + "study": "price", + "benchmark": "SPY", + "long_period": 252, + "short_period": 21, + "window": 21, + "trading_periods": 252, + "chart_params": {"show_tails": False}, + } + ), + ], +) +@pytest.mark.integration +def test_technical_relative_rotation(params, obb): + params["data"] = obb.equity.price.historical( + "AAPL,MSFT,GOOGL,AMZN,SPY", + provider="yfinance", + start_date="2022-01-01", + end_date="2024-01-01", + ).results + result = obb.technical.relative_rotation( + data=params["data"], + benchmark=params["benchmark"], + study=params["study"], + long_period=params["long_period"], + short_period=params["short_period"], + window=params["window"], + trading_periods=params["trading_periods"], + ) + assert result + assert isinstance(result, OBBject) + assert hasattr(result.results, "rs_ratios") + assert len(result.results.rs_ratios) > 0 # type: ignore + assert hasattr(result.results, "rs_momentum") + assert len(result.results.rs_momentum) > 0 # type: ignore diff --git a/openbb_platform/extensions/technical/openbb_technical/helpers.py b/openbb_platform/extensions/technical/openbb_technical/helpers.py index 948a32fede3..7c7fec91dc7 100644 --- a/openbb_platform/extensions/technical/openbb_technical/helpers.py +++ b/openbb_platform/extensions/technical/openbb_technical/helpers.py @@ -1,13 +1,11 @@ """Technical Analysis Helpers.""" -import warnings from typing import Any, List, Literal, Optional, Tuple, Union +from warnings import warn import numpy as np import pandas as pd -_warn = warnings.warn - def validate_data(data: list, length: Union[int, List[int]]) -> None: """Validate data.""" @@ -51,11 +49,11 @@ def parkinson( Dataframe with results. """ if window < 1: - _warn("Error: Window must be at least 1, defaulting to 30.") + warn("Error: Window must be at least 1, defaulting to 30.") window = 30 if trading_periods and is_crypto: - _warn("is_crypto is overridden by trading_periods.") + warn("is_crypto is overridden by trading_periods.") if not trading_periods: trading_periods = 365 if is_crypto else 252 @@ -82,7 +80,7 @@ def standard_deviation( is_crypto: bool = False, clean: bool = True, ) -> pd.DataFrame: - """Standard deviation. + """Calculate the Standard deviation. Measures how widely returns are dispersed from the average return. It is the most common (and biased) estimator of volatility. @@ -106,11 +104,11 @@ def standard_deviation( Dataframe with results. """ if window < 2: - _warn("Error: Window must be at least 2, defaulting to 30.") + warn("Error: Window must be at least 2, defaulting to 30.") window = 30 if trading_periods and is_crypto: - _warn("is_crypto is overridden by trading_periods.") + warn("is_crypto is overridden by trading_periods.") if not trading_periods: trading_periods = 365 if is_crypto else 252 @@ -159,11 +157,11 @@ def garman_klass( Dataframe with results. """ if window < 1: - _warn("Error: Window must be at least 1, defaulting to 30.") + warn("Error: Window must be at least 1, defaulting to 30.") window = 30 if trading_periods and is_crypto: - _warn("is_crypto is overridden by trading_periods.") + warn("is_crypto is overridden by trading_periods.") if not trading_periods: trading_periods = 365 if is_crypto else 252 @@ -220,11 +218,11 @@ def hodges_tompkins( >>> df = obb.technical.hodges_tompkins(data, is_crypto = True) """ if window < 2: - _warn("Error: Window must be at least 2, defaulting to 30.") + warn("Error: Window must be at least 2, defaulting to 30.") window = 30 if trading_periods and is_crypto: - _warn("is_crypto is overridden by trading_periods.") + warn("is_crypto is overridden by trading_periods.") if not trading_periods: trading_periods = 365 if is_crypto else 252 @@ -280,11 +278,11 @@ def rogers_satchell( Pandas Series with results. """ if window < 1: - _warn("Error: Window must be at least 1, defaulting to 30.") + warn("Error: Window must be at least 1, defaulting to 30.") window = 30 if trading_periods and is_crypto: - _warn("is_crypto is overridden by trading_periods.") + warn("is_crypto is overridden by trading_periods.") if not trading_periods: trading_periods = 365 if is_crypto else 252 @@ -337,11 +335,11 @@ def yang_zhang( Dataframe with results. """ if window < 2: - _warn("Error: Window must be at least 2, defaulting to 30.") + warn("Error: Window must be at least 2, defaulting to 30.") window = 30 if trading_periods and is_crypto: - _warn("is_crypto is overridden by trading_periods.") + warn("is_crypto is overridden by trading_periods.") if not trading_periods: trading_periods = 365 if is_crypto else 252 @@ -547,12 +545,12 @@ def calculate_fib_levels( if start_date and end_date: if start_date not in data.index: date0 = data.index[data.index.get_indexer([end_date], method="nearest")[0]] - _warn(f"Start date not in data. Using nearest: {date0}") + warn(f"Start date not in data. Using nearest: {date0}") else: date0 = start_date if end_date not in data.index: date1 = data.index[data.index.get_indexer([end_date], method="nearest")[0]] - _warn(f"End date not in data. Using nearest: {date1}") + warn(f"End date not in data. Using nearest: {date1}") else: date1 = end_date diff --git a/openbb_platform/extensions/technical/openbb_technical/relative_rotation.py b/openbb_platform/extensions/technical/openbb_technical/relative_rotation.py new file mode 100644 index 00000000000..5bd3f7a295f --- /dev/null +++ b/openbb_platform/extensions/technical/openbb_technical/relative_rotation.py @@ -0,0 +1,554 @@ +"""Relative Rotation Model.""" + +# pylint: disable=too-many-arguments, too-many-instance-attributes, protected-access +# pylint: disable=too-many-locals, too-few-public-methods, unused-argument + +import contextlib +from typing import Any, Dict, List, Literal, Optional, Tuple, Union + +import numpy as np +from openbb_core.app.model.obbject import OBBject +from openbb_core.app.utils import basemodel_to_df, convert_to_basemodel, df_to_basemodel +from openbb_core.provider.abstract.data import Data +from openbb_core.provider.abstract.fetcher import Fetcher +from openbb_core.provider.abstract.query_params import QueryParams +from pandas import DataFrame, Series, to_datetime +from pydantic import Field, field_validator + + +def absolute_maximum_scale(data: Series) -> Series: + """Absolute Maximum Scale Normaliztion Method.""" + return data / data.abs().max() + + +def min_max_scaling(data: Series) -> Series: + """Min/Max ScalingNormalization Method.""" + return (data - data.min()) / (data.max() - data.min()) + + +def z_score_standardization(data: Series) -> Series: + """Z-Score Standardization Method.""" + return (data - data.mean()) / data.std() + + +def normalize(data: DataFrame, method: Literal["z", "m", "a"] = "z") -> DataFrame: + """ + Normalize a Pandas DataFrame based on method. + + Parameters + ---------- + data: DataFrame + Pandas DataFrame with any number of columns to be normalized. + method: Literal["z", "m", "a"] + Normalization method. + z: Z-Score Standardization + m: Min/Max Scaling + a: Absolute Maximum Scale + + Returns + ------- + DataFrame + Normalized DataFrame. + """ + methods = { + "z": z_score_standardization, + "m": min_max_scaling, + "a": absolute_maximum_scale, + } + + df = data.copy() + + for col in df.columns: + df.loc[:, col] = methods[f"{method}"](df.loc[:, col]) + + return df + + +def standard_deviation( + data: DataFrame, + window: int = 21, + trading_periods: int = 252, +) -> DataFrame: + """ + Measures how widely returns are dispersed from the average return. + + It is the most common (and biased) estimator of volatility. + + Parameters + ---------- + data : pd.DataFrame + Dataframe of OHLC prices. + window : int [default: 21] + Length of window to calculate over. + trading_periods : Optional[int] [default: 252] + Number of trading periods in a year. + + Returns + ------- + pd.DataFrame : results + Dataframe with results. + """ + data = data.copy() + results = DataFrame() + if window < 2: + window = 21 + + for col in data.columns.tolist(): + log_return = (data[col] / data[col].shift(1)).apply(np.log) + + result = log_return.rolling(window=window, center=False).std() * np.sqrt( + trading_periods + ) + results[col] = result + + return results.dropna() + + +def calculate_momentum( + data: Series, long_period: int = 252, short_period: int = 21 +) -> Series: + """ + Momentum is calculated as the log trailing 12-month return minus trailing one-month return. + + Higher values indicate larger, positive momentum exposure. + + Momentum = ln(1 + r12) - ln(1 + r1) + + Parameters + ---------- + data: Series + Time series data to calculate the momentum for. + long_period: Optional[int] + Long period to base the calculation on. Default is one standard trading year. + short_period: Optional[int] + Short period to subtract from the long period. Default is one trading month. + + Returns + ------- + Series + Pandas Series with the calculated momentum. + """ + df = data.copy() + epsilon = 1e-10 + momentum_long = np.log(1 + df.pct_change(long_period) + epsilon) + momentum_short = np.log(1 + df.pct_change(short_period) + epsilon) + data = momentum_long - momentum_short # type: ignore + + return data + + +def get_momentum( + data: DataFrame, long_period: int = 252, short_period: int = 21 +) -> DataFrame: + """ + Calculate the Relative-Strength Momentum Indicator. + + Takes the Relative Strength Ratio as the input. + + Parameters + ---------- + data: DataFrame + Indexed time series data formatted with each column representing a ticker. + long_period: Optional[int] + Long period to base the calculation on. Default is one standard trading year. + short_period: Optional[int] + Short period to subtract from the long period. Default is one trading month. + + Returns + ------- + DataFrame + Pandas DataFrame with the calculated historical momentum factor exposure score. + """ + df = data.copy() + rs_momentum = DataFrame() + for ticker in df.columns.to_list(): + rs_momentum.loc[:, ticker] = calculate_momentum( + df.loc[:, ticker], long_period, short_period + ) # type: ignore + + return rs_momentum + + +def calculate_relative_strength_ratio( + symbols_data: DataFrame, + benchmark_data: DataFrame, +) -> DataFrame: + """Calculate the Relative Strength Ratio for each ticker (column) in a DataFrame against the benchmark. + + Symbols data and benchmark data should have the same index, + and each column should represent a ticker. + + Parameters + ---------- + symbols_data: DataFrame + Pandas DataFrame with the symbols data to compare against the benchmark. + benchmark_data: DataFrame + Pandas DataFrame with the benchmark data. + + Returns + ------- + DataFrame + Pandas DataFrame with the calculated relative strength + ratio for each ticker joined with the benchmark values. + """ + return ( + symbols_data.div(benchmark_data.iloc[:, 0], axis=0) + .multiply(100) + .join(benchmark_data.iloc[:, 0]) + .dropna() + ) + + +def process_data( + symbols_data: DataFrame, + benchmark_data: DataFrame, + long_period: int = 252, + short_period: int = 21, + normalize_method: Literal["z", "m", "a"] = "z", +) -> Tuple[DataFrame, DataFrame]: + """Process the raw data into normalized indicator values. + + Parameters + ---------- + symbols_data: DataFrame + Indexed time series data formatted with each column representing a ticker. + benchmark_data: DataFrame + Indexed time series data of the benchmark symbol. + long_period: Optional[int] + Long period to base the calculation on. Default is one standard trading year. + short_period: Optional[int] + Short period to subtract from the long period. Default is one trading month. + normalize_method: Literal["z", "m", "a"] + + Returns + ------- + Tuple[DataFrame, DataFrame] + Tuple of Pandas DataFrames with the normalized ratio and momentum indicator values. + """ + ratio_data = calculate_relative_strength_ratio(symbols_data, benchmark_data) + momentum_data = get_momentum(ratio_data, long_period, short_period) + normalized_ratio = normalize(ratio_data, normalize_method) + normalized_momentum = normalize(momentum_data, normalize_method) + + return normalized_ratio, normalized_momentum + + +class RelativeRotation: + """Relative Rotation Class.""" + + def __init__( + self, + data: Union[List[Data], DataFrame], + benchmark: str, + study: Optional[Literal["price", "volume", "volatility"]] = "price", + long_period: Optional[int] = 252, + short_period: Optional[int] = 21, + window: Optional[int] = 21, + trading_periods: Optional[int] = 252, + ): + """Initialize the class.""" + benchmark = benchmark.upper() + df = DataFrame() + + target_col = "volume" if study == "volume" else "close" + + if isinstance(data, OBBject): + data = data.results # type: ignore + + if isinstance(data, List) and ( + all(isinstance(d, Data) for d in data) + or all(isinstance(d, dict) for d in data) + ): + with contextlib.suppress(Exception): + df = basemodel_to_df(convert_to_basemodel(data), index="date") + + if isinstance(data, DataFrame) and not df.empty: + df = data.copy() + if "date" in df.columns: + df.set_index("date", inplace=True) + + if df.empty: + raise ValueError( + "Data must be a list of Data objects or a DataFrame with a 'date' column." + ) + + if "symbol" in df.columns: + df = df.pivot(columns="symbol", values=target_col) + + if benchmark not in df.columns: + raise RuntimeError("The benchmark symbol was not found in the data.") + + benchmark_data = df.pop(benchmark).to_frame() + symbols_data = df + + if len(symbols_data) <= 252 and study in ["price", "volume"]: # type: ignore + raise ValueError( + "Supplied data must be daily intervals and have more than one year of back data to calculate" + " the most recent day in the time series." + ) + + if study == "volatility" and len(symbols_data) <= 504: # type: ignore + raise ValueError( + "Supplied data must be daily intervals and have more than two years of back data to calculate" + " the most recent day in the time series as a volatility study." + ) + self.symbols = df.columns.to_list() + self.benchmark = benchmark + self.study = study + self.long_period = long_period + self.short_period = short_period + self.window = window + self.trading_periods = trading_periods + self.symbols_data = symbols_data # type: ignore + self.benchmark_data = benchmark_data # type: ignore + self._process_data() # type: ignore + self.symbols_data = df_to_basemodel(self.symbols_data.reset_index()) # type: ignore + self.benchmark_data = df_to_basemodel(self.benchmark_data.reset_index()) # type: ignore + + def _process_data(self): + """Process the data.""" + if self.study == "volatility": + self.symbols_data = standard_deviation( + self.symbols_data, # type: ignore + window=self.window, # type: ignore + trading_periods=self.trading_periods, # type: ignore + ) + self.benchmark_data = standard_deviation( + self.benchmark_data, # type: ignore + window=self.window, # type: ignore + trading_periods=self.trading_periods, # type: ignore + ) + ratios, momentum = process_data( + self.symbols_data, # type: ignore + self.benchmark_data, # type: ignore + long_period=self.long_period, # type: ignore + short_period=self.short_period, # type: ignore + ) + # Re-index rs_ratios using the new index + index_after_dropping_nans = momentum.dropna().index + ratios = ratios.reindex(index_after_dropping_nans) + self.rs_ratios = df_to_basemodel(ratios.reset_index()) + self.rs_momentum = df_to_basemodel(momentum.dropna().reset_index()) + self.end_date = to_datetime(ratios.index[-1]).strftime("%Y-%m-%d") + self.start_date = to_datetime(ratios.index[0]).strftime("%Y-%m-%d") + return self + + +def _get_type_name(t): + """Get the type name of a type hint.""" + if hasattr(t, "__origin__"): + if hasattr(t.__origin__, "__name__"): + return f"{t.__origin__.__name__}[{', '.join([_get_type_name(arg) for arg in t.__args__])}]" + if hasattr(t.__origin__, "_name"): + return f"{t.__origin__._name}[{', '.join([_get_type_name(arg) for arg in t.__args__])}]" + if isinstance(t, str): + return t + if hasattr(t, "__name__"): + return t.__name__ + if hasattr(t, "_name"): + return t._name + return str(t) + + +class RelativeRotationQueryParams(QueryParams): + """Relative Rotation Query Parameters.""" + + data: List[Data] = Field( + description="The data to be used for the relative rotation calculations." + + " This should be the multi-symbol output from the" + + " 'equity.price.historical' endpoint, or similar, at a daily interval." + + " Or a pivot table with the 'date' column as the index, the symbols as the columns," + + " and the 'study' as the values." + + " It is recommended to use the 'equity.price.historical' endpoint to get the data," + + " and feed the results as-is." + ) + benchmark: str = Field(description="The symbol to be used as the benchmark.") + study: Literal["price", "volume", "volatility"] = Field( + default="price", + description="The data point for the calculations." + + " If 'price', the closing price will be used." + + " If 'volatility', the standard deviation of the closing price will be used." + + " If 'data' is supplied as a pivot table," + + " the 'study' will assume the values are the closing price and 'volume' will be ignored.", + ) + long_period: Optional[int] = Field( + default=252, + description="The length of the long period for momentum calculation, by default is 252." + + " Adjust this value, to 365, when supplying assets such as crypto.", + ) + short_period: Optional[int] = Field( + default=21, + description="The length of the short period for momentum calculation, by default is 21." + + " Adjust this value, to 30, when supplying assets such as crypto.", + ) + window: Optional[int] = Field( + default=21, + description="The length of window for the standard deviation calculation, by default is 21." + + " Adjust this value, to 30, when supplying assets such as crypto.", + ) + trading_periods: Optional[int] = Field( + default=252, + description="The number of trading periods per year," + + " for the standard deviation calculation, by default is 252." + + " Adjust this value, to 365, when supplying assets such as crypto.", + ) + chart_params: Optional[Dict[str, Any]] = Field( + default=None, + description="Additional parameters to pass when `chart=True` and the `openbb-charting` extension is installed." + + " Parameters can be passed again to redraw the chart using the charting.to_chart() method of the response." + + "\n" + + "\n ChartParams" + + "\n -----------" + + "\n date: Optional[str]" + + "\n A target end date within the data, by default is the last date in the data." + + "\n show_tails: bool" + + "\n Show the tails on the chart, by default is True." + + "\n tail_periods: Optional[int]" + + "\n Number of periods to show in the tails, by default is 16." + + "\n tail_interval: Literal['day', 'week', 'month']" + + "\n Interval to show the tails, by default is 'week'." + + "\n title: Optional[str]" + + "\n Title of the chart.", + ) + + @field_validator("benchmark", mode="before", check_fields=False) + @classmethod + def to_upper(cls, v): + """Convert the benchmark symbol to uppercase.""" + return v.upper() + + @field_validator("data", mode="before", check_fields=False) + @classmethod + def convert_data(cls, v): + """Validate the data format.""" + if isinstance(v, OBBject): + return v.results + if isinstance(v, Data): + return v + if isinstance(v, (list, dict)): + return convert_to_basemodel(v) + if isinstance(v, DataFrame): + return df_to_basemodel(v.reset_index()) + return v + + def __init__(self, **data): + """Initialize the class.""" + super().__init__(**data) + fields = self.__class__.model_fields + doc_str = ( + "\n" + + self.__class__.__name__ + + "\n\n" + + " Parameters\n" + + " ----------\n" + + "\n".join( + [ + f" {k} : {_get_type_name(v.annotation)}\n {v.description}" + for k, v in fields.items() + ] + ) + + "\n" + ) + self.__doc__ = doc_str + + +class RelativeRotationData(Data): + """Relative Rotation Data Model.""" + + symbols: List[str] = Field( + description="The symbols that are being compared against the benchmark." + ) + benchmark: str = Field(description="The benchmark symbol, as entered by the user.") + study: Literal["price", "volume", "volatility"] = Field( + description="The data point for the study, as entered by the user." + ) + long_period: int = Field( + description="The length of the long period for momentum calculation," + + " as entered by the user." + ) + short_period: int = Field( + description="The length of the short period for momentum calculation," + + " as entered by the user." + ) + window: int = Field( + description="The length of window for the standard deviation calculation," + + " as entered by the user.", + ) + trading_periods: int = Field( + description="The number of trading periods per year," + + " for the standard deviation calculation, as entered by the user." + ) + start_date: str = Field( + description="The start date of the data after adjusting" + + " the length of the data for the calculations." + ) + end_date: str = Field(description="The end date of the data.") + symbols_data: List[Data] = Field( + description="The data representing the selected 'study' for each symbol." + ) + benchmark_data: List[Data] = Field( + description="The data representing the selected 'study' for the benchmark." + ) + rs_ratios: List[Data] = Field( + description="The normalized relative strength ratios data." + ) + rs_momentum: List[Data] = Field( + description="The normalized relative strength momentum data." + ) + + def __init__(self, **data): + """Initialize the class.""" + super().__init__(**data) + fields = self.__class__.model_fields + doc_str = ( + "\n" + + self.__class__.__name__ + + "\n\n" + + " Attributes\n" + + " ----------\n" + + "\n".join( + [ + f" {k} : {_get_type_name(v.annotation)}\n {v.description}" + for k, v in fields.items() + ] + ) + + "\n" + ) + self.__doc__ = doc_str + + +class RelativeRotationFetcher( + Fetcher[RelativeRotationQueryParams, RelativeRotationData] +): + """Relative Rotation Fetcher.""" + + @staticmethod + def transform_query(params: Dict[str, Any]) -> RelativeRotationQueryParams: + """Transform the query parameters.""" + return RelativeRotationQueryParams.model_validate(**params) + + @staticmethod + def extract_data( + query: RelativeRotationQueryParams, + credentials: Optional[Dict[str, str]], + **kwargs: Any, + ) -> Dict: + """Extract the data.""" + return RelativeRotation( + query.data, + query.benchmark, + study=query.study, + long_period=query.long_period, + short_period=query.short_period, + window=query.window, + trading_periods=query.trading_periods, + ).__dict__ + + @staticmethod + def transform_data( + query: RelativeRotationQueryParams, + data: Dict, + **kwargs: Any, + ) -> RelativeRotationData: + """Transform the data.""" + return RelativeRotationData.model_validate(data) diff --git a/openbb_platform/extensions/technical/openbb_technical/technical_router.py b/openbb_platform/extensions/technical/openbb_technical/technical_router.py index e4faa20ef90..47aa24d2700 100644 --- a/openbb_platform/extensions/technical/openbb_technical/technical_router.py +++ b/openbb_platform/extensions/technical/openbb_technical/technical_router.py @@ -1,7 +1,7 @@ """Technical Analysis Router.""" # pylint: disable=too-many-lines -from typing import List, Literal, Optional +from typing import Any, Dict, List, Literal, Optional import pandas as pd import pandas_ta as ta @@ -17,15 +17,157 @@ from openbb_core.app.utils import ( from openbb_core.provider.abstract.data import Data from pydantic import NonNegativeFloat, NonNegativeInt, PositiveFloat, PositiveInt -from .helpers import ( +from openbb_technical.helpers import ( calculate_cones, calculate_fib_levels, clenow_momentum, validate_data, ) +from openbb_technical.relative_rotation import ( + RelativeRotationData, + RelativeRotationFetcher, + RelativeRotationQueryParams, +) # TODO: Split this into multiple files -router = Router(prefix="") +router = Router(prefix="", description="Technical Analysis tools.") + + +@router.command( + methods=["POST"], + examples=[ + PythonEx( + description="Calculate the Relative Strength Ratio and Relative Strength Momentum" + + " for a group of symbols against a benchmark.", + code=[ + "stock_data = obb.equity.price.historical(" + + "symbol='AAPL,MSFT,GOOGL,META,AMZN,TSLA,SPY', start_date='2022-01-01', provider='yfinance')", + "rr_data = obb.technical.relative_rotation(data=stock_data.results, benchmark='SPY')", + "rs_ratios = rr_data.results.rs_ratios", + "rs_momentum = rr_data.results.rs_momentum", + ], + ), + PythonEx( + description="When the assets are not traded 252 days per year," + + "adjust the momentum and volatility periods accordingly.", + code=[ + "crypto_data = obb.crypto.price.historical(" + + " symbol='BTCUSD,ETHUSD,SOLUSD', start_date='2021-01-01', provider='yfinance')", + "rr_data = obb.technical.relative_rotation(data=crypto_data.results, benchmark='BTCUSD'," + + " long_period=365, short_period=30, window=30, trading_periods=365)", + ], + ), + APIEx( + description="Note that the mock data displayed here is insufficient." + + " It must contain multiple symbols, with the benchmark, and be daily data at least 1 year in length.", + parameters={"benchmark": "SPY", "data": APIEx.mock_data("timeseries")}, + ), + ], +) +async def relative_rotation( + data: List[Data], + benchmark: str, + study: Literal["price", "volume", "volatility"] = "price", + long_period: Optional[int] = 252, + short_period: Optional[int] = 21, + window: Optional[int] = 21, + trading_periods: Optional[int] = 252, + chart_params: Optional[Dict[str, Any]] = None, +) -> OBBject[RelativeRotationData]: + """Calculate the Relative Strength Ratio and Relative Strength Momentum for a group of symbols against a benchmark. + + Parameters + ---------- + data : list[Data] + The data to be used for the relative rotation calculations. + This should be the multi-symbol output from the 'equity.price.historical' endpoint, or similar. + Or a pivot table with the 'date' column as the index, the symbols as the columns, and the 'study' as the values. + It is recommended to use the 'equity.price.historical' endpoint to get the data, and feed the results as-is. + benchmark : str + The symbol to be used as the benchmark. + study : Literal[price, volume, volatility] + The data point for the calculations. If 'price', the closing price will be used. + If 'volatility', the standard deviation of the closing price will be used. + If 'data' is supplied as a pivot table, + the 'study' will assume the values are the closing price and 'volume' will be ignored. + long_period : int, optional + The length of the long period for momentum calculation, by default 252. + Adjust this value when supplying a time series with an interval that is not daily. + For example, if the data is monthly, the long period should be 12. + short_period : int, optional + The length of the short period for momentum calculation, by default 21. + Adjust this value when supplying a time series with an interval that is not daily. + window : int, optional + The length of window for the standard deviation calculation, by default 21. + Adjust this value when supplying a time series with an interval that is not daily. + trading_periods : int, optional + The number of trading periods per year, for the standard deviation calculation, by default 252. + Adjust this value when supplying a time series with an interval that is not daily. + chart_params : dict[str, Any], optional + Additional parameters to pass when `chart=True` and the `openbb-charting` extension is installed. + Parameters can be passed again to redraw the chart using the charting.to_chart() method of the response. + + ChartParams + ----------- + date : str, optional + A target end date within the data to use for the chart, by default is the last date in the data. + show_tails : bool + Show the tails on the chart, by default True. + tail_periods : int + Number of periods to show in the tails, by default 16. + tail_interval : Literal[day, week, month] + Interval to show the tails, by default 'week'. + title : str, optional + Title of the chart. + + Returns + ------- + OBBject[RelativeRotationData] + results : RelativeRotationData + symbols : list[str]: + The symbols that are being compared against the benchmark. + benchmark : str + The benchmark symbol. + study : Literal[price, volume, volatility] + The data point for the selected. + long_period : int + The length of the long period for momentum calculation, as entered by the user. + short_period : int + The length of the short period for momentum calculation, as entered by the user. + window : int + The length of window for the standard deviation calculation. + trading_periods : int + The number of trading periods per year, for the standard deviation calculation. + start_date : str + The start date of the data after adjusting the length of the data for the calculations. + end_date : str + The end date of the data. + symbols_data : list[Data] + The data representing the selected 'study' for each symbol. + benchmark_data : list[Data] + The data representing the selected 'study' for the benchmark. + rs_ratios : list[Data] + The normalized relative strength ratios data. + rs_momentum : list[Data] + The normalized relative strength momentum data. + """ + + params = RelativeRotationQueryParams( + data=data, + benchmark=benchmark, + study=study, + long_period=long_period, + short_period=short_period, + window=window, + trading_periods=trading_periods, + chart_params=chart_params, + ) + + return OBBject( + results=RelativeRotationFetcher.transform_data( + params, RelativeRotationFetcher.extract_data(params, {}) + ) + ) @router.command( @@ -489,7 +631,7 @@ def aroon( data: List[Data], index: str = "date", length: int = 25, - scalar: int = 100, + scalar: float = 100, ) -> OBBject[List[Data]]: """Calculate the Aroon Indicator. @@ -513,7 +655,7 @@ def aroon( Index column name to use with `data`, by default "date". length : int, optional Number of periods to be used for the calculation, by default 25. - scalar : int, optional + scalar : float, optional Scalar to be used for the calculation, by default 100. Returns diff --git a/openbb_platform/extensions/technical/poetry.lock b/openbb_platform/extensions/technical/poetry.lock index ceb9ffc842f..d081a56833d 100644 --- a/openbb_platform/extensions/technical/poetry.lock +++ b/openbb_platform/extensions/technical/poetry.lock @@ -648,13 +648,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1562,4 +1562,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.12" -content-hash = "0e3d117096b03b113888e7be6639504b3552aabcb58a4c9f648d7a6fd1c4c21e" +content-hash = "3d13f50e40aed069054b8016c306389ee3ff6649cdb88583fd2bc6d9501e7408" diff --git a/openbb_platform/extensions/technical/pyproject.toml b/openbb_platform/extensions/technical/pyproject.toml index 18b1eceb67c..8d38641d074 100644 --- a/openbb_platform/extensions/technical/pyproject.toml +++ b/openbb_platform/extensions/technical/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-technical" -version = "1.1.5" +version = "1.1.6" description = "Technical Analysis extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -12,7 +12,7 @@ scipy = "^1.10.1" statsmodels = "^0.14.0" scikit-learn = "^1.3.1" pandas-ta = "^0.3.14b" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/extensions/technical/tests/test_technical_helpers.py b/openbb_platform/extensions/technical/tests/test_technical_helpers.py index 82ef6919fed..9b4b7a9d102 100644 --- a/openbb_platform/extensions/technical/tests/test_technical_helpers.py +++ b/openbb_platform/extensions/technical/tests/test_technical_helpers.py @@ -20,6 +20,7 @@ from extensions.technical.openbb_technical.helpers import ( @pytest.fixture(scope="module") def mock_data(top_range: int = 100): + """Mock data for testing.""" _open = pd.Series(np.arange(1, top_range)) _high = pd.Series(np.arange(1, top_range)) _low = pd.Series(np.arange(1, top_range)) diff --git a/openbb_platform/extensions/tests/__init__.py b/openbb_platform/extensions/tests/__init__.py index e69de29bb2d..d420712d8bb 100644 --- a/openbb_platform/extensions/tests/__init__.py +++ b/openbb_platform/extensions/tests/__init__.py @@ -0,0 +1 @@ +"""Tests.""" diff --git a/openbb_platform/extensions/tests/conftest.py b/openbb_platform/extensions/tests/conftest.py index b8849169816..c71c47faab5 100644 --- a/openbb_platform/extensions/tests/conftest.py +++ b/openbb_platform/extensions/tests/conftest.py @@ -14,7 +14,7 @@ commands = list(cm.map.keys()) def parametrize(argnames: str, argvalues: List, **kwargs): - """Custom parametrize decorator that filters test cases based on the environment.""" + """Apply a custom parametrize decorator that filters test cases based on the environment.""" routers, providers, obbject_ext = list_openbb_extensions() diff --git a/openbb_platform/extensions/tests/utils/__init__.py b/openbb_platform/extensions/tests/utils/__init__.py index e69de29bb2d..479fdbbe1fb 100644 --- a/openbb_platform/extensions/tests/utils/__init__.py +++ b/openbb_platform/extensions/tests/utils/__init__.py @@ -0,0 +1 @@ +"""Testing utilities.""" diff --git a/openbb_platform/extensions/tests/utils/helpers.py b/openbb_platform/extensions/tests/utils/helpers.py index 8d35fced671..2411a85484b 100644 --- a/openbb_platform/extensions/tests/utils/helpers.py +++ b/openbb_platform/extensions/tests/utils/helpers.py @@ -242,7 +242,7 @@ def find_missing_router_function_models( def parse_example_string(example_string: str) -> Dict[str, Any]: - """Parses a string of examples into nested dictionaries. + """Parse a string of examples into nested dictionaries. This is capturing all instances of PythonEx and APIEx, including their "parameters", "code", and "description". """ diff --git a/openbb_platform/obbject_extensions/charting/integration/test_charting_api.py b/openbb_platform/obbject_extensions/charting/integration/test_charting_api.py index f89c1b318bf..5066d5a40b7 100644 --- a/openbb_platform/obbject_extensions/charting/integration/test_charting_api.py +++ b/openbb_platform/obbject_extensions/charting/integration/test_charting_api.py @@ -1,3 +1,5 @@ +"""Integration tests for charting API.""" + import base64 import json @@ -49,7 +51,7 @@ def get_equity_data(): [ ( { - "provider": "fmp", + "provider": "yfinance", "symbol": "AAPL", "chart": True, } @@ -58,7 +60,7 @@ def get_equity_data(): ) @pytest.mark.integration def test_charting_equity_price_historical(params, headers): - """Test chart equity load.""" + """Test chart equity price historical..""" params = {p: v for p, v in params.items() if v} query_str = get_querystring(params, []) @@ -75,6 +77,130 @@ def test_charting_equity_price_historical(params, headers): assert list(chart.keys()) == ["content", "format"] +@parametrize( + "params", + [ + ( + { + "provider": "yfinance", + "symbol": "USDGBP", + "chart": True, + } + ), + ], +) +@pytest.mark.integration +def test_charting_currency_price_historical(params, headers): + """Test chart currency price historical.""" + params = {p: v for p, v in params.items() if v} + + query_str = get_querystring(params, []) + url = f"http://0.0.0.0:8000/api/v1/currency/price/historical?{query_str}" + result = requests.get(url, headers=headers, timeout=40) + assert isinstance(result, requests.Response) + assert result.status_code == 200 + + chart = result.json()["chart"] + fig = chart.pop("fig", {}) + + assert chart + assert not fig + assert list(chart.keys()) == ["content", "format"] + + +@parametrize( + "params", + [ + ( + { + "provider": "yfinance", + "symbol": "QQQ", + "chart": True, + } + ), + ], +) +@pytest.mark.integration +def test_charting_etf_historical(params, headers): + """Test chart etf historical.""" + params = {p: v for p, v in params.items() if v} + + query_str = get_querystring(params, []) + url = f"http://0.0.0.0:8000/api/v1/etf/historical?{query_str}" + result = requests.get(url, headers=headers, timeout=40) + assert isinstance(result, requests.Response) + assert result.status_code == 200 + + chart = result.json()["chart"] + fig = chart.pop("fig", {}) + + assert chart + assert not fig + assert list(chart.keys()) == ["content", "format"] + + +@parametrize( + "params", + [ + ( + { + "provider": "yfinance", + "symbol": "NDX", + "chart": True, + } + ), + ], +) +@pytest.mark.integration +def test_charting_index_price_historical(params, headers): + """Test chart index price historical.""" + params = {p: v for p, v in params.items() if v} + + query_str = get_querystring(params, []) + url = f"http://0.0.0.0:8000/api/v1/index/price/historical?{query_str}" + result = requests.get(url, headers=headers, timeout=40) + assert isinstance(result, requests.Response) + assert result.status_code == 200 + + chart = result.json()["chart"] + fig = chart.pop("fig", {}) + + assert chart + assert not fig + assert list(chart.keys()) == ["content", "format"] + + +@parametrize( + "params", + [ + ( + { + "provider": "yfinance", + "symbol": "BTCUSD", + "chart": True, + } + ), + ], +) +@pytest.mark.integration +def test_charting_crypto_price_historical(params, headers): + """Test chart crypto price historical.""" + params = {p: v for p, v in params.items() if v} + + query_str = get_querystring(params, []) + url = f"http://0.0.0.0:8000/api/v1/crypto/price/historical?{query_str}" + result = requests.get(url, headers=headers, timeout=40) + assert isinstance(result, requests.Response) + assert result.status_code == 200 + + chart = result.json()["chart"] + fig = chart.pop("fig", {}) + + assert chart + assert not fig + assert list(chart.keys()) == ["content", "format"] + + @parametrize( "params", [ @@ -444,3 +570,152 @@ def test_charting_economy_fred_series(params, headers): assert chart assert not fig assert list(chart.keys()) == ["content", "format"] + + +@parametrize( + "params", + [ + ( + { + "data": "", + "study": "price", + "benchmark": "SPY", + "long_period": 252, + "short_period": 21, + "window": 21, + "trading_periods": 252, + "chart": True, + } + ), + ], +) +@pytest.mark.integration +def test_charting_technical_relative_rotation(params): + params = {p: v for p, v in params.items() if v} + data_params = dict( + symbol="AAPL,MSFT,GOOGL,AMZN,SPY", + provider="yfinance", + start_date="2022-01-01", + end_date="2024-01-01", + ) + data_query_str = get_querystring(data_params, []) + data_url = f"http://0.0.0.0:8000/api/v1/equity/price/historical?{data_query_str}" + data_result = requests.get(data_url, headers=get_headers(), timeout=10).json()[ + "results" + ] + body = json.dumps({"data": data_result}) + query_str = get_querystring(params, ["data"]) + url = f"http://0.0.0.0:8000/api/v1/technical/relative_rotation?{query_str}" + result = requests.post(url, headers=get_headers(), timeout=10, data=body) + assert isinstance(result, requests.Response) + assert result.status_code == 200 + chart = result.json()["chart"] + fig = chart.pop("fig", {}) + + assert chart + assert not fig + assert list(chart.keys()) == ["content", "format"] + + +@parametrize( + "params", + [ + ( + { + "data": None, + "symbol": "XRT,XLB,XLI,XLH,XLC,XLY,XLU,XLK", + "chart": True, + "provider": "finviz", + } + ) + ], +) +@pytest.mark.integration +def test_charting_equity_price_performance(params, headers): + """Test chart equity price performance.""" + params = {p: v for p, v in params.items() if v} + body = ( + json.dumps( + {"extra_params": {"chart_params": {"limit": 4, "orientation": "h"}}} + ), + ) + query_str = get_querystring(params, []) + url = f"http://0.0.0.0:8000/api/v1/equity/price/performance?{query_str}" + result = requests.get(url, headers=headers, timeout=10, json=body) + assert isinstance(result, requests.Response) + assert result.status_code == 200 + + chart = result.json()["chart"] + fig = chart.pop("fig", {}) + + assert chart + assert not fig + assert list(chart.keys()) == ["content", "format"] + + +@parametrize( + "params", + [ + ( + { + "data": None, + "symbol": "XRT,XLB,XLI,XLH,XLC,XLY,XLU,XLK", + "chart": True, + "provider": "intrinio", + } + ) + ], +) +@pytest.mark.integration +def test_charting_etf_price_performance(params, headers): + """Test chart equity price performance.""" + params = {p: v for p, v in params.items() if v} + body = (json.dumps({"extra_params": {"chart_params": {"orientation": "v"}}}),) + query_str = get_querystring(params, []) + url = f"http://0.0.0.0:8000/api/v1/etf/price_performance?{query_str}" + result = requests.get(url, headers=headers, timeout=10, json=body) + assert isinstance(result, requests.Response) + assert result.status_code == 200 + + chart = result.json()["chart"] + fig = chart.pop("fig", {}) + + assert chart + assert not fig + assert list(chart.keys()) == ["content", "format"] + + +@parametrize( + "params", + [ + ( + { + "data": None, + "symbol": "XRT", + "chart": True, + "provider": "fmp", + } + ) + ], +) +@pytest.mark.integration +def test_charting_etf_holdings(params, headers): + """Test chart etf holdings.""" + params = {p: v for p, v in params.items() if v} + body = ( + json.dumps( + {"extra_params": {"chart_params": {"orientation": "v", "limit": 10}}} + ), + ) + query_str = get_querystring(params, []) + url = f"http://0.0.0.0:8000/api/v1/etf/holdings?{query_str}" + result = requests.get(url, headers=headers, timeout=10, json=body) + assert isinstance(result, requests.Response) + assert result.status_code == 200 + + chart = result.json()["chart"] + fig = chart.pop("fig", {}) + + assert chart + assert not fig + assert list(chart.keys()) == ["content", "format"] diff --git a/openbb_platform/obbject_extensions/charting/integration/test_charting_python.py b/openbb_platform/obbject_extensions/charting/integration/test_charting_python.py index 1995eabf011..f8bc9275e59 100644 --- a/openbb_platform/obbject_extensions/charting/integration/test_charting_python.py +++ b/openbb_platform/obbject_extensions/charting/integration/test_charting_python.py @@ -42,7 +42,7 @@ def get_equity_data(): [ ( { - "provider": "fmp", + "provider": "yfinance", "symbol": "AAPL", "chart": True, } @@ -60,6 +60,98 @@ def test_charting_equity_price_historical(params, obb): assert isinstance(result.chart.fig, OpenBBFigure) +@parametrize( + "params", + [ + ( + { + "provider": "yfinance", + "symbol": "JPYUSD", + "chart": True, + } + ), + ], +) +@pytest.mark.integration +def test_charting_currency_price_historical(params, obb): + """Test chart currency price historical.""" + result = obb.currency.price.historical(**params) + assert result + assert isinstance(result, OBBject) + assert len(result.results) > 0 + assert result.chart.content + assert isinstance(result.chart.fig, OpenBBFigure) + + +@parametrize( + "params", + [ + ( + { + "provider": "yfinance", + "symbol": "BTCUSD", + "chart": True, + } + ), + ], +) +@pytest.mark.integration +def test_charting_crypto_price_historical(params, obb): + """Test chart crypto price historical.""" + result = obb.crypto.price.historical(**params) + assert result + assert isinstance(result, OBBject) + assert len(result.results) > 0 + assert result.chart.content + assert isinstance(result.chart.fig, OpenBBFigure) + + +@parametrize( + "params", + [ + ( + { + "provider": "yfinance", + "symbol": "NDX", + "chart": True, + } + ), + ], +) +@pytest.mark.integration +def test_charting_index_price_historical(params, obb): + """Test chart index price historical.""" + result = obb.index.price.historical(**params) + assert result + assert isinstance(result, OBBject) + assert len(result.results) > 0 + assert result.chart.content + assert isinstance(result.chart.fig, OpenBBFigure) + + +@parametrize( + "params", + [ + ( + { + "provider": "yfinance", + "symbol": "QQQ", + "chart": True, + } + ), + ], +) +@pytest.mark.integration +def test_charting_etf_historical(params, obb): + """Test chart etf historical.""" + result = obb.etf.historical(**params) + assert result + assert isinstance(result, OBBject) + assert len(result.results) > 0 + assert result.chart.content + assert isinstance(result.chart.fig, OpenBBFigure) + + @parametrize( "params", [ @@ -381,3 +473,120 @@ def test_charting_economy_fred_series(params, obb): assert len(result.results) > 0 assert result.chart.content assert isinstance(result.chart.fig, OpenBBFigure) + + +@parametrize( + "params", + [ + ( + { + "data": "", + "study": "price", + "benchmark": "SPY", + "long_period": 252, + "short_period": 21, + "window": 21, + "trading_periods": 252, + "chart": True, + } + ), + ], +) +@pytest.mark.integration +def test_charting_technical_relative_rotation(params, obb): + params["data"] = obb.equity.price.historical( + "AAPL,MSFT,GOOGL,AMZN,SPY", + provider="yfinance", + start_date="2022-01-01", + end_date="2024-01-01", + ).results + result = obb.technical.relative_rotation( + data=params["data"], + benchmark=params["benchmark"], + study=params["study"], + long_period=params["long_period"], + short_period=params["short_period"], + window=params["window"], + trading_periods=params["trading_periods"], + chart=params["chart"], + ) + assert result + assert isinstance(result, OBBject) + assert len(result.results.rs_ratios) > 0 # type: ignore + assert result.chart.content # type: ignore + assert isinstance(result.chart.fig, OpenBBFigure) # type: ignore + + +@parametrize( + "params", + [ + ( + { + "data": None, + "symbol": "XRT,XLB,XLI,XLH,XLC,XLY,XLU,XLK", + "chart": True, + "provider": "finviz", + "chart_params": {"limit": 4, "orientation": "h"}, + } + ) + ], +) +@pytest.mark.integration +def test_charting_equity_price_performance(params, obb): + """Test chart equity price performance.""" + result = obb.equity.price.performance(**params) + assert result + assert isinstance(result, OBBject) + assert len(result.results) > 0 + assert result.chart.content + assert isinstance(result.chart.fig, OpenBBFigure) + + +@parametrize( + "params", + [ + ( + { + "data": None, + "symbol": "XRT,XLB,XLI,XLH,XLC,XLY,XLU,XLK", + "chart": True, + "provider": "intrinio", + "chart_params": {"orientation": "v"}, + } + ) + ], +) +@pytest.mark.integration +def test_charting_etf_price_performance(params, obb): + """Test chart etf price performance.""" + result = obb.etf.price_performance(**params) + assert result + assert isinstance(result, OBBject) + assert len(result.results) > 0 + assert result.chart.content + assert isinstance(result.chart.fig, OpenBBFigure) + + +@parametrize( + "params", + [ + ( + { + "data": None, + "symbol": "XRT", + "chart": True, + "provider": "fmp", + "chart_params": {"orientation": "v", "limit": 10}, + } + ) + ], +) +@pytest.mark.integration +def test_charting_etf_holdings(params, obb): + """Test chart etf holdings.""" + result = obb.etf.holdings(**params) + assert result + assert isinstance(result, OBBject) + assert len(result.results) > 0 + assert result.chart.content + assert isinstance(result.chart.fig, OpenBBFigure) diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/__init__.py b/openbb_platform/obbject_extensions/charting/openbb_charting/__init__.py index ac585fefada..c79dc270784 100644 --- a/openbb_platform/obbject_extensions/charting/openbb_charting/__init__.py +++ b/openbb_platform/obbject_extensions/charting/openbb_charting/__init__.py @@ -1,25 +1,40 @@ """OpenBB OBBject extension for charting.""" +# pylint: disable=too-many-arguments,unused-argument + +import warnings from typing import ( Any, Callable, Dict, List, + Literal, Optional, + Tuple, Union, ) +from warnings import warn import numpy as np import pandas as pd from openbb_core.app.model.charts.chart import Chart from openbb_core.app.model.extension import Extension +from openbb_core.app.model.obbject import OBBject from openbb_core.app.utils import basemodel_to_df, convert_to_basemodel from openbb_core.provider.abstract.data import Data +from plotly.graph_objs import Figure from openbb_charting import charting_router -from openbb_charting.core.to_chart import ChartIndicators, to_chart +from openbb_charting.core.backend import Backend, create_backend, get_backend +from openbb_charting.core.openbb_figure import OpenBBFigure +from openbb_charting.query_params import ChartParams, IndicatorsParams +from openbb_charting.utils.generic_charts import bar_chart, line_chart from openbb_charting.utils.helpers import get_charting_functions +warnings.filterwarnings( + "ignore", category=UserWarning, module="openbb_core.app.model.extension", lineno=47 +) + ext = Extension(name="charting") @@ -33,74 +48,323 @@ class Charting: show Display chart and save it to the OBBject. to_chart - Returns the plotly json representation of the chart. + Redraw the chart and save it to the OBBject, with an optional entry point for Data. functions - Returns a list of Platform commands with charting functions. + Return a list of Platform commands with charting functions. + get_params + Return the charting parameters for the function the OBBject was created from. indicators - Returns a list of the available indicators to use with the `to_chart` method. + Return the list of the available technical indicators to use with the `to_chart` method and OHLC+V data. + table + Display an interactive table. + create_line_chart + Create a line chart from external data. + create_bar_chart + Create a bar chart, on a single x-axis with one or more values for the y-axis, from external data. """ def __init__(self, obbject): """Initialize Charting extension.""" # pylint: disable=import-outside-toplevel from openbb_core.app.model.charts.charting_settings import ChartingSettings - from openbb_core.app.model.obbject import OBBject self._obbject: OBBject = obbject self._charting_settings = ChartingSettings( user_settings=self._obbject._user_settings, # type: ignore system_settings=self._obbject._system_settings, # type: ignore ) - self._handle_backend() + self._backend: Backend = self._handle_backend() @classmethod def indicators(cls): - """Returns a list of the available indicators.""" - return ChartIndicators.get_available_indicators() + """ + Return an instance of the IndicatorsParams class, containing all available indicators and their parameters. + Without assigning to a variable, it will print the the information to the console. + """ + return IndicatorsParams() @classmethod def functions(cls): - """Returns a list of the available functions.""" + """Return a list of the available functions.""" return get_charting_functions() - def _handle_backend(self): - # pylint: disable=import-outside-toplevel - from openbb_charting.core.backend import create_backend, get_backend + def _handle_backend(self) -> Backend: + """Create and start the backend.""" create_backend(self._charting_settings) - get_backend().start(debug=self._charting_settings.debug_mode) + backend = get_backend() + backend.start(debug=self._charting_settings.debug_mode) + return backend @staticmethod def _get_chart_function(route: str) -> Callable: """Given a route, it returns the chart function. The module must contain the given route.""" + + if route is None: + raise ValueError("OBBject was initialized with no function route.") adjusted_route = route.replace("/", "_")[1:] return getattr(charting_router, adjusted_route) - def show(self, render: bool = True, **kwargs): - """Display chart and save it to the OBBject.""" - charting_function = self._get_chart_function( + def get_params(self) -> ChartParams: + """ + Return the ChartQueryParams class for the function the OBBject was created from. + Without assigning to a variable, it will print the docstring to the console. + """ + if self._obbject._route is None: # pylint: disable=protected-access + raise ValueError("OBBject was initialized with no function route.") + charting_function = ( self._obbject._route # pylint: disable=protected-access + ).replace("/", "_")[1:] + if hasattr(ChartParams, charting_function): + return getattr(ChartParams, charting_function)() + raise ValueError( + f"Error: No chart parameters are defined for the route: {charting_function}" ) - kwargs["obbject_item"] = self._obbject.results - kwargs["charting_settings"] = self._charting_settings - if ( - hasattr(self._obbject, "_standard_params") - and self._obbject._standard_params # pylint: disable=protected-access - ): - kwargs["standard_params"] = ( - self._obbject._standard_params.__dict__ # pylint: disable=protected-access - ) - kwargs["provider"] = self._obbject.provider # pylint: disable=protected-access - kwargs["extra"] = self._obbject.extra # pylint: disable=protected-access - kwargs["warnings"] = self._obbject.warnings # pylint: disable=protected-access - fig, content = charting_function(**kwargs) - self._obbject.chart = Chart( - fig=fig, content=content, format=charting_router.CHART_FORMAT + + def _prepare_data_as_df( + self, data: Optional[Union[pd.DataFrame, pd.Series]] + ) -> Tuple[pd.DataFrame, bool]: + """Convert supplied data to a DataFrame.""" + has_data = ( + isinstance(data, (Data, pd.DataFrame, pd.Series)) and not data.empty + ) or (bool(data)) + index = ( + data.index.name + if has_data and isinstance(data, (pd.DataFrame, pd.Series)) + else None + ) + data_as_df: pd.DataFrame = ( + basemodel_to_df(convert_to_basemodel(data), index=index) + if has_data + else self._obbject.to_dataframe(index=index) + ) + if "date" in data_as_df.columns: + data_as_df = data_as_df.set_index("date") + if "provider" in data_as_df.columns: + data_as_df.drop(columns="provider", inplace=True) + return data_as_df, has_data + + # pylint: disable=too-many-locals + def create_line_chart( + self, + data: Union[ + list, + dict, + pd.DataFrame, + List[pd.DataFrame], + pd.Series, + List[pd.Series], + np.ndarray, + Data, + ], + index: Optional[str] = None, + target: Optional[str] = None, + title: Optional[str] = None, + x: Optional[str] = None, + xtitle: Optional[str] = None, + y: Optional[Union[str, List[str]]] = None, + ytitle: Optional[str] = None, + y2: Optional[Union[str, List[str]]] = None, + y2title: Optional[str] = None, + layout_kwargs: Optional[dict] = None, + scatter_kwargs: Optional[dict] = None, + normalize: bool = False, + returns: bool = False, + same_axis: bool = False, + render: bool = True, + **kwargs, + ) -> Union[OpenBBFigure, Figure, None]: + """Create a line chart from external data and render a chart or return the OpenBBFigure. + + Parameters + ---------- + data : Union[Data, pd.DataFrame, pd.Series] + Data to be plotted (OHLCV data). + index : Optional[str], optional + Index column, by default None + target : Optional[str], optional + Target column to be plotted, by default None + title : Optional[str], optional + Chart title, by default None + x : Optional[str], optional + X-axis column, by default None + xtitle : Optional[str], optional + X-axis title, by default None + y : Optional[Union[str, List[str]]], optional + Y-axis column(s), by default None + If None are supplied, the layout is optimized for the contents of data. + Where many units/scales are present, + it will attempt to divide based on the range of values. + ytitle : Optional[str], optional + Y-axis title, by default None + y2 : Optional[Union[str, List[str]]], optional + Y2-axis column(s), by default None + y2title : Optional[str], optional + Y2-axis title, by default None + layout_kwargs : Optional[dict], optional + Additional Plotly Layout parameters for `fig.update_layout`, by default None + scatter_kwargs : Optional[dict], optional + Additional Plotly parameters applied on creation of each scatter plot, by default None + normalize : bool, optional + Normalize the data with Z-Score Standardization, by default False + returns : bool, optional + Convert the data to cumulative returns, by default False + same_axis: bool, optional + If True, forces all data onto the same Y-axis, by default False + render: bool, optional + If True, the chart will be rendered, by default True + **kwargs: Dict[str, Any] + Extra parameters to be passed to `figure.show()` + """ + fig = line_chart( + data=data, + index=index, + target=target, + title=title, + x=x, + xtitle=xtitle, + y=y, + ytitle=ytitle, + y2=y2, + y2title=y2title, + layout_kwargs=layout_kwargs, + scatter_kwargs=scatter_kwargs, + normalize=normalize, + returns=returns, + same_axis=same_axis, + **kwargs, ) if render: - fig.show(**kwargs) + return fig.show(**kwargs) - # pylint: disable=too-many-arguments + return fig + + def create_bar_chart( + self, + data: Union[ + list, + dict, + pd.DataFrame, + List[pd.DataFrame], + pd.Series, + List[pd.Series], + np.ndarray, + Data, + ], + x: str, + y: Union[str, List[str]], + barmode: Literal["group", "stack", "relative", "overlay"] = "group", + xtype: Literal[ + "category", "multicategory", "date", "log", "linear" + ] = "category", + title: Optional[str] = None, + xtitle: Optional[str] = None, + ytitle: Optional[str] = None, + orientation: Literal["h", "v"] = "v", + colors: Optional[List[str]] = None, + layout_kwargs: Optional[Dict[str, Any]] = None, + bar_kwargs: Optional[Dict[str, Any]] = None, + render: bool = True, + **kwargs, + ) -> Union[OpenBBFigure, Figure, None]: + """Create a bar chart on a single x-axis with one or more values for the y-axis. + + Parameters + ---------- + data : Union[list, dict, pd.DataFrame, List[pd.DataFrame], pd.Series, List[pd.Series], np.ndarray, Data] + Data to plot. + x : str + The x-axis column name. + y : Union[str, List[str]] + The y-axis column name(s). + barmode : Literal["group", "stack", "relative", "overlay"], optional + The bar mode, by default "group". + xtype : Literal["category", "multicategory", "date", "log", "linear"], optional + The x-axis type, by default "category". + title : str, optional + The title of the chart, by default None. + xtitle : str, optional + The x-axis title, by default None. + ytitle : str, optional + The y-axis title, by default None. + colors: List[str], optional + Manually set the colors to cycle through for each column in 'y', by default None. + bar_kwargs : Dict[str, Any], optional + Additional keyword arguments to apply with figure.add_bar(), by default None. + layout_kwargs : Dict[str, Any], optional + Additional keyword arguments to apply with figure.update_layout(), by default None. + Returns + ------- + OpenBBFigure + The OpenBBFigure object. + """ + + fig = bar_chart( + data=data, + x=x, + y=y, + barmode=barmode, + xtype=xtype, + title=title, + xtitle=xtitle, + ytitle=ytitle, + orientation=orientation, + colors=colors, + bar_kwargs=bar_kwargs, + layout_kwargs=layout_kwargs, + ) + + if render: + return fig.show(**kwargs) + + return fig + + # pylint: disable=inconsistent-return-statements + def show(self, render: bool = True, **kwargs): + """Display chart and save it to the OBBject.""" + + try: + charting_function = self._get_chart_function( + self._obbject._route # pylint: disable=protected-access + ) + kwargs["obbject_item"] = self._obbject.results + kwargs["charting_settings"] = self._charting_settings + if ( + hasattr(self._obbject, "_standard_params") + and self._obbject._standard_params # pylint: disable=protected-access + ): + kwargs["standard_params"] = ( + self._obbject._standard_params.__dict__ # pylint: disable=protected-access + ) + kwargs["provider"] = ( + self._obbject.provider + ) # pylint: disable=protected-access + kwargs["extra"] = self._obbject.extra # pylint: disable=protected-access + + if "kwargs" in kwargs: + _kwargs = kwargs.pop("kwargs") + kwargs.update(_kwargs.get("chart_params", {})) + fig, content = charting_function(**kwargs) + self._obbject.chart = Chart( + fig=fig, content=content, format=charting_router.CHART_FORMAT + ) + if render: + fig.show(**kwargs) + except Exception: + try: + fig = self.create_line_chart(data=self._obbject.results, render=False, **kwargs) # type: ignore + content = fig.show(external=True, **kwargs).to_plotly_json() # type: ignore + self._obbject.chart = Chart( + fig=fig, content=content, format=charting_router.CHART_FORMAT + ) + if render: + return fig.show(**kwargs) # type: ignore + except Exception as e: + raise RuntimeError( + "Failed to automatically create a generic chart with the data provided." + ) from e + + # pylint: disable=too-many-locals,inconsistent-return-statements def to_chart( self, data: Optional[ @@ -115,100 +379,147 @@ class Charting: Data, ] ] = None, - indicators: Optional[Union[ChartIndicators, Dict[str, Dict[str, Any]]]] = None, + target: Optional[str] = None, + index: Optional[str] = None, + indicators: Optional[Dict[str, Dict[str, Any]]] = None, symbol: str = "", candles: bool = True, volume: bool = True, - prepost: bool = False, volume_ticks_x: int = 7, render: bool = True, **kwargs, ): """ - Creates a OpenBBFigure with user customizations (if any) and saves it to the OBBject. + Create an OpenBBFigure with user customizations (if any) and save it to the OBBject. + This function is used to populate, or re-populate, the OBBject with a chart using the data within + the OBBject or external data supplied via the `data` parameter. - This function is used so it can be called at the module level and used out of the box, - which allows some more flexibility, ease of use and doesn't require the user to know - about the PlotlyTA class. + This function modifies the original OBBject by overwriting the existing chart. Parameters ---------- - data : Union[pd.DataFrame, pd.Series] - Data to be plotted Data to be plotted (OHLCV data). - indicators : Optional[Union[ChartIndicators, Dict[str, Dict[str, Any]]]], optional + data : Union[Data, pd.DataFrame, pd.Series] + Data to be plotted. + indicators : Dict[str, Dict[str, Any]], optional Indicators to be plotted, by default None symbol : str, optional - Symbol to be plotted, by default "" + Symbol to be plotted. This is used for labels and titles, by default "" candles : bool, optional If True, candles will be plotted, by default True volume : bool, optional If True, volume will be plotted, by default True - prepost : bool, optional - If True, prepost will be plotted, by default False volume_ticks_x : int, optional Volume ticks, by default 7 render : bool, optional If True, the chart will be rendered, by default True + kwargs: Dict[str, Any] + Extra parameters to be passed to the chart constructor. Examples -------- - 1) Plotting a time series with TA indicators - > from openbb import obb - > res = obb.equity.price.historical("AAPL") - > indicators = dict( - > sma=dict(length=[20,30,50]), - > adx=dict(length=14), - > rsi=dict(length=14), - > macd=dict(fast=12, slow=26, signal=9), - > bbands=dict(length=20, std=2), - > stoch=dict(length=14), - > ema=dict(length=[20,30,50]), - > ) - > res.charting.to_chart(**{"indicators": indicators}) + Plotting a time series with TA indicators - 2) Get all the available indicators - > from openbb_charting.core.plotly_ta.data_classes import ChartIndicators - > ChartIndicators.get_available_indicators() - or - > from openbb_charting import Charting - > Charting.indicators() + >>> from openbb import obb + >>> res = obb.equity.price.historical("AAPL") + >>> indicators = dict( + >>> sma=dict(length=[20,30,50]), + >>> adx=dict(length=14), + >>> rsi=dict(length=14), + >>> macd=dict(fast=12, slow=26, signal=9), + >>> bbands=dict(length=20, std=2), + >>> stoch=dict(length=14), + >>> ema=dict(length=[20,30,50]), + >>> ) + >>> res.charting.to_chart(**{"indicators": indicators}) + + Get all the available indicators + + >>> res = obb.equity.price.historical("AAPL") + >>> indicators = res.charting.indicators() + >>> indicators? """ - has_data = (isinstance(data, (pd.DataFrame, pd.Series)) and not data.empty) or ( - data - ) - index = ( - data.index.name - if has_data and isinstance(data, (pd.DataFrame, pd.Series)) - else None - ) - data_as_df: pd.DataFrame = ( - basemodel_to_df(convert_to_basemodel(data), index=index) - if has_data - else self._obbject.to_dataframe() - ) - if "date" in data_as_df.columns: - data_as_df = data_as_df.set_index("date") + data_as_df, has_data = self._prepare_data_as_df(data) # type: ignore + if target is not None: + data_as_df = data_as_df[[target]] + kwargs["candles"] = candles + kwargs["volume"] = volume + kwargs["volume_ticks_x"] = volume_ticks_x + kwargs["indicators"] = indicators if indicators else {} + kwargs["symbol"] = symbol + kwargs["target"] = target + kwargs["index"] = index + kwargs["obbject_item"] = self._obbject.results + kwargs["charting_settings"] = self._charting_settings + if ( + hasattr(self._obbject, "_standard_params") + and self._obbject._standard_params # pylint: disable=protected-access + ): + kwargs["standard_params"] = ( + self._obbject._standard_params.__dict__ # pylint: disable=protected-access + ) + kwargs["provider"] = self._obbject.provider # pylint: disable=protected-access + kwargs["extra"] = self._obbject.extra # pylint: disable=protected-access + if "kwargs" in kwargs: + _kwargs = kwargs.pop("kwargs") + kwargs.update(_kwargs.get("chart_params", {})) try: - fig, content = to_chart( - data_as_df, - indicators=indicators, - symbol=symbol, - candles=candles, - volume=volume, - prepost=prepost, - volume_ticks_x=volume_ticks_x, - ) - self._obbject.chart = Chart( - fig=fig, content=content, format=charting_router.CHART_FORMAT - ) - if render: - fig.show(**kwargs) - + if has_data: + self.show(data=data_as_df, render=render, **kwargs) + else: + self.show(**kwargs, render=render) except Exception: try: - if has_data: - self.show(data=data_as_df, symbol=symbol, render=render, **kwargs) - else: - self.show(**kwargs) + fig = self.create_line_chart(data=data_as_df, render=False, **kwargs) + content = fig.show(external=True, **kwargs).to_plotly_json() # type: ignore + self._obbject.chart = Chart( + fig=fig, content=content, format=charting_router.CHART_FORMAT + ) + if render: + return fig.show(**kwargs) # type: ignore except Exception as e: - raise RuntimeError("Could not create chart from the OBBject.") from e + raise RuntimeError( + "Failed to automatically create a generic chart with the data provided." + ) from e + + def table( + self, + data: Optional[Union[pd.DataFrame, pd.Series]] = None, + title: str = "", + ): + """ + Display an interactive table. + + Parameters + ---------- + data : Optional[Union[pd.DataFrame, pd.Series]], optional + Data to be plotted, by default None. + If no data is provided the OBBject results will be used. + title : str, optional + Title of the table, by default "". + """ + data_as_df, _ = self._prepare_data_as_df(data) + if isinstance(data_as_df.index, pd.RangeIndex): + data_as_df.reset_index(inplace=True, drop=True) + else: + data_as_df.reset_index(inplace=True) + if self._backend.isatty: + try: + self._backend.send_table( + df_table=data_as_df, + title=title + or self._obbject._route, # pylint: disable=protected-access + theme=self._charting_settings.table_style, + ) + except Exception as e: + warn(f"Failed to show figure with backend. {e}") + + else: + from plotly import ( # pylint:disable=import-outside-toplevel + optional_imports, + ) + + ipython_display = optional_imports.get_module("IPython.display") + if ipython_display: + ipython_display.display(ipython_display.HTML(data_as_df.to_html())) + else: + warn("IPython.display is not available.") diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/charting_router.py b/openbb_platform/obbject_extensions/charting/openbb_charting/charting_router.py index 08c27d8c12c..fc271fbeaa1 100644 --- a/openbb_platform/obbject_extensions/charting/openbb_charting/charting_router.py +++ b/openbb_platform/obbject_extensions/charting/openbb_charting/charting_router.py @@ -1,145 +1,793 @@ """Charting router.""" -import json +# pylint: disable=too-many-arguments, too-many-locals, too-many-branches, too-many-statements, unused-argument, too-many-lines + from typing import Any, Dict, Optional, Tuple, Union +from warnings import warn import pandas as pd from openbb_core.app.model.charts.chart import ChartFormat from openbb_core.app.utils import basemodel_to_df +from plotly.graph_objs import Figure from openbb_charting.core.chart_style import ChartStyle from openbb_charting.core.openbb_figure import OpenBBFigure from openbb_charting.core.plotly_ta.ta_class import PlotlyTA -from openbb_charting.query_params import ( - FredSeriesChartQueryParams, - TechnicalConesChartQueryParams, +from openbb_charting.core.to_chart import to_chart +from openbb_charting.styles.colors import LARGE_CYCLER +from openbb_charting.utils import relative_rotation +from openbb_charting.utils.generic_charts import bar_chart +from openbb_charting.utils.helpers import ( + calculate_returns, + heikin_ashi, + should_share_axis, + z_score_standardization, ) CHART_FORMAT = ChartFormat.plotly -# if TYPE_CHECKING: -# from .core.openbb_figure_table import OpenBBFigureTable +def equity_price_performance( + **kwargs, +) -> Tuple[Union[OpenBBFigure, Figure], Dict[str, Any]]: # noqa: PLR0912 + """Equity Price Performance Chart.""" + if "data" in kwargs and isinstance(kwargs["data"], pd.DataFrame): + data = kwargs["data"] + elif "data" in kwargs and isinstance(kwargs["data"], list): + data = basemodel_to_df(kwargs["data"], index=kwargs.get("index", "symbol")) # type: ignore + else: + data = basemodel_to_df( + kwargs["obbject_item"], index=kwargs.get("index", "symbol") # type: ignore + ) -def equity_price_historical(**kwargs) -> Tuple["OpenBBFigure", Dict[str, Any]]: - """Equity price chart.""" + cols = [ + "one_day", + "one_week", + "one_month", + "three_month", + "six_month", + "ytd", + "one_year", + "two_year", + "three_year", + "four_year", + "five_year", + ] - def handle_indicators(ma): - """Handle indicators.""" - k = {} - if ma: - k["rma"] = dict(length=ma) - return k + df = pd.DataFrame() + chart_df = pd.DataFrame() - data = basemodel_to_df(kwargs["obbject_item"], index=kwargs.get("index", "date")) - standard_params = kwargs["standard_params"] - ma = standard_params.get("ma", None) - prepost = standard_params.get("prepost", False) - symbol = standard_params.get("symbol", "") + if "symbol" in data.columns: + data = data.set_index("symbol") + chart_cols = [] - ta = PlotlyTA() - fig = ta.plot( - data, - indicators=dict(**handle_indicators(ma)), - symbol=f"{symbol} historical data", - prepost=prepost, + if len(data) == 0: + raise ValueError("No data was found in the DataFrame.") + + data = data.drop_duplicates(keep="first") + + for col in cols: + if col in data.columns and data[col].notnull().any(): + df[col.replace("_", " ").title() if col != "ytd" else col.upper()] = data[ + col + ].apply(lambda x: round(x * 100, 4) if x is not None else None) + + if df.empty: + raise ValueError(f"No columns matching, {cols}, were found in the data.") + + chart_df = df.T + chart_cols = chart_df.columns.to_list() + + if "limit" in kwargs and isinstance(kwargs.get("limit"), int): + limit = kwargs.pop("limit", 10) + chart_df = chart_df.head(limit) # type: ignore + + layout_kwargs: Dict[str, Any] = kwargs["layout_kwargs"] if "layout_kwargs" in kwargs else {} # type: ignore + + title = ( + f"{kwargs.pop('title')}" if "title" in kwargs else "Equity Price Performance" ) + orientation = ( + kwargs.pop("orientation") + if "orientation" in kwargs and kwargs.get("orientation") is not None + else "v" + ) + + ytitle = "Performance (%)" + xtitle = None + + if orientation == "h": + xtitle = ytitle # type: ignore + ytitle = None # type: ignore + + fig = bar_chart( + chart_df.reset_index(), + x="index", + y=chart_cols, + title=title, + xtitle=xtitle, + ytitle=ytitle, + orientation=orientation, # type: ignore + ) + fig.update_traces( + hovertemplate=( + "%{fullData.name}:%{y:.2f}%" + if orientation == "v" + else "%{fullData.name}:%{x:.2f}%" + ) + ) + + fig.update_layout(**layout_kwargs) + content = fig.show(external=True).to_plotly_json() # type: ignore + + return fig, content + + +def etf_price_performance( + **kwargs, +) -> Tuple[Union[OpenBBFigure, Figure], Dict[str, Any]]: + """ETF Historical Chart.""" + fig, content = equity_price_performance(**kwargs) + if "title" in kwargs and kwargs.get("title") is not None: + fig.set_title(kwargs.get("title")) # type: ignore + else: + fig.set_title("ETF Price Performance") # type: ignore + + content = fig.show(external=True).to_plotly_json() # type: ignore + return fig, content + + +def etf_holdings(**kwargs) -> Tuple[Union[OpenBBFigure, Figure], Dict[str, Any]]: + """Equity Compare Groups Chart.""" + + if "data" in kwargs and isinstance(kwargs["data"], pd.DataFrame): + data = kwargs["data"] + elif "data" in kwargs and isinstance(kwargs["data"], list): + data = basemodel_to_df(kwargs["data"], index=None) # type: ignore + else: + data = basemodel_to_df(kwargs["obbject_item"], index=None) # type: ignore + + if "weight" not in data.columns: + raise ValueError("No 'weight' column found in the data.") + + orientation = kwargs.get("orientation", "h") + limit = kwargs.get("limit", 20) + symbol = kwargs["standard_params"].get("symbol") # type: ignore + title = kwargs.get("title", f"Top {limit} {symbol} Holdings") + layout_kwargs = kwargs.get("layout_kwargs", {}) + + data = data.sort_values("weight", ascending=False) + limit = min(limit, len(data)) # type: ignore + target = data.head(limit)[["symbol", "weight"]].set_index("symbol") + target = target.multiply(100) + axis_title = "Weight (%)" + + fig = bar_chart( + target.reset_index(), + "symbol", + ["weight"], + title=title, # type: ignore + xtitle=axis_title if orientation == "h" else None, + ytitle=axis_title if orientation == "v" else None, + orientation=orientation, # type: ignore + ) + + fig.update_layout( + hovermode="x" if orientation == "v" else "y", + margin=dict(r=0, l=50) if orientation == "h" else None, + ) + + fig.update_traces( + hovertemplate=( + "%{y:.3f}%" + if orientation == "v" + else "%{x:.3f}%" + ) + ) + + if layout_kwargs: + fig.update_layout(**layout_kwargs) # type: ignore + + content = fig.show(external=True).to_plotly_json() # type: ignore + + return fig, content + + +def equity_price_historical( # noqa: PLR0912 + **kwargs, +) -> Tuple[OpenBBFigure, Dict[str, Any]]: + """Equity Price Historical Chart.""" + + if "data" in kwargs and isinstance(kwargs["data"], pd.DataFrame): + data = kwargs["data"] + elif "data" in kwargs and isinstance(kwargs["data"], list): + data = basemodel_to_df(kwargs["data"], index=kwargs.get("index", "date")) # type: ignore + else: + data = basemodel_to_df( + kwargs["obbject_item"], index=kwargs.get("index", "date") # type: ignore + ) + + if "date" in data.columns: + data = data.set_index("date") + + target = str(kwargs.get("target")) + normalize = kwargs.get("normalize") is True + returns = kwargs.get("returns") is True + same_axis = kwargs.get("same_axis") is True + text_color = "black" if ChartStyle().plt_style == "light" else "white" + title = f"{kwargs.get('title')}" if "title" in kwargs else "Historical Prices" + y1title = "" + y2title = "" + candles = True + multi_symbol = ( + bool(kwargs.get("multi_symbol") is True) + or ( + "symbol" in data.columns + and target in data.columns + and len(data.symbol.unique()) > 1 + ) + or ("target" in kwargs and kwargs.get("target") is not None) + or "symbol" in data.columns + or ( + "symbol" not in data.columns + and bool(data.columns.isin(["open", "high", "low", "close"]).all()) + ) + ) + target = "close" if target is None or target == "None" or target == "" else target + + if multi_symbol is True: + if "symbol" not in data.columns and target in data.columns: + data = data[[target]] + y1title = target.title() + if "symbol" in data.columns and target in data.columns: + data = data.pivot(columns="symbol", values=target) + y1title = target + title = f"Historical {target.title()}" + + indicators = kwargs.get("indicators", {}) + candles = bool(~data.columns.isin(["open", "high", "low", "close"]).all()) + candles = candles if kwargs.get("candles", True) else False + volume = kwargs.get("volume", True) if "volume" in data.columns else False + + if normalize is True: + if "symbol" not in data.columns and target in data.columns: + data = data[[target]] + multi_symbol = True + candles = False + volume = False + + if returns is True: + if "symbol" not in data.columns and target in data.columns: + data = data[[target]] + multi_symbol = True + candles = False + volume = False + if ( # pylint: disable = R0916 + multi_symbol is False + and normalize is False + and returns is False + and candles is True + ) or (indicators and multi_symbol is False): + if ( + "heikin_ashi" in kwargs + and kwargs["heikin_ashi"] is True + and candles is True + ): + data = heikin_ashi(data) + title = f"{title} - Heikin Ashi" + _volume = False + if "atr" in indicators: # type: ignore + _volume = volume + volume = False + ta = PlotlyTA() + fig = ta.plot( # type: ignore + data, + indicators=indicators if indicators else {}, # type: ignore + symbol=target if candles is False else "", + candles=candles, + volume=volume, # type: ignore + ) + if _volume is True and "atr" in indicators: # type: ignore + fig.add_inchart_volume(data) + fig.update_layout( + paper_bgcolor="rgba(0,0,0,0)", + plot_bgcolor="rgba(0,0,0,0)", + font=dict(color=text_color), + showlegend=True, + legend=dict( + orientation="v", + yanchor="top", + xanchor="right", + y=0.95, + x=-0.01, + xref="paper", + font=dict(size=12), + bgcolor="rgba(0,0,0,0)", + ), + xaxis=dict( + ticklen=0, + showgrid=True, + gridcolor="rgba(128,128,128,0.3)", + zeroline=True, + mirror=True, + showline=True, + ), + xaxis2=dict( + ticklen=0, + showgrid=True, + gridcolor="rgba(128,128,128,0.3)", + zeroline=True, + mirror=True, + showline=True, + ), + yaxis=dict( + ticklen=0, + showgrid=True, + gridcolor="rgba(128,128,128,0.3)", + zeroline=True, + mirror=True, + showline=True, + tickfont=dict(size=14), + ), + yaxis2=dict( + ticklen=0, + gridcolor="rgba(128,128,128,0.3)", + ), + yaxis3=dict( + ticklen=0, + gridcolor="rgba(128,128,128,0.3)", + ), + dragmode="pan", + hovermode="x", + ) + + if kwargs.get("title"): + title = kwargs["title"] + fig.update_layout(title=dict(text=title, x=0.5)) + + content = fig.to_plotly_json() + + return fig, content + + if multi_symbol is True or candles is False: + + if "symbol" not in data.columns and target in data.columns: + data = data[[target]] + + if "symbol" in data.columns: + data = data.pivot(columns="symbol", values=target) + + title: str = kwargs.get("title", "Historical Prices") # type: ignore + + y1title = data.iloc[:, 0].name + y2title = "" + + if len(data.columns) > 2 or normalize is True or returns is True: + if returns is True or (len(data.columns) > 2 and normalize is False): + data = data.apply(calculate_returns) + title = f"{title} - Cumulative Returns" + y1title = "Percent" + if normalize is True: + if returns is True: + title = f"{title.replace(' - Cumulative Returns', '')} - Normalized Cumulative Returns" + else: + title = title + " - Normalized" + data = data.apply(z_score_standardization) + y1title = None # type: ignore + y2title = None # type: ignore + + fig = OpenBBFigure() + + for i, col in enumerate(data.columns): + + hovertemplate = f"{data[col].name}: %{{y}}" + yaxis = "y1" + if y1title and y1title != "Percent": + yaxis = ( + ( + "y1" + if should_share_axis(data, col, y1title) # type: ignore + or col == y1title + or normalize is True + or returns is True + else "y2" + ) + if same_axis is False + else "y1" + ) + + if yaxis == "y2": + y2title = data[col].name + + fig.add_scatter( + x=data.index, + y=data[col], + name=data[col].name, + mode="lines", + hovertemplate=hovertemplate, + line=dict(width=1, color=LARGE_CYCLER[i % len(LARGE_CYCLER)]), + yaxis=yaxis, + ) + + if normalize is True or returns is True: + y1title = "Percent" if returns is True else None # type: ignore + y2title = None # type: ignore + + if same_axis is True: + y1title = None # type: ignore + y2title = None # type: ignore + + fig.update_layout( + paper_bgcolor="rgba(0,0,0,0)", + plot_bgcolor="rgba(0,0,0,0)", + legend=( + dict( + orientation="v", + yanchor="top", + xanchor="right", + y=0.95, + x=-0.01, + bgcolor="rgba(0,0,0,0)", + ) + if len(data.columns) > 2 + else dict( + orientation="h", + yanchor="bottom", + xanchor="right", + y=1.02, + x=0.98, + bgcolor="rgba(0,0,0,0)", + ) + ), + yaxis1=( + dict( + side="right", + ticklen=0, + showgrid=True, + showline=True, + mirror=True, + gridcolor="rgba(128,128,128,0.3)", + title=dict( + text=y1title if y1title else None, standoff=20, font=dict(size=20) + ), + tickfont=dict(size=14), + anchor="x", + ) + ), + yaxis2=( + dict( + overlaying="y", + side="left", + ticklen=0, + showgrid=False, + title=dict( + text=y2title if y2title else None, standoff=10, font=dict(size=20) + ), + tickfont=dict(size=14), + anchor="x", + ) + if y2title + else None + ), + xaxis=dict( + ticklen=0, + showgrid=True, + gridcolor="rgba(128,128,128,0.3)", + showline=True, + mirror=True, + ), + margin=dict(l=20, r=20, b=20, t=20), + dragmode="pan", + hovermode="x", + ) + if kwargs.get("title"): + title = kwargs["title"] + fig.update_layout(title=dict(text=title, x=0.5)) + content = fig.show(external=True).to_plotly_json() return fig, content -def _ta_ma(ma_type: str, **kwargs): - """Plot moving average helper.""" - data = basemodel_to_df(kwargs["obbject_item"], index=kwargs.get("index", "date")) - window = kwargs.get("window", 50) - offset = kwargs.get("offset", 0) - symbol = kwargs.get("symbol", "") +def etf_historical(**kwargs) -> Tuple[OpenBBFigure, Dict[str, Any]]: + """ETF Historical Chart.""" + return equity_price_historical(**kwargs) - ta = PlotlyTA() - fig = ta.plot( - data, - {f"{ma_type.lower()}": dict(length=window, offset=offset)}, - f"{symbol.upper()} {ma_type.upper()}", - False, - volume=False, + +def index_price_historical(**kwargs) -> Tuple[OpenBBFigure, Dict[str, Any]]: + """Index Price Historical Chart.""" + return equity_price_historical(**kwargs) + + +def currency_price_historical(**kwargs) -> Tuple[OpenBBFigure, Dict[str, Any]]: + """Currency Price Historical Chart.""" + return equity_price_historical(**kwargs) + + +def crypto_price_historical(**kwargs) -> Tuple[OpenBBFigure, Dict[str, Any]]: + """Crypto Price Historical Chart.""" + return equity_price_historical(**kwargs) + + +def _ta_ma(**kwargs): + """Plot moving average helper.""" + + index = ( + kwargs.get("index") + if "index" in kwargs and kwargs.get("index") is not None + else "date" + ) + data = kwargs.get("data") + ma_type = ( + kwargs["ma_type"] + if "ma_type" in kwargs and kwargs.get("ma_type") is not None + else "sma" + ) + ma_types = ma_type.split(",") if isinstance(ma_type, str) else ma_type + + if isinstance(data, pd.DataFrame) and not data.empty: + data = data.set_index(index) if index in data.columns else data + + if data is None: + data = basemodel_to_df(kwargs["obbject_item"], index=index) + + if isinstance(data, list): + data = basemodel_to_df(data, index=index) + + window = ( + kwargs.get("length", []) + if "length" in kwargs and kwargs.get("length") is not None + else [50] + ) + offset = kwargs.get("offset", 0) + target = ( + kwargs.get("target") + if "target" in kwargs and kwargs.get("target") is not None + else "close" + ) + + if target not in data.columns and "close" in data.columns: + target = "close" + + if target not in data.columns and "close" not in data.columns: + raise ValueError(f"Column '{target}', or 'close', not found in the data.") + + df = data.copy() + if target in data.columns: + df = df[[target]] + df.columns = ["close"] + title = ( + kwargs.get("title") + if "title" in kwargs and kwargs.get("title") is not None + else f"{ma_type.upper()}" + ) + + fig = OpenBBFigure() + fig = fig.create_subplots( + 1, + 1, + shared_xaxes=True, + vertical_spacing=0.06, + horizontal_spacing=0.01, + row_width=[1], + specs=[[{"secondary_y": True}]], ) fig.update_layout(ChartStyle().plotly_template.get("layout", {})) + + ma_df = pd.DataFrame() + window = [window] if isinstance(window, int) else window + for w in window: + for ma_type in ma_types: + ma_df[f"{ma_type.upper()} {w}"] = getattr(df.ta, ma_type)( + length=w, offset=offset + ) + + if kwargs.get("dropnan") is True: + ma_df = ma_df.dropna() + data = data.iloc[-len(ma_df) :] + + color = 0 + + if ( + "candles" in kwargs + and kwargs.get("candles") is True + and kwargs.get("target") is None + ): + volume = kwargs.get("volume") is True + fig, _ = to_chart(data, candles=True, volume=volume) + + else: + ma_df[f"{target}".title()] = data[target] + + for col in ma_df.columns: + name = col.replace("_", " ") + fig.add_scatter( + x=ma_df.index, + y=ma_df[col], + name=name, + mode="lines", + hovertemplate=f"{name}: %{{y}}", + line=dict(width=1, color=LARGE_CYCLER[color]), + showlegend=True, + ) + color += 1 + + fig.update_layout( + title=dict(text=title, x=0.5, font=dict(size=16)), + paper_bgcolor="rgba(0,0,0,0)", + plot_bgcolor="rgba(0,0,0,0)", + showlegend=True, + legend=dict( + orientation="h", + yanchor="bottom", + xanchor="right", + y=1.02, + x=0.95, + bgcolor="rgba(0,0,0,0)", + ), + xaxis=dict( + ticklen=0, + showgrid=True, + gridcolor="rgba(128,128,128,0.3)", + zeroline=True, + mirror=True, + ), + yaxis=dict( + ticklen=0, + showgrid=True, + gridcolor="rgba(128,128,128,0.3)", + zeroline=True, + mirror=True, + autorange=True, + ), + ) + content = fig.show(external=True).to_plotly_json() return fig, content -def technical_zlma(**kwargs) -> Tuple["OpenBBFigure", Dict[str, Any]]: +def technical_sma(**kwargs) -> Tuple[OpenBBFigure, Dict[str, Any]]: + """Plot simple moving average chart.""" + if "ma_type" not in kwargs: + kwargs["ma_type"] = "sma" + return _ta_ma(**kwargs) + + +def technical_ema(**kwargs) -> Tuple[OpenBBFigure, Dict[str, Any]]: + """Exponential moving average chart.""" + if "ma_type" not in kwargs: + kwargs["ma_type"] = "ema" + return _ta_ma(**kwargs) + + +def technical_hma(**kwargs) -> Tuple[OpenBBFigure, Dict[str, Any]]: + """Hull moving average chart.""" + if "ma_type" not in kwargs: + kwargs["ma_type"] = "hma" + return _ta_ma(**kwargs) + + +def technical_wma(**kwargs) -> Tuple[OpenBBFigure, Dict[str, Any]]: + """Weighted moving average chart.""" + if "ma_type" not in kwargs: + kwargs["ma_type"] = "wma" + return _ta_ma(**kwargs) + + +def technical_zlma(**kwargs) -> Tuple[OpenBBFigure, Dict[str, Any]]: """Zero lag moving average chart.""" - ma_type = "zlma" - return _ta_ma(ma_type, **kwargs) + if "ma_type" not in kwargs: + kwargs["ma_type"] = "zlma" + return _ta_ma(**kwargs) -def technical_aroon(**kwargs) -> Tuple["OpenBBFigure", Dict[str, Any]]: - """Aroon chart.""" - data = basemodel_to_df(kwargs["obbject_item"], index=kwargs.get("index", "date")) +def technical_aroon(**kwargs) -> Tuple[OpenBBFigure, Dict[str, Any]]: + """Technical Aroon Chart.""" + + if "data" in kwargs and isinstance(kwargs["data"], pd.DataFrame): + data = kwargs["data"] + else: + data = basemodel_to_df( + kwargs["obbject_item"], index=kwargs.get("index", "date") + ) + + if "date" in data.columns: + data = data.set_index("date") + + if "symbol" in data.columns and len(data.symbol.unique()) > 1: + raise ValueError( + "Please provide data with only one symbol and columns for OHLC." + ) + + symbol = kwargs.get("symbol", "") + + volume = kwargs.get("volume") is True + title = f"Aroon Indicator & Oscillator {symbol}" + length = kwargs.get("length", 25) scalar = kwargs.get("scalar", 100) symbol = kwargs.get("symbol", "") ta = PlotlyTA() - fig = ta.plot( + fig = ta.plot( # type: ignore data, dict(aroon=dict(length=length, scalar=scalar)), - f"Aroon on {symbol}", + title, False, - volume=False, + volume=volume, ) + content = fig.show(external=True).to_plotly_json() return fig, content -def technical_sma(**kwargs) -> Tuple["OpenBBFigure", Dict[str, Any]]: - """Plot simple moving average chart.""" - ma_type = "sma" - return _ta_ma(ma_type, **kwargs) - - -def technical_macd(**kwargs) -> Tuple["OpenBBFigure", Dict[str, Any]]: +def technical_macd(**kwargs) -> Tuple[OpenBBFigure, Dict[str, Any]]: """Plot moving average convergence divergence chart.""" - data = basemodel_to_df(kwargs["obbject_item"], index=kwargs.get("index", "date")) + + if "data" in kwargs and isinstance(kwargs["data"], pd.DataFrame): + data = kwargs["data"] + else: + data = basemodel_to_df( + kwargs["obbject_item"], index=kwargs.get("index", "date") + ) + + if "date" in data.columns: + data = data.set_index("date") + + if "symbol" in data.columns and len(data.symbol.unique()) > 1: + raise ValueError( + "Please provide data with only one symbol and columns for OHLC." + ) + fast = kwargs.get("fast", 12) slow = kwargs.get("slow", 26) signal = kwargs.get("signal", 9) symbol = kwargs.get("symbol", "") + title = f"{symbol.upper()} MACD" + volume = kwargs.get("volume") is True + ta = PlotlyTA() - fig = ta.plot( + fig = ta.plot( # type: ignore data, dict(macd=dict(fast=fast, slow=slow, signal=signal)), - f"{symbol.upper()} MACD", + title, False, - volume=False, + volume=volume, ) content = fig.show(external=True).to_plotly_json() return fig, content -def technical_hma(**kwargs) -> Tuple["OpenBBFigure", Dict[str, Any]]: - """Hull moving average chart.""" - ma_type = "hma" - return _ta_ma(ma_type, **kwargs) - - -def technical_adx(**kwargs) -> Tuple["OpenBBFigure", Dict[str, Any]]: +def technical_adx(**kwargs) -> Tuple[OpenBBFigure, Dict[str, Any]]: """Average directional movement index chart.""" - data = basemodel_to_df(kwargs["obbject_item"], index=kwargs.get("index", "date")) + + if "data" in kwargs and isinstance(kwargs["data"], pd.DataFrame): + data = kwargs["data"] + else: + data = basemodel_to_df( + kwargs["obbject_item"], index=kwargs.get("index", "date") + ) + + if "date" in data.columns: + data = data.set_index("date") + + if "symbol" in data.columns and len(data.symbol.unique()) > 1: + raise ValueError( + "Please provide data with only one symbol and columns for OHLC." + ) + length = kwargs.get("length", 14) scalar = kwargs.get("scalar", 100.0) drift = kwargs.get("drift", 1) symbol = kwargs.get("symbol", "") ta = PlotlyTA() - fig = ta.plot( + fig = ta.plot( # type: ignore data, dict(adx=dict(length=length, scalar=scalar, drift=drift)), f"Average Directional Movement Index (ADX) {symbol}", @@ -151,22 +799,31 @@ def technical_adx(**kwargs) -> Tuple["OpenBBFigure", Dict[str, Any]]: return fig, content -def technical_wma(**kwargs) -> Tuple["OpenBBFigure", Dict[str, Any]]: - """Weighted moving average chart.""" - ma_type = "wma" - return _ta_ma(ma_type, **kwargs) - - -def technical_rsi(**kwargs) -> Tuple["OpenBBFigure", Dict[str, Any]]: +def technical_rsi(**kwargs) -> Tuple[OpenBBFigure, Dict[str, Any]]: """Relative strength index chart.""" - data = basemodel_to_df(kwargs["obbject_item"], index=kwargs.get("index", "date")) + + if "data" in kwargs and isinstance(kwargs["data"], pd.DataFrame): + data = kwargs["data"] + else: + data = basemodel_to_df( + kwargs["obbject_item"], index=kwargs.get("index", "date") + ) + + if "date" in data.columns: + data = data.set_index("date") + + if "symbol" in data.columns and len(data.symbol.unique()) > 1: + raise ValueError( + "Please provide data with only one symbol and columns for OHLC." + ) + window = kwargs.get("window", 14) scalar = kwargs.get("scalar", 100.0) drift = kwargs.get("drift", 1) symbol = kwargs.get("symbol", "") ta = PlotlyTA() - fig = ta.plot( + fig = ta.plot( # type: ignore data, dict(rsi=dict(length=window, scalar=scalar, drift=drift)), f"{symbol.upper()} RSI {window}", @@ -178,15 +835,7 @@ def technical_rsi(**kwargs) -> Tuple["OpenBBFigure", Dict[str, Any]]: return fig, content -def technical_ema(**kwargs) -> Tuple["OpenBBFigure", Dict[str, Any]]: - """Exponential moving average chart.""" - ma_type = "ema" - return _ta_ma(ma_type, **kwargs) - - -def technical_cones( - **kwargs: TechnicalConesChartQueryParams, -) -> Tuple["OpenBBFigure", Dict[str, Any]]: +def technical_cones(**kwargs) -> Tuple[OpenBBFigure, Dict[str, Any]]: """Volatility Cones Chart.""" data = kwargs.get("data") @@ -264,6 +913,11 @@ def technical_cones( ), yaxis=dict( ticklen=0, + showgrid=True, + showline=True, + mirror=True, + zeroline=False, + gridcolor="rgba(128,128,128,0.3)", ), xaxis=dict( type="category", @@ -273,6 +927,8 @@ def technical_cones( ticktext=df_ta.index, title_text="Period", showgrid=False, + showline=True, + mirror=True, zeroline=False, ), margin=dict(l=20, r=20, b=20), @@ -284,9 +940,9 @@ def technical_cones( return fig, content -def economy_fred_series( - **kwargs: Union[Any, FredSeriesChartQueryParams], -) -> Tuple["OpenBBFigure", Dict[str, Any]]: +def economy_fred_series( # noqa: PLR0912 + **kwargs, +) -> Tuple[OpenBBFigure, Dict[str, Any]]: """FRED Series Chart.""" ytitle_dict = { "chg": "Change", @@ -299,20 +955,6 @@ def economy_fred_series( "log": "Natural Log", } - colors = [ - "#1f77b4", - "#7f7f7f", - "#ff7f0e", - "#2ca02c", - "#d62728", - "#9467bd", - "#8c564b", - "#e377c2", - "#7f7f7f", - "#bcbd22", - "#17becf", - ] - provider = kwargs.get("provider") if provider != "fred": @@ -352,21 +994,12 @@ def economy_fred_series( if df_ta.empty or len(df_ta) < 2: raise ValueError( "No data is left after dropping NaN values. Try setting `dropnan = False`," - + " or use the `frequency` parameter on request ." + + " or use the `frequency` parameter on request." ) columns = df_ta.columns.to_list() - def z_score_standardization(data: pd.Series) -> pd.Series: - """Z-Score Standardization Method.""" - return (data - data.mean()) / data.std() - - if normalize: - df_ta = df_ta.apply(z_score_standardization) - - # Extract the metadata from the warnings. - warnings = kwargs.get("warnings") - metadata = json.loads(warnings[0].message) if warnings else {} # type: ignore + metadata = kwargs["extra"].get("results_metadata", {}) # type: ignore # Check if the request was transformed by the FRED API. params = kwargs["extra_params"] if kwargs.get("extra_params") else {} @@ -374,8 +1007,23 @@ def economy_fred_series( # Get a unique list of all units of measurement in the DataFrame. y_units = list({metadata.get(col).get("units") for col in columns if col in metadata}) # type: ignore + if has_params is True and not y_units: + y_units = [ytitle_dict.get(params.transform)] # type: ignore - if len(y_units) > 2 and has_params is False and allow_unsafe is True: + if normalize or ( + kwargs.get("bar") is True + and len(y_units) > 1 + and ( + has_params is False + or not any( + i in params.transform for i in ["pc1", "pch", "pca", "cch", "cca", "log"] # type: ignore + ) + ) + ): + normalize = True + df_ta = df_ta.apply(z_score_standardization) + + if len(y_units) > 2 and has_params is False and allow_unsafe is False: raise RuntimeError( "This method supports up to 2 y-axis units." + " Please use the 'transform' parameter, in the data request," @@ -386,7 +1034,7 @@ def economy_fred_series( y1_units = y_units[0] if y_units else None y1title = y1_units y2title = y_units[1] if len(y_units) > 1 else None - xtitle = "" + xtitle = str(kwargs.get("xtitle", "")) # If the request was transformed, the y-axis will be shared under these conditions. if has_params and any( @@ -398,9 +1046,9 @@ def economy_fred_series( # Set the title for the chart. title: str = "" if isinstance(kwargs, dict) and title in kwargs: - title = kwargs["title"] + title = kwargs["title"] # type: ignore else: - if metadata.get(columns[0]): + if metadata.get(columns[0]): # type: ignore title = metadata.get(columns[0]).get("title") if len(columns) == 1 else "FRED Series" # type: ignore else: title = "FRED Series" @@ -410,12 +1058,39 @@ def economy_fred_series( # Define this to use as a check. y3title: Optional[str] = "" + if kwargs.get("plot_bar") is True or len(df_ta.index) < 100: + margin = dict(l=10, r=5, b=75 if xtitle else 30) + try: + if normalize: + y1title = None + title = f"{title} - Normalized" if title else "Normalized" + bar_mode = kwargs["barmode"] if "barmode" in kwargs else "group" + fig = bar_chart( + df_ta.reset_index(), + "date", + df_ta.columns.to_list(), + title=title, + xtitle=xtitle, + ytitle=y1title, + barmode=bar_mode, # type: ignore + layout_kwargs=dict(margin=margin), # type: ignore + ) + if kwargs.get("layout_kwargs"): + fig.update_layout(kwargs.get("layout_kwargs")) + + if kwargs.get("title"): + fig.set_title(str(kwargs.get("title"))) # type: ignore + + content = fig.to_plotly_json() + + return fig, content # type: ignore + except Exception as _: + warn("Bar chart failed. Attempting line chart.") + # Create the figure object with subplots. fig = OpenBBFigure().create_subplots( rows=1, cols=1, shared_xaxes=True, shared_yaxes=False ) - fig.update_layout(ChartStyle().plotly_template.get("layout", {})) - text_color = "black" if ChartStyle().plt_style == "light" else "white" # For each series in the DataFrame, add a scatter plot. for i, col in enumerate(df_ta.columns): @@ -423,27 +1098,29 @@ def economy_fred_series( # Check if the y-axis should be shared for this series. on_y1 = ( ( - metadata.get(col).get("units") == y1_units + metadata.get(col).get("units") == y1_units # type: ignore or y2title is None # type: ignore + or kwargs.get("same_axis") is True ) - if metadata.get(col) + if metadata.get(col) # type: ignore else False ) if normalize: on_y1 = True + yaxes = "y2" if not on_y1 else "y1" - on_y3 = not metadata.get(col) and normalize is False + on_y3 = not metadata.get(col) and normalize is False # type: ignore if on_y3: yaxes = "y3" - y3title = df_ta[col].name + y3title = df_ta[col].name # type: ignore fig.add_scatter( x=df_ta.index, y=df_ta[col], name=df_ta[col].name, mode="lines", hovertemplate=f"{df_ta[col].name}: %{{y}}", - line=dict(width=1, color=colors[i % len(colors)]), - yaxis=yaxes, + line=dict(width=1, color=LARGE_CYCLER[i % len(LARGE_CYCLER)]), + yaxis="y1" if kwargs.get("same_axis") is True else yaxes, ) # Set the y-axis titles, if supplied. @@ -466,22 +1143,25 @@ def economy_fred_series( title=dict(text=title, x=0.5, font=dict(size=16)), paper_bgcolor="rgba(0,0,0,0)", plot_bgcolor="rgba(0,0,0,0)", - font=dict(color=text_color), legend=dict( orientation="h", yanchor="bottom", xanchor="right", y=1.02, - x=1, + x=0.95, bgcolor="rgba(0,0,0,0)", + font=dict(size=12), ), yaxis=( dict( ticklen=0, side="right", - title=dict(text=y1title, standoff=30, font=dict(size=18)), + showline=True, + mirror=True, + title=dict(text=y1title, standoff=30, font=dict(size=16)), tickfont=dict(size=14), anchor="x", + gridcolor="rgba(128,128,128,0.3)", ) if y1title else None @@ -493,7 +1173,7 @@ def economy_fred_series( ticklen=0, showgrid=False, title=dict( - text=y2title if y2title else None, standoff=10, font=dict(size=18) + text=y2title if y2title else None, standoff=10, font=dict(size=16) ), tickfont=dict(size=14), anchor="x", @@ -514,7 +1194,7 @@ def economy_fred_series( if y3title else None ), - tickfont=dict(size=12, color="rgba(128,128,128,0.75)"), + tickfont=dict(size=12, color="rgba(128,128,128,0.9)"), anchor="free", ) if y3title @@ -522,17 +1202,93 @@ def economy_fred_series( ), xaxis=dict( ticklen=0, - showgrid=False, + showgrid=True, + showline=True, + mirror=True, title=( - dict(text=xtitle, standoff=30, font=dict(size=18)) if xtitle else None + dict(text=xtitle, standoff=30, font=dict(size=16)) if xtitle else None ), + gridcolor="rgba(128,128,128,0.3)", domain=[0.095, 0.95] if y3title else None, ), - margin=dict(r=25, l=25) if normalize is False else None, + margin=dict(r=25, l=25, b=75 if xtitle else 30) if normalize is False else None, autosize=True, dragmode="pan", ) - + if kwargs.get("layout_kwargs"): + fig.update_layout(kwargs.get("layout_kwargs")) + if kwargs.get("title"): + fig.set_title(str(kwargs.get("title"))) content = fig.to_plotly_json() return fig, content + + +def technical_relative_rotation( + **kwargs: Any, +) -> Tuple["OpenBBFigure", Dict[str, Any]]: + """Relative Rotation Chart.""" + + ratios_df = basemodel_to_df(kwargs["obbject_item"].rs_ratios, index="date") # type: ignore + momentum_df = basemodel_to_df(kwargs["obbject_item"].rs_momentum, index="date") # type: ignore + benchmark_symbol = kwargs["obbject_item"].benchmark # type: ignore + study = kwargs.get("study", None) + study = str(kwargs["obbject_item"].study) if study is None else str(study) + show_tails = kwargs.get("show_tails") + show_tails = True if show_tails is None else show_tails + tail_periods = int(kwargs.get("tail_periods")) if "tail_periods" in kwargs else 16 # type: ignore + tail_interval = str(kwargs.get("tail_interval")) if "tail_interval" in kwargs else "week" # type: ignore + date = kwargs.get("date") if "date" in kwargs else None # type: ignore + show_tails = False if date is not None else show_tails + if ratios_df.empty or momentum_df.empty: + raise RuntimeError("Error: No data to plot.") + + if show_tails is True: + fig = relative_rotation.create_rrg_with_tails( + ratios_df, momentum_df, study, benchmark_symbol, tail_periods, tail_interval # type: ignore + ) + + if show_tails is False: + fig = relative_rotation.create_rrg_without_tails( + ratios_df, momentum_df, benchmark_symbol, study, date # type: ignore + ) + + figure = OpenBBFigure(fig) + font_color = "black" if ChartStyle().plt_style == "light" else "white" + figure.update_layout( + paper_bgcolor="rgba(0,0,0,0)", + plot_bgcolor="rgba(255,255,255,1)", + font=dict(color=font_color), + yaxis=dict( + showgrid=True, + gridcolor="rgba(128,128,128,0.3)", + side="left", + showline=True, + zeroline=True, + mirror=True, + ticklen=0, + tickfont=dict(size=14), + titlefont=dict(size=16), + ), + xaxis=dict( + showgrid=True, + gridcolor="rgba(128,128,128,0.3)", + showline=True, + zeroline=True, + mirror=True, + ticklen=0, + tickfont=dict(size=14), + titlefont=dict(size=16), + hoverformat="", + ), + hoverlabel=dict( + font_size=12, + ), + hovermode="x", + hoverdistance=50, + ) + if kwargs.get("title") is not None: + figure.set_title(str(kwargs.get("title"))) + content = figure.to_plotly_json() + + return figure, content diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/core/__init__.py b/openbb_platform/obbject_extensions/charting/openbb_charting/core/__init__.py index e69de29bb2d..91c890e79c2 100644 --- a/openbb_platform/obbject_extensions/charting/openbb_charting/core/__init__.py +++ b/openbb_platform/obbject_extensions/charting/openbb_charting/core/__init__.py @@ -0,0 +1 @@ +"""OpenBB Charting core.""" diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/core/backend.py b/openbb_platform/obbject_extensions/charting/openbb_charting/core/backend.py index 2307f3993fc..79d4c56e18b 100644 --- a/openbb_platform/obbject_extensions/charting/openbb_charting/core/backend.py +++ b/openbb_platform/obbject_extensions/charting/openbb_charting/core/backend.py @@ -74,6 +74,7 @@ class Backend(PyWry): max_retries: int = 30, proc_name: str = "OpenBB Terminal", ): + """Create a new instance of the backend.""" self.charting_settings = charting_settings has_version = hasattr(PyWry, "__version__") diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/core/config/__init__.py b/openbb_platform/obbject_extensions/charting/openbb_charting/core/config/__init__.py index e69de29bb2d..9997eeed1a7 100644 --- a/openbb_platform/obbject_extensions/charting/openbb_charting/core/config/__init__.py +++ b/openbb_platform/obbject_extensions/charting/openbb_charting/core/config/__init__.py @@ -0,0 +1 @@ +"""OpenBB Charting core configuration.""" diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/core/config/openbb_styles.py b/openbb_platform/obbject_extensions/charting/openbb_charting/core/config/openbb_styles.py index c3e60e66528..1872e689822 100644 --- a/openbb_platform/obbject_extensions/charting/openbb_charting/core/config/openbb_styles.py +++ b/openbb_platform/obbject_extensions/charting/openbb_charting/core/config/openbb_styles.py @@ -1,3 +1,5 @@ +"""OpenBB Charting Styles.""" + from typing import Any, List, Optional import pandas as pd @@ -35,10 +37,10 @@ PLT_CANDLESTICKS = dict( increasing=dict(line_color=PLT_STYLE_INCREASING, fillcolor=PLT_STYLE_INCREASING), decreasing=dict(line_color=PLT_STYLE_DECREASING, fillcolor=PLT_STYLE_DECREASING), ) -PLT_STYLE_INCREASING_GREEN = "#009600" -PLT_STYLE_DECREASING_RED = "#c80000" -PLT_FONT = dict(family="Fira Code", size=16) -PLOTLY_FONT = dict(family="Fira Code", size=18) +PLT_STYLE_INCREASING_GREEN = "#00ACFF" +PLT_STYLE_DECREASING_RED = "#e4003a" +PLT_FONT = dict(family="Arial", size=16) +PLOTLY_FONT = dict(family="Arial", size=16) PLT_COLORWAY = [ "#ffed00", @@ -153,8 +155,9 @@ def de_increasing_color_list( increasing_color: str = PLT_STYLE_INCREASING, decreasing_color: str = PLT_STYLE_DECREASING, ) -> List[str]: - """Makes a colorlist for decrease/increase if value in df_column - contains "{contains_str}" default is "-" + """Make a colorlist for decrease/increase if value in df_column. + + Contains "{contains_str}" default is "-" Parameters ---------- @@ -197,8 +200,10 @@ PLOTLY_THEME = dict( nticks=15, showline=True, showgrid=True, + ticklen=0, ), yaxis2=dict( + side="left", zeroline=False, fixedrange=False, anchor="x", @@ -207,8 +212,9 @@ PLOTLY_THEME = dict( nticks=6, tick0=0.5, title_standoff=10, - tickfont=dict(size=15), - showline=True, + tickfont=dict(size=12), + showline=False, + ticklen=0, ), yaxis3=dict( zeroline=False, @@ -219,8 +225,9 @@ PLOTLY_THEME = dict( nticks=6, tick0=0.5, title_standoff=10, - tickfont=dict(size=15), + tickfont=dict(size=12), showline=True, + ticklen=0, ), yaxis4=dict( zeroline=False, @@ -231,24 +238,53 @@ PLOTLY_THEME = dict( nticks=6, tick0=0.5, title_standoff=10, - tickfont=dict(size=15), + tickfont=dict(size=12), showline=True, + ticklen=0, ), xaxis=dict( showgrid=True, - zeroline=True, + zeroline=False, showline=True, rangeslider=dict(visible=False), tickfont=dict(size=16), title_standoff=20, + ticklen=0, + ), + xaxis2=dict( + showgrid=True, + zeroline=False, + showline=True, + rangeslider=dict(visible=False), + tickfont=dict(size=12), + title_standoff=20, + ticklen=0, + ), + xaxis3=dict( + showgrid=True, + zeroline=False, + showline=True, + rangeslider=dict(visible=False), + tickfont=dict(size=12), + title_standoff=20, + ticklen=0, + ), + xaxis4=dict( + showgrid=True, + zeroline=False, + showline=True, + rangeslider=dict(visible=False), + tickfont=dict(size=12), + title_standoff=20, + ticklen=0, ), legend=dict( - yanchor="top", - y=0.99, - xanchor="left", - font_size=15, - bgcolor="rgba(0, 0, 0, 0)", - x=0.01, + orientation="h", + yanchor="bottom", + y=1.02, + xanchor="right", + x=0.95, + font=dict(size=12), ), dragmode="pan", hovermode="x", diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/core/dummy_backend.py b/openbb_platform/obbject_extensions/charting/openbb_charting/core/dummy_backend.py index 2742185f768..8b584bff6aa 100644 --- a/openbb_platform/obbject_extensions/charting/openbb_charting/core/dummy_backend.py +++ b/openbb_platform/obbject_extensions/charting/openbb_charting/core/dummy_backend.py @@ -1,3 +1,5 @@ +"""Dummy backend for charting to avoid import errors.""" + import asyncio import warnings from queue import Queue @@ -52,7 +54,7 @@ class DummyBackend: return cls.instance def __init__(self, daemon: bool = True, max_retries: int = 30): - """Dummy init to avoid import errors.""" + """Use cummy init to avoid import errors.""" self.daemon = daemon self.max_retries = max_retries try: @@ -66,14 +68,14 @@ class DummyBackend: dotenv.set_key(SETTINGS_ENV_FILE, "PLOT_ENABLE_PYWRY", "0") def close(self, reset: bool = False): # pylint: disable=W0613 - pass + """Close the backend.""" def start(self, debug: bool = False): # pylint: disable=W0613 - pass + """Start the backend.""" def send_outgoing(self, outgoing: dict): - pass + """Send outgoing data to the backend.""" async def check_backend(self): - """Dummy check backend method to avoid errors and revert to browser.""" + """Check backend method to avoid errors and revert to browser.""" raise Exception diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/core/openbb_figure.py b/openbb_platform/obbject_extensions/charting/openbb_charting/core/openbb_figure.py index 32e5876817f..6d3315feee3 100644 --- a/openbb_platform/obbject_extensions/charting/openbb_charting/core/openbb_figure.py +++ b/openbb_platform/obbject_extensions/charting/openbb_charting/core/openbb_figure.py @@ -42,6 +42,8 @@ if TYPE_CHECKING: TimeSeriesT = TypeVar("TimeSeriesT", bound="TimeSeries") +pio.default_renderers = "notebook" + class OpenBBFigure(go.Figure): """Custom Figure class for OpenBB Terminal. @@ -84,6 +86,7 @@ class OpenBBFigure(go.Figure): plotlyjs_path: Path = PLOTLYJS_PATH def __init__(self, fig: Optional[go.Figure] = None, **kwargs) -> None: + """Initialize the OpenBBFigure.""" super().__init__() if fig: self.__dict__ = fig.__dict__ @@ -238,8 +241,7 @@ class OpenBBFigure(go.Figure): secondary_y: bool = False, **kwargs, ): - """ - Add a trend line to the figure. + """Add a trend line to the figure. Parameters ---------- @@ -291,8 +293,7 @@ class OpenBBFigure(go.Figure): row: int = 1, col: int = 1, ) -> None: - """ - Add a histogram with a curve and rug plot if desired. + """Add a histogram with a curve and rug plot if desired. Parameters ---------- @@ -560,8 +561,7 @@ class OpenBBFigure(go.Figure): legendrank: Optional[int] = None, **kwargs, ) -> None: - """ - Add a horizontal line with a legend label. + """Add a horizontal line with a legend label. Parameters ---------- @@ -598,8 +598,7 @@ class OpenBBFigure(go.Figure): legendrank: Optional[int] = None, **kwargs, ) -> None: - """ - Add a vertical line with a legend label. + """Add a vertical line with a legend label. Parameters ---------- @@ -667,8 +666,7 @@ class OpenBBFigure(go.Figure): def chart_volume_scaling( df_volume: pd.DataFrame, volume_ticks_x: int = 7 ) -> Dict[str, list]: - """ - Takes df_volume and returns volume_ticks, tickvals for chart volume scaling. + """Take df_volume and returns volume_ticks, tickvals for chart volume scaling. Parameters ---------- @@ -716,8 +714,7 @@ class OpenBBFigure(go.Figure): col: Optional[int] = 1, volume_ticks_x: int = 7, ) -> None: - """ - Add in-chart volume to a subplot. + """Add in-chart volume to a subplot. Parameters ---------- @@ -748,15 +745,18 @@ class OpenBBFigure(go.Figure): yaxis="y2", row=row, col=col, - opacity=0.7, + opacity=0.5, secondary_y=True, + showlegend=False, + hovertemplate="%{y}", ) ticksize = 13 - (self.subplots_kwargs["rows"] // 2) self.update_layout( yaxis2=dict( - fixedrange=True, + fixedrange=False, side="left", - nticks=10, + nticks=8, + autorange=False, range=vol_scale["range"], tickvals=vol_scale["ticks"], showgrid=False, @@ -846,8 +846,7 @@ class OpenBBFigure(go.Figure): export_image: Optional[Union[Path, str]] = "", **kwargs, ) -> "OpenBBFigure": - """ - Show the figure. + """Show the figure. Parameters ---------- @@ -1234,8 +1233,7 @@ class OpenBBFigure(go.Figure): def to_plotly_json( self, ndarray: bool = False, np_nan: bool = False ) -> Dict[str, Any]: - """ - Convert figure to a JSON representation as a Python dict. + """Convert figure to a JSON representation as a Python dict. Parameters ---------- diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/core/plotly.html b/openbb_platform/obbject_extensions/charting/openbb_charting/core/plotly.html index 0968c0a6998..6912deac3b6 100644 --- a/openbb_platform/obbject_extensions/charting/openbb_charting/core/plotly.html +++ b/openbb_platform/obbject_extensions/charting/openbb_charting/core/plotly.html @@ -4008,7 +4008,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho l-51.45-160.536h39.787l19.526,67.894c5.479,19.046,10.479,37.386,14.299,57.397h0.709c4.048-19.298,9.045-38.352,14.526-56.693 l20.487-68.598h38.599L427.518,380.583z`, width: 550, height: 550, transform: "translate(4, 0)" }, downloadImage: { path: "M22.71,6.29a1,1,0,0,0-1.42,0L20,7.59V2a1,1,0,0,0-2,0V7.59l-1.29-1.3a1,1,0,0,0-1.42,1.42l3,3a1,1,0,0,0,.33.21.94.94,0,0,0,.76,0,1,1,0,0,0,.33-.21l3-3A1,1,0,0,0,22.71,6.29ZM19,13a1,1,0,0,0-1,1v.38L16.52,12.9a2.79,2.79,0,0,0-3.93,0l-.7.7L9.41,11.12a2.85,2.85,0,0,0-3.93,0L4,12.6V7A1,1,0,0,1,5,6h8a1,1,0,0,0,0-2H5A3,3,0,0,0,2,7V19a3,3,0,0,0,3,3H17a3,3,0,0,0,3-3V14A1,1,0,0,0,19,13ZM5,20a1,1,0,0,1-1-1V15.43l2.9-2.9a.79.79,0,0,1,1.09,0l3.17,3.17,0,0L15.46,20Zm13-1a.89.89,0,0,1-.18.53L13.31,15l.7-.7a.77.77,0,0,1,1.1,0L18,17.21Z", width: 21, height: 21, transform: "translate(-2, -2)" } - }, $7 = { data: { candlestick: [{ decreasing: { fillcolor: "#e4003a", line: { color: "#e4003a" } }, increasing: { fillcolor: "#00ACFF", line: { color: "#00ACFF" } }, type: "candlestick" }] }, layout: { annotationdefaults: { showarrow: !1 }, autotypenumbers: "strict", colorway: ["#ffed00", "#ef7d00", "#e4003a", "#c13246", "#822661", "#48277c", "#005ca9", "#00aaff", "#9b30d9", "#af005f", "#5f00af", "#af87ff"], dragmode: "pan", font: { family: "Fira Code", size: 18 }, hoverlabel: { align: "left" }, mapbox: { style: "dark" }, hovermode: "x", legend: { bgcolor: "rgba(0, 0, 0, 0)", x: .01, xanchor: "left", y: .99, yanchor: "top", font: { size: 15 } }, paper_bgcolor: "#000000", plot_bgcolor: "#000000", xaxis: { automargin: !0, autorange: !0, rangeslider: { visible: !1 }, showgrid: !0, showline: !0, tickfont: { size: 14 }, zeroline: !1, tick0: 1, title: { standoff: 20 }, linecolor: "#F5EFF3", mirror: !0, ticks: "outside" }, yaxis: { anchor: "x", automargin: !0, fixedrange: !1, zeroline: !1, showgrid: !0, showline: !0, side: "right", tick0: .5, title: { standoff: 20 }, gridcolor: "#283442", linecolor: "#F5EFF3", mirror: !0, ticks: "outside" } } }, K7 = { data: { barpolar: [{ marker: { line: { color: "white", width: .5 }, pattern: { fillmode: "overlay", size: 10, solidity: .2 } }, type: "barpolar" }], bar: [{ error_x: { color: "#2a3f5f" }, error_y: { color: "#2a3f5f" }, marker: { line: { color: "white", width: .5 }, pattern: { fillmode: "overlay", size: 10, solidity: .2 } }, type: "bar" }], carpet: [{ aaxis: { endlinecolor: "#2a3f5f", gridcolor: "#C8D4E3", linecolor: "#C8D4E3", minorgridcolor: "#C8D4E3", startlinecolor: "#2a3f5f" }, baxis: { endlinecolor: "#2a3f5f", gridcolor: "#C8D4E3", linecolor: "#C8D4E3", minorgridcolor: "#C8D4E3", startlinecolor: "#2a3f5f" }, type: "carpet" }], choropleth: [{ colorbar: { outlinewidth: 0, ticks: "" }, type: "choropleth" }], contourcarpet: [{ colorbar: { outlinewidth: 0, ticks: "" }, type: "contourcarpet" }], contour: [{ colorbar: { outlinewidth: 0, ticks: "" }, colorscale: [[0, "#0d0887"], [.1111111111111111, "#46039f"], [.2222222222222222, "#7201a8"], [.3333333333333333, "#9c179e"], [.4444444444444444, "#bd3786"], [.5555555555555556, "#d8576b"], [.6666666666666666, "#ed7953"], [.7777777777777778, "#fb9f3a"], [.8888888888888888, "#fdca26"], [1, "#f0f921"]], type: "contour" }], heatmapgl: [{ colorbar: { outlinewidth: 0, ticks: "" }, colorscale: [[0, "#0d0887"], [.1111111111111111, "#46039f"], [.2222222222222222, "#7201a8"], [.3333333333333333, "#9c179e"], [.4444444444444444, "#bd3786"], [.5555555555555556, "#d8576b"], [.6666666666666666, "#ed7953"], [.7777777777777778, "#fb9f3a"], [.8888888888888888, "#fdca26"], [1, "#f0f921"]], type: "heatmapgl" }], heatmap: [{ colorbar: { outlinewidth: 0, ticks: "" }, colorscale: [[0, "#0d0887"], [.1111111111111111, "#46039f"], [.2222222222222222, "#7201a8"], [.3333333333333333, "#9c179e"], [.4444444444444444, "#bd3786"], [.5555555555555556, "#d8576b"], [.6666666666666666, "#ed7953"], [.7777777777777778, "#fb9f3a"], [.8888888888888888, "#fdca26"], [1, "#f0f921"]], type: "heatmap" }], histogram2dcontour: [{ colorbar: { outlinewidth: 0, ticks: "" }, colorscale: [[0, "#0d0887"], [.1111111111111111, "#46039f"], [.2222222222222222, "#7201a8"], [.3333333333333333, "#9c179e"], [.4444444444444444, "#bd3786"], [.5555555555555556, "#d8576b"], [.6666666666666666, "#ed7953"], [.7777777777777778, "#fb9f3a"], [.8888888888888888, "#fdca26"], [1, "#f0f921"]], type: "histogram2dcontour" }], histogram2d: [{ colorbar: { outlinewidth: 0, ticks: "" }, colorscale: [[0, "#0d0887"], [.1111111111111111, "#46039f"], [.2222222222222222, "#7201a8"], [.3333333333333333, "#9c179e"], [.4444444444444444, "#bd3786"], [.5555555555555556, "#d8576b"], [.6666666666666666, "#ed7953"], [.7777777777777778, "#fb9f3a"], [.8888888888888888, "#fdca26"], [1, "#f0f921"]], type: "histogram2d" }], histogram: [{ marker: { pattern: { fillmode: "overlay", size: 10, solidity: .2 } }, type: "histogram" }], mesh3d: [{ colorbar: { outlinewidth: 0, ticks: "" }, type: "mesh3d" }], parcoords: [{ line: { colorbar: { outlinewidth: 0, ticks: "" } }, type: "parcoords" }], pie: [{ automargin: !0, type: "pie" }], scatter3d: [{ line: { colorbar: { outlinewidth: 0, ticks: "" } }, marker: { colorbar: { outlinewidth: 0, ticks: "" } }, type: "scatter3d" }], scattercarpet: [{ marker: { colorbar: { outlinewidth: 0, ticks: "" } }, type: "scattercarpet" }], scattergeo: [{ marker: { colorbar: { outlinewidth: 0, ticks: "" } }, type: "scattergeo" }], scattergl: [{ marker: { colorbar: { outlinewidth: 0, ticks: "" } }, type: "scattergl" }], scattermapbox: [{ marker: { colorbar: { outlinewidth: 0, ticks: "" } }, type: "scattermapbox" }], scatterpolargl: [{ marker: { colorbar: { outlinewidth: 0, ticks: "" } }, type: "scatterpolargl" }], scatterpolar: [{ marker: { colorbar: { outlinewidth: 0, ticks: "" } }, type: "scatterpolar" }], scatter: [{ fillpattern: { fillmode: "overlay", size: 10, solidity: .2 }, type: "scatter" }], scatterternary: [{ marker: { colorbar: { outlinewidth: 0, ticks: "" } }, type: "scatterternary" }], surface: [{ colorbar: { outlinewidth: 0, ticks: "" }, colorscale: [[0, "#0d0887"], [.1111111111111111, "#46039f"], [.2222222222222222, "#7201a8"], [.3333333333333333, "#9c179e"], [.4444444444444444, "#bd3786"], [.5555555555555556, "#d8576b"], [.6666666666666666, "#ed7953"], [.7777777777777778, "#fb9f3a"], [.8888888888888888, "#fdca26"], [1, "#f0f921"]], type: "surface" }], table: [{ cells: { fill: { color: "#EBF0F8" }, line: { color: "white" } }, header: { fill: { color: "#C8D4E3" }, line: { color: "white" } }, type: "table" }], candlestick: [{ decreasing: { fillcolor: "#c80000", line: { color: "#990000" } }, increasing: { fillcolor: "#009600", line: { color: "#007500" } }, type: "candlestick" }] }, layout: { annotationdefaults: { arrowcolor: "#2a3f5f", arrowhead: 0, arrowwidth: 1, showarrow: !1 }, autotypenumbers: "strict", coloraxis: { colorbar: { outlinewidth: 0, ticks: "" } }, colorscale: { diverging: [[0, "#8e0152"], [.1, "#c51b7d"], [.2, "#de77ae"], [.3, "#f1b6da"], [.4, "#fde0ef"], [.5, "#f7f7f7"], [.6, "#e6f5d0"], [.7, "#b8e186"], [.8, "#7fbc41"], [.9, "#4d9221"], [1, "#276419"]], sequential: [[0, "#0d0887"], [.1111111111111111, "#46039f"], [.2222222222222222, "#7201a8"], [.3333333333333333, "#9c179e"], [.4444444444444444, "#bd3786"], [.5555555555555556, "#d8576b"], [.6666666666666666, "#ed7953"], [.7777777777777778, "#fb9f3a"], [.8888888888888888, "#fdca26"], [1, "#f0f921"]], sequentialminus: [[0, "#0d0887"], [.1111111111111111, "#46039f"], [.2222222222222222, "#7201a8"], [.3333333333333333, "#9c179e"], [.4444444444444444, "#bd3786"], [.5555555555555556, "#d8576b"], [.6666666666666666, "#ed7953"], [.7777777777777778, "#fb9f3a"], [.8888888888888888, "#fdca26"], [1, "#f0f921"]] }, colorway: ["#254495", "#c13246", "#48277c", "#e4003a", "#ef7d00", "#822661", "#ffed00", "#00aaff", "#9b30d9", "#af005f", "#5f00af", "#af87ff"], font: { color: "#2a3f5f" }, geo: { bgcolor: "white", lakecolor: "white", landcolor: "white", showlakes: !0, showland: !0, subunitcolor: "#C8D4E3" }, hoverlabel: { align: "left" }, hovermode: "x", mapbox: { style: "light" }, paper_bgcolor: "white", plot_bgcolor: "white", polar: { angularaxis: { gridcolor: "#EBF0F8", linecolor: "#EBF0F8", ticks: "" }, bgcolor: "white", radialaxis: { gridcolor: "#EBF0F8", linecolor: "#EBF0F8", ticks: "" } }, scene: { xaxis: { backgroundcolor: "white", gridcolor: "#DFE8F3", gridwidth: 2, linecolor: "#EBF0F8", showbackground: !0, ticks: "", zerolinecolor: "#EBF0F8" }, yaxis: { backgroundcolor: "white", gridcolor: "#DFE8F3", gridwidth: 2, linecolor: "#EBF0F8", showbackground: !0, ticks: "", zerolinecolor: "#EBF0F8" }, zaxis: { backgroundcolor: "white", gridcolor: "#DFE8F3", gridwidth: 2, linecolor: "#EBF0F8", showbackground: !0, ticks: "", zerolinecolor: "#EBF0F8" } }, shapedefaults: { line: { color: "#2a3f5f" } }, ternary: { aaxis: { gridcolor: "#DFE8F3", linecolor: "#A2B1C6", ticks: "" }, baxis: { gridcolor: "#DFE8F3", linecolor: "#A2B1C6", ticks: "" }, bgcolor: "white", caxis: { gridcolor: "#DFE8F3", linecolor: "#A2B1C6", ticks: "" } }, title: { x: .05 }, xaxis: { automargin: !0, ticks: "outside", zerolinewidth: 2, rangeslider: { visible: !1 }, showgrid: !0, showline: !0, tickfont: { size: 15 }, title: { standoff: 20 }, mirror: !0, zeroline: !1 }, yaxis: { automargin: !0, ticks: "outside", tickfont: { size: 15 }, zerolinewidth: 2, fixedrange: !1, title: { standoff: 20 }, nticks: 8, showgrid: !0, showline: !0, side: "right", mirror: !0, zeroline: !1 }, dragmode: "pan", legend: { bgcolor: "rgba(0, 0, 0, 0)", x: 1.03, xanchor: "left", y: .99, yanchor: "top" } } }; function zo() { return zo = Object.assign ? Object.assign.bind() : function (L) { for (var I = 1; I < arguments.length; I++) { var $ = arguments[I]; for (var se in $) Object.prototype.hasOwnProperty.call($, se) && (L[se] = $[se]) } return L }, zo.apply(this, arguments) } function wf(L, I, { checkForDefaultPrevented: $ = !0 } = {}) { return function (Pe) { if (L == null || L(Pe), $ === !1 || !Pe.defaultPrevented) return I == null ? void 0 : I(Pe) } } function J7(L, I) { typeof L == "function" ? L(I) : L != null && (L.current = I) } function S5(...L) { return I => L.forEach($ => J7($, I)) } function pd(...L) { return In.useCallback(S5(...L), L) } function Q7(L, I = []) { let $ = []; function se(R, E) { const e = In.createContext(E), w = $.length; $ = [...$, E]; function k(_) { const { scope: y, children: h, ...l } = _, t = (y == null ? void 0 : y[L][w]) || e, o = In.useMemo(() => l, Object.values(l)); return In.createElement(t.Provider, { value: o }, h) } function i(_, y) { const h = (y == null ? void 0 : y[L][w]) || e, l = In.useContext(h); if (l) return l; if (E !== void 0) return E; throw new Error(`\`${_}\` must be used within \`${R}\``) } return k.displayName = R + "Provider", [k, i] } const Pe = () => { const R = $.map(E => In.createContext(E)); return function (e) { const w = (e == null ? void 0 : e[L]) || R; return In.useMemo(() => ({ [`__scope${L}`]: { ...e, [L]: w } }), [e, w]) } }; return Pe.scopeName = L, [se, eA(Pe, ...I)] } function eA(...L) { const I = L[0]; if (L.length === 1) return I; const $ = () => { const se = L.map(Pe => ({ useScope: Pe(), scopeName: Pe.scopeName })); return function (R) { const E = se.reduce((e, { useScope: w, scopeName: k }) => { const _ = w(R)[`__scope${k}`]; return { ...e, ..._ } }, {}); return In.useMemo(() => ({ [`__scope${I.scopeName}`]: E }), [E]) } }; return $.scopeName = I.scopeName, $ } const Tm = globalThis != null && globalThis.document ? In.useLayoutEffect : () => { }, tA = Z6["useId".toString()] || (() => { }); let nA = 0; function sv(L) { const [I, $] = In.useState(tA()); return Tm(() => { L || $(se => se ?? String(nA++)) }, [L]), L || (I ? `radix-${I}` : "") } function Cf(L) { const I = In.useRef(L); return In.useEffect(() => { I.current = L }), In.useMemo(() => (...$) => { var se; return (se = I.current) === null || se === void 0 ? void 0 : se.call(I, ...$) }, []) } function rA({ prop: L, defaultProp: I, onChange: $ = () => { } }) { const [se, Pe] = iA({ defaultProp: I, onChange: $ }), R = L !== void 0, E = R ? L : se, e = Cf($), w = In.useCallback(k => { if (R) { const _ = typeof k == "function" ? k(L) : k; _ !== L && e(_) } else Pe(k) }, [R, L, Pe, e]); return [E, w] } function iA({ defaultProp: L, onChange: I }) { const $ = In.useState(L), [se] = $, Pe = In.useRef(se), R = Cf(I); return In.useEffect(() => { Pe.current !== se && (R(se), Pe.current = se) }, [se, Pe, R]), $ } const Fy = In.forwardRef((L, I) => { const { children: $, ...se } = L, Pe = In.Children.toArray($), R = Pe.find(oA); if (R) { const E = R.props.children, e = Pe.map(w => w === R ? In.Children.count(E) > 1 ? In.Children.only(null) : In.isValidElement(E) ? E.props.children : null : w); return In.createElement(Am, zo({}, se, { ref: I }), In.isValidElement(E) ? In.cloneElement(E, void 0, e) : null) } return In.createElement(Am, zo({}, se, { ref: I }), $) }); Fy.displayName = "Slot"; const Am = In.forwardRef((L, I) => { const { children: $, ...se } = L; return In.isValidElement($) ? In.cloneElement($, { ...sA(se, $.props), ref: I ? S5(I, $.ref) : $.ref }) : In.Children.count($) > 1 ? In.Children.only(null) : null }); Am.displayName = "SlotClone"; const aA = ({ children: L }) => In.createElement(In.Fragment, null, L); function oA(L) { return In.isValidElement(L) && L.type === aA } function sA(L, I) { const $ = { ...I }; for (const se in I) { const Pe = L[se], R = I[se]; /^on[A-Z]/.test(se) ? Pe && R ? $[se] = (...e) => { R(...e), Pe(...e) } : Pe && ($[se] = Pe) : se === "style" ? $[se] = { ...Pe, ...R } : se === "className" && ($[se] = [Pe, R].filter(Boolean).join(" ")) } return { ...L, ...$ } } const lA = ["a", "button", "div", "form", "h2", "h3", "img", "input", "label", "li", "nav", "ol", "p", "span", "svg", "ul"], Nh = lA.reduce((L, I) => { const $ = In.forwardRef((se, Pe) => { const { asChild: R, ...E } = se, e = R ? Fy : I; return In.useEffect(() => { window[Symbol.for("radix-ui")] = !0 }, []), In.createElement(e, zo({}, E, { ref: Pe })) }); return $.displayName = `Primitive.${I}`, { ...L, [I]: $ } }, {}); function uA(L, I) { L && Ay.flushSync(() => L.dispatchEvent(I)) } function cA(L, I = globalThis == null ? void 0 : globalThis.document) { const $ = Cf(L); In.useEffect(() => { const se = Pe => { Pe.key === "Escape" && $(Pe) }; return I.addEventListener("keydown", se), () => I.removeEventListener("keydown", se) }, [$, I]) } const Mm = "dismissableLayer.update", fA = "dismissableLayer.pointerDownOutside", hA = "dismissableLayer.focusOutside"; let f_; const pA = In.createContext({ layers: new Set, layersWithOutsidePointerEventsDisabled: new Set, branches: new Set }), dA = In.forwardRef((L, I) => { var $; const { disableOutsidePointerEvents: se = !1, onEscapeKeyDown: Pe, onPointerDownOutside: R, onFocusOutside: E, onInteractOutside: e, onDismiss: w, ...k } = L, i = In.useContext(pA), [_, y] = In.useState(null), h = ($ = _ == null ? void 0 : _.ownerDocument) !== null && $ !== void 0 ? $ : globalThis == null ? void 0 : globalThis.document, [, l] = In.useState({}), t = pd(I, b => y(b)), o = Array.from(i.layers), [r] = [...i.layersWithOutsidePointerEventsDisabled].slice(-1), n = o.indexOf(r), a = _ ? o.indexOf(_) : -1, s = i.layersWithOutsidePointerEventsDisabled.size > 0, u = a >= n, p = gA(b => { const g = b.target, f = [...i.branches].some(v => v.contains(g)); !u || f || (R == null || R(b), e == null || e(b), b.defaultPrevented || w == null || w()) }, h), c = vA(b => { const g = b.target;[...i.branches].some(v => v.contains(g)) || (E == null || E(b), e == null || e(b), b.defaultPrevented || w == null || w()) }, h); return cA(b => { a === i.layers.size - 1 && (Pe == null || Pe(b), !b.defaultPrevented && w && (b.preventDefault(), w())) }, h), In.useEffect(() => { if (_) return se && (i.layersWithOutsidePointerEventsDisabled.size === 0 && (f_ = h.body.style.pointerEvents, h.body.style.pointerEvents = "none"), i.layersWithOutsidePointerEventsDisabled.add(_)), i.layers.add(_), h_(), () => { se && i.layersWithOutsidePointerEventsDisabled.size === 1 && (h.body.style.pointerEvents = f_) } }, [_, h, se, i]), In.useEffect(() => () => { _ && (i.layers.delete(_), i.layersWithOutsidePointerEventsDisabled.delete(_), h_()) }, [_, i]), In.useEffect(() => { const b = () => l({}); return document.addEventListener(Mm, b), () => document.removeEventListener(Mm, b) }, []), In.createElement(Nh.div, zo({}, k, { ref: t, style: { pointerEvents: s ? u ? "auto" : "none" : void 0, ...L.style }, onFocusCapture: wf(L.onFocusCapture, c.onFocusCapture), onBlurCapture: wf(L.onBlurCapture, c.onBlurCapture), onPointerDownCapture: wf(L.onPointerDownCapture, p.onPointerDownCapture) })) }); function gA(L, I = globalThis == null ? void 0 : globalThis.document) { const $ = Cf(L), se = In.useRef(!1), Pe = In.useRef(() => { }); return In.useEffect(() => { const R = e => { if (e.target && !se.current) { let i = function () { E5(fA, $, k, { discrete: !0 }) }; var w = i; const k = { originalEvent: e }; e.pointerType === "touch" ? (I.removeEventListener("click", Pe.current), Pe.current = i, I.addEventListener("click", Pe.current, { once: !0 })) : i() } se.current = !1 }, E = window.setTimeout(() => { I.addEventListener("pointerdown", R) }, 0); return () => { window.clearTimeout(E), I.removeEventListener("pointerdown", R), I.removeEventListener("click", Pe.current) } }, [I, $]), { onPointerDownCapture: () => se.current = !0 } } function vA(L, I = globalThis == null ? void 0 : globalThis.document) { const $ = Cf(L), se = In.useRef(!1); return In.useEffect(() => { const Pe = R => { R.target && !se.current && E5(hA, $, { originalEvent: R }, { discrete: !1 }) }; return I.addEventListener("focusin", Pe), () => I.removeEventListener("focusin", Pe) }, [I, $]), { onFocusCapture: () => se.current = !0, onBlurCapture: () => se.current = !1 } } function h_() { const L = new CustomEvent(Mm); document.dispatchEvent(L) } function E5(L, I, $, { discrete: se }) { const Pe = $.originalEvent.target, R = new CustomEvent(L, { bubbles: !1, cancelable: !0, detail: $ }); I && Pe.addEventListener(L, I, { once: !0 }), se ? uA(Pe, R) : Pe.dispatchEvent(R) } const lv = "focusScope.autoFocusOnMount", uv = "focusScope.autoFocusOnUnmount", p_ = { bubbles: !1, cancelable: !0 }, mA = In.forwardRef((L, I) => { const { loop: $ = !1, trapped: se = !1, onMountAutoFocus: Pe, onUnmountAutoFocus: R, ...E } = L, [e, w] = In.useState(null), k = Cf(Pe), i = Cf(R), _ = In.useRef(null), y = pd(I, t => w(t)), h = In.useRef({ paused: !1, pause() { this.paused = !0 }, resume() { this.paused = !1 } }).current; In.useEffect(() => { if (se) { let n = function (p) { if (h.paused || !e) return; const c = p.target; e.contains(c) ? _.current = c : kc(_.current, { select: !0 }) }, a = function (p) { if (h.paused || !e) return; const c = p.relatedTarget; c !== null && (e.contains(c) || kc(_.current, { select: !0 })) }, s = function (p) { const c = document.activeElement; for (const b of p) b.removedNodes.length > 0 && (e != null && e.contains(c) || kc(e)) }; var t = n, o = a, r = s; document.addEventListener("focusin", n), document.addEventListener("focusout", a); const u = new MutationObserver(s); return e && u.observe(e, { childList: !0, subtree: !0 }), () => { document.removeEventListener("focusin", n), document.removeEventListener("focusout", a), u.disconnect() } } }, [se, e, h.paused]), In.useEffect(() => { if (e) { g_.add(h); const t = document.activeElement; if (!e.contains(t)) { const r = new CustomEvent(lv, p_); e.addEventListener(lv, k), e.dispatchEvent(r), r.defaultPrevented || (yA(kA(C5(e)), { select: !0 }), document.activeElement === t && kc(e)) } return () => { e.removeEventListener(lv, k), setTimeout(() => { const r = new CustomEvent(uv, p_); e.addEventListener(uv, i), e.dispatchEvent(r), r.defaultPrevented || kc(t ?? document.body, { select: !0 }), e.removeEventListener(uv, i), g_.remove(h) }, 0) } } }, [e, k, i, h]); const l = In.useCallback(t => { if (!$ && !se || h.paused) return; const o = t.key === "Tab" && !t.altKey && !t.ctrlKey && !t.metaKey, r = document.activeElement; if (o && r) { const n = t.currentTarget, [a, s] = xA(n); a && s ? !t.shiftKey && r === s ? (t.preventDefault(), $ && kc(a, { select: !0 })) : t.shiftKey && r === a && (t.preventDefault(), $ && kc(s, { select: !0 })) : r === n && t.preventDefault() } }, [$, se, h.paused]); return In.createElement(Nh.div, zo({ tabIndex: -1 }, E, { ref: y, onKeyDown: l })) }); function yA(L, { select: I = !1 } = {}) { const $ = document.activeElement; for (const se of L) if (kc(se, { select: I }), document.activeElement !== $) return } function xA(L) { const I = C5(L), $ = d_(I, L), se = d_(I.reverse(), L); return [$, se] } function C5(L) { const I = [], $ = document.createTreeWalker(L, NodeFilter.SHOW_ELEMENT, { acceptNode: se => { const Pe = se.tagName === "INPUT" && se.type === "hidden"; return se.disabled || se.hidden || Pe ? NodeFilter.FILTER_SKIP : se.tabIndex >= 0 ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP } }); for (; $.nextNode();)I.push($.currentNode); return I } function d_(L, I) { for (const $ of L) if (!bA($, { upTo: I })) return $ } function bA(L, { upTo: I }) { if (getComputedStyle(L).visibility === "hidden") return !0; for (; L;) { if (I !== void 0 && L === I) return !1; if (getComputedStyle(L).display === "none") return !0; L = L.parentElement } return !1 } function _A(L) { return L instanceof HTMLInputElement && "select" in L } function kc(L, { select: I = !1 } = {}) { if (L && L.focus) { const $ = document.activeElement; L.focus({ preventScroll: !0 }), L !== $ && _A(L) && I && L.select() } } const g_ = wA(); function wA() { let L = []; return { add(I) { const $ = L[0]; I !== $ && ($ == null || $.pause()), L = v_(L, I), L.unshift(I) }, remove(I) { var $; L = v_(L, I), ($ = L[0]) === null || $ === void 0 || $.resume() } } } function v_(L, I) { const $ = [...L], se = $.indexOf(I); return se !== -1 && $.splice(se, 1), $ } function kA(L) { return L.filter(I => I.tagName !== "A") } function TA(L, I) { return In.useReducer(($, se) => { const Pe = I[$][se]; return Pe ?? $ }, L) } const By = L => { const { present: I, children: $ } = L, se = AA(I), Pe = typeof $ == "function" ? $({ present: se.isPresent }) : In.Children.only($), R = pd(se.ref, Pe.ref); return typeof $ == "function" || se.isPresent ? In.cloneElement(Pe, { ref: R }) : null }; By.displayName = "Presence"; function AA(L) { const [I, $] = In.useState(), se = In.useRef({}), Pe = In.useRef(L), R = In.useRef("none"), E = L ? "mounted" : "unmounted", [e, w] = TA(E, { mounted: { UNMOUNT: "unmounted", ANIMATION_OUT: "unmountSuspended" }, unmountSuspended: { MOUNT: "mounted", ANIMATION_END: "unmounted" }, unmounted: { MOUNT: "mounted" } }); return In.useEffect(() => { const k = b0(se.current); R.current = e === "mounted" ? k : "none" }, [e]), Tm(() => { const k = se.current, i = Pe.current; if (i !== L) { const y = R.current, h = b0(k); L ? w("MOUNT") : h === "none" || (k == null ? void 0 : k.display) === "none" ? w("UNMOUNT") : w(i && y !== h ? "ANIMATION_OUT" : "UNMOUNT"), Pe.current = L } }, [L, w]), Tm(() => { if (I) { const k = _ => { const h = b0(se.current).includes(_.animationName); _.target === I && h && Ay.flushSync(() => w("ANIMATION_END")) }, i = _ => { _.target === I && (R.current = b0(se.current)) }; return I.addEventListener("animationstart", i), I.addEventListener("animationcancel", k), I.addEventListener("animationend", k), () => { I.removeEventListener("animationstart", i), I.removeEventListener("animationcancel", k), I.removeEventListener("animationend", k) } } else w("ANIMATION_END") }, [I, w]), { isPresent: ["mounted", "unmountSuspended"].includes(e), ref: In.useCallback(k => { k && (se.current = getComputedStyle(k)), $(k) }, []) } } function b0(L) { return (L == null ? void 0 : L.animationName) || "none" } let cv = 0; function MA() { In.useEffect(() => { var L, I; const $ = document.querySelectorAll("[data-radix-focus-guard]"); return document.body.insertAdjacentElement("afterbegin", (L = $[0]) !== null && L !== void 0 ? L : m_()), document.body.insertAdjacentElement("beforeend", (I = $[1]) !== null && I !== void 0 ? I : m_()), cv++, () => { cv === 1 && document.querySelectorAll("[data-radix-focus-guard]").forEach(se => se.remove()), cv-- } }, []) } function m_() { const L = document.createElement("span"); return L.setAttribute("data-radix-focus-guard", ""), L.tabIndex = 0, L.style.cssText = "outline: none; opacity: 0; position: fixed; pointer-events: none", L } var ku = function () { return ku = Object.assign || function (I) { for (var $, se = 1, Pe = arguments.length; se < Pe; se++) { $ = arguments[se]; for (var R in $) Object.prototype.hasOwnProperty.call($, R) && (I[R] = $[R]) } return I }, ku.apply(this, arguments) }; function L5(L, I) { var $ = {}; for (var se in L) Object.prototype.hasOwnProperty.call(L, se) && I.indexOf(se) < 0 && ($[se] = L[se]); if (L != null && typeof Object.getOwnPropertySymbols == "function") for (var Pe = 0, se = Object.getOwnPropertySymbols(L); Pe < se.length; Pe++)I.indexOf(se[Pe]) < 0 && Object.prototype.propertyIsEnumerable.call(L, se[Pe]) && ($[se[Pe]] = L[se[Pe]]); return $ } function SA(L, I, $) { if ($ || arguments.length === 2) for (var se = 0, Pe = I.length, R; se < Pe; se++)(R || !(se in I)) && (R || (R = Array.prototype.slice.call(I, 0, se)), R[se] = I[se]); return L.concat(R || Array.prototype.slice.call(I)) } var H0 = "right-scroll-bar-position", q0 = "width-before-scroll-bar", EA = "with-scroll-bars-hidden", CA = "--removed-body-scroll-bar-size"; function LA(L, I) { return typeof L == "function" ? L(I) : L && (L.current = I), L } function PA(L, I) { var $ = In.useState(function () { return { value: L, callback: I, facade: { get current() { return $.value }, set current(se) { var Pe = $.value; Pe !== se && ($.value = se, $.callback(se, Pe)) } } } })[0]; return $.callback = I, $.facade } function OA(L, I) { return PA(I || null, function ($) { return L.forEach(function (se) { return LA(se, $) }) }) } function IA(L) { return L } function RA(L, I) { I === void 0 && (I = IA); var $ = [], se = !1, Pe = { read: function () { if (se) throw new Error("Sidecar: could not `read` from an `assigned` medium. `read` could be used only with `useMedium`."); return $.length ? $[$.length - 1] : L }, useMedium: function (R) { var E = I(R, se); return $.push(E), function () { $ = $.filter(function (e) { return e !== E }) } }, assignSyncMedium: function (R) { for (se = !0; $.length;) { var E = $; $ = [], E.forEach(R) } $ = { push: function (e) { return R(e) }, filter: function () { return $ } } }, assignMedium: function (R) { se = !0; var E = []; if ($.length) { var e = $; $ = [], e.forEach(R), E = $ } var w = function () { var i = E; E = [], i.forEach(R) }, k = function () { return Promise.resolve().then(w) }; k(), $ = { push: function (i) { E.push(i), k() }, filter: function (i) { return E = E.filter(i), $ } } } }; return Pe } function zA(L) { L === void 0 && (L = {}); var I = RA(null); return I.options = ku({ async: !0, ssr: !1 }, L), I } var P5 = function (L) { var I = L.sideCar, $ = L5(L, ["sideCar"]); if (!I) throw new Error("Sidecar: please provide `sideCar` property to import the right car"); var se = I.read(); if (!se) throw new Error("Sidecar medium not found"); return In.createElement(se, ku({}, $)) }; P5.isSideCarExport = !0; function DA(L, I) { return L.useMedium(I), P5 } var O5 = zA(), fv = function () { }, B1 = In.forwardRef(function (L, I) { var $ = In.useRef(null), se = In.useState({ onScrollCapture: fv, onWheelCapture: fv, onTouchMoveCapture: fv }), Pe = se[0], R = se[1], E = L.forwardProps, e = L.children, w = L.className, k = L.removeScrollBar, i = L.enabled, _ = L.shards, y = L.sideCar, h = L.noIsolation, l = L.inert, t = L.allowPinchZoom, o = L.as, r = o === void 0 ? "div" : o, n = L5(L, ["forwardProps", "children", "className", "removeScrollBar", "enabled", "shards", "sideCar", "noIsolation", "inert", "allowPinchZoom", "as"]), a = y, s = OA([$, I]), u = ku(ku({}, n), Pe); return In.createElement(In.Fragment, null, i && In.createElement(a, { sideCar: O5, removeScrollBar: k, shards: _, noIsolation: h, inert: l, setCallbacks: R, allowPinchZoom: !!t, lockRef: $ }), E ? In.cloneElement(In.Children.only(e), ku(ku({}, u), { ref: s })) : In.createElement(r, ku({}, u, { className: w, ref: s }), e)) }); B1.defaultProps = { enabled: !0, removeScrollBar: !0, inert: !1 }; B1.classNames = { fullWidth: q0, zeroRight: H0 }; var y_, FA = function () { if (y_) return y_; if (typeof __webpack_nonce__ < "u") return __webpack_nonce__ }; function BA() { if (!document) return null; var L = document.createElement("style"); L.type = "text/css"; var I = FA(); return I && L.setAttribute("nonce", I), L } function NA(L, I) { L.styleSheet ? L.styleSheet.cssText = I : L.appendChild(document.createTextNode(I)) } function jA(L) { var I = document.head || document.getElementsByTagName("head")[0]; I.appendChild(L) } var UA = function () { var L = 0, I = null; return { add: function ($) { L == 0 && (I = BA()) && (NA(I, $), jA(I)), L++ }, remove: function () { L--, !L && I && (I.parentNode && I.parentNode.removeChild(I), I = null) } } }, VA = function () { var L = UA(); return function (I, $) { In.useEffect(function () { return L.add(I), function () { L.remove() } }, [I && $]) } }, I5 = function () { var L = VA(), I = function ($) { var se = $.styles, Pe = $.dynamic; return L(se, Pe), null }; return I }, HA = { left: 0, top: 0, right: 0, gap: 0 }, hv = function (L) { return parseInt(L || "", 10) || 0 }, qA = function (L) { var I = window.getComputedStyle(document.body), $ = I[L === "padding" ? "paddingLeft" : "marginLeft"], se = I[L === "padding" ? "paddingTop" : "marginTop"], Pe = I[L === "padding" ? "paddingRight" : "marginRight"]; return [hv($), hv(se), hv(Pe)] }, GA = function (L) { if (L === void 0 && (L = "margin"), typeof window > "u") return HA; var I = qA(L), $ = document.documentElement.clientWidth, se = window.innerWidth; return { left: I[0], top: I[1], right: I[2], gap: Math.max(0, se - $ + I[2] - I[0]) } }, WA = I5(), ZA = function (L, I, $, se) { + }, $7 = { data: { candlestick: [{ decreasing: { fillcolor: "#e4003a", line: { color: "#e4003a" } }, increasing: { fillcolor: "#00ACFF", line: { color: "#00ACFF" } }, type: "candlestick" }] }, layout: { annotationdefaults: { showarrow: !1 }, autotypenumbers: "strict", colorway: ["#ffed00", "#ef7d00", "#e4003a", "#c13246", "#822661", "#48277c", "#005ca9", "#00aaff", "#9b30d9", "#af005f", "#5f00af", "#af87ff"], dragmode: "pan", font: { family: "Arial", size: 18 }, hoverlabel: { align: "left" }, mapbox: { style: "dark" }, hovermode: "x", legend: { bgcolor: "rgba(0, 0, 0, 0)", x: .01, xanchor: "left", y: .99, yanchor: "top", font: { size: 15 } }, paper_bgcolor: "#000000", plot_bgcolor: "#000000", xaxis: { automargin: !0, autorange: !0, rangeslider: { visible: !1 }, showgrid: !0, showline: !0, tickfont: { size: 14 }, zeroline: !1, tick0: 1, title: { standoff: 20 }, linecolor: "#F5EFF3", mirror: !0, ticks: "outside" }, yaxis: { anchor: "x", automargin: !0, fixedrange: !1, zeroline: !1, showgrid: !0, showline: !0, side: "right", tick0: .5, title: { standoff: 20 }, gridcolor: "#283442", linecolor: "#F5EFF3", mirror: !0, ticks: "outside" } } }, K7 = { data: { barpolar: [{ marker: { line: { color: "white", width: .5 }, pattern: { fillmode: "overlay", size: 10, solidity: .2 } }, type: "barpolar" }], bar: [{ error_x: { color: "#2a3f5f" }, error_y: { color: "#2a3f5f" }, marker: { line: { color: "white", width: .5 }, pattern: { fillmode: "overlay", size: 10, solidity: .2 } }, type: "bar" }], carpet: [{ aaxis: { endlinecolor: "#2a3f5f", gridcolor: "#C8D4E3", linecolor: "#C8D4E3", minorgridcolor: "#C8D4E3", startlinecolor: "#2a3f5f" }, baxis: { endlinecolor: "#2a3f5f", gridcolor: "#C8D4E3", linecolor: "#C8D4E3", minorgridcolor: "#C8D4E3", startlinecolor: "#2a3f5f" }, type: "carpet" }], choropleth: [{ colorbar: { outlinewidth: 0, ticks: "" }, type: "choropleth" }], contourcarpet: [{ colorbar: { outlinewidth: 0, ticks: "" }, type: "contourcarpet" }], contour: [{ colorbar: { outlinewidth: 0, ticks: "" }, colorscale: [[0, "#0d0887"], [.1111111111111111, "#46039f"], [.2222222222222222, "#7201a8"], [.3333333333333333, "#9c179e"], [.4444444444444444, "#bd3786"], [.5555555555555556, "#d8576b"], [.6666666666666666, "#ed7953"], [.7777777777777778, "#fb9f3a"], [.8888888888888888, "#fdca26"], [1, "#f0f921"]], type: "contour" }], heatmapgl: [{ colorbar: { outlinewidth: 0, ticks: "" }, colorscale: [[0, "#0d0887"], [.1111111111111111, "#46039f"], [.2222222222222222, "#7201a8"], [.3333333333333333, "#9c179e"], [.4444444444444444, "#bd3786"], [.5555555555555556, "#d8576b"], [.6666666666666666, "#ed7953"], [.7777777777777778, "#fb9f3a"], [.8888888888888888, "#fdca26"], [1, "#f0f921"]], type: "heatmapgl" }], heatmap: [{ colorbar: { outlinewidth: 0, ticks: "" }, colorscale: [[0, "#0d0887"], [.1111111111111111, "#46039f"], [.2222222222222222, "#7201a8"], [.3333333333333333, "#9c179e"], [.4444444444444444, "#bd3786"], [.5555555555555556, "#d8576b"], [.6666666666666666, "#ed7953"], [.7777777777777778, "#fb9f3a"], [.8888888888888888, "#fdca26"], [1, "#f0f921"]], type: "heatmap" }], histogram2dcontour: [{ colorbar: { outlinewidth: 0, ticks: "" }, colorscale: [[0, "#0d0887"], [.1111111111111111, "#46039f"], [.2222222222222222, "#7201a8"], [.3333333333333333, "#9c179e"], [.4444444444444444, "#bd3786"], [.5555555555555556, "#d8576b"], [.6666666666666666, "#ed7953"], [.7777777777777778, "#fb9f3a"], [.8888888888888888, "#fdca26"], [1, "#f0f921"]], type: "histogram2dcontour" }], histogram2d: [{ colorbar: { outlinewidth: 0, ticks: "" }, colorscale: [[0, "#0d0887"], [.1111111111111111, "#46039f"], [.2222222222222222, "#7201a8"], [.3333333333333333, "#9c179e"], [.4444444444444444, "#bd3786"], [.5555555555555556, "#d8576b"], [.6666666666666666, "#ed7953"], [.7777777777777778, "#fb9f3a"], [.8888888888888888, "#fdca26"], [1, "#f0f921"]], type: "histogram2d" }], histogram: [{ marker: { pattern: { fillmode: "overlay", size: 10, solidity: .2 } }, type: "histogram" }], mesh3d: [{ colorbar: { outlinewidth: 0, ticks: "" }, type: "mesh3d" }], parcoords: [{ line: { colorbar: { outlinewidth: 0, ticks: "" } }, type: "parcoords" }], pie: [{ automargin: !0, type: "pie" }], scatter3d: [{ line: { colorbar: { outlinewidth: 0, ticks: "" } }, marker: { colorbar: { outlinewidth: 0, ticks: "" } }, type: "scatter3d" }], scattercarpet: [{ marker: { colorbar: { outlinewidth: 0, ticks: "" } }, type: "scattercarpet" }], scattergeo: [{ marker: { colorbar: { outlinewidth: 0, ticks: "" } }, type: "scattergeo" }], scattergl: [{ marker: { colorbar: { outlinewidth: 0, ticks: "" } }, type: "scattergl" }], scattermapbox: [{ marker: { colorbar: { outlinewidth: 0, ticks: "" } }, type: "scattermapbox" }], scatterpolargl: [{ marker: { colorbar: { outlinewidth: 0, ticks: "" } }, type: "scatterpolargl" }], scatterpolar: [{ marker: { colorbar: { outlinewidth: 0, ticks: "" } }, type: "scatterpolar" }], scatter: [{ fillpattern: { fillmode: "overlay", size: 10, solidity: .2 }, type: "scatter" }], scatterternary: [{ marker: { colorbar: { outlinewidth: 0, ticks: "" } }, type: "scatterternary" }], surface: [{ colorbar: { outlinewidth: 0, ticks: "" }, colorscale: [[0, "#0d0887"], [.1111111111111111, "#46039f"], [.2222222222222222, "#7201a8"], [.3333333333333333, "#9c179e"], [.4444444444444444, "#bd3786"], [.5555555555555556, "#d8576b"], [.6666666666666666, "#ed7953"], [.7777777777777778, "#fb9f3a"], [.8888888888888888, "#fdca26"], [1, "#f0f921"]], type: "surface" }], table: [{ cells: { fill: { color: "#EBF0F8" }, line: { color: "white" } }, header: { fill: { color: "#C8D4E3" }, line: { color: "white" } }, type: "table" }], candlestick: [{ decreasing: { fillcolor: "#e4003a", line: { color: "#990000" } }, increasing: { fillcolor: "#00ACFF", line: { color: "#00ACFF" } }, type: "candlestick" }] }, layout: { annotationdefaults: { arrowcolor: "#2a3f5f", arrowhead: 0, arrowwidth: 1, showarrow: !1 }, autotypenumbers: "strict", coloraxis: { colorbar: { outlinewidth: 0, ticks: "" } }, colorscale: { diverging: [[0, "#8e0152"], [.1, "#c51b7d"], [.2, "#de77ae"], [.3, "#f1b6da"], [.4, "#fde0ef"], [.5, "#f7f7f7"], [.6, "#e6f5d0"], [.7, "#b8e186"], [.8, "#7fbc41"], [.9, "#4d9221"], [1, "#276419"]], sequential: [[0, "#0d0887"], [.1111111111111111, "#46039f"], [.2222222222222222, "#7201a8"], [.3333333333333333, "#9c179e"], [.4444444444444444, "#bd3786"], [.5555555555555556, "#d8576b"], [.6666666666666666, "#ed7953"], [.7777777777777778, "#fb9f3a"], [.8888888888888888, "#fdca26"], [1, "#f0f921"]], sequentialminus: [[0, "#0d0887"], [.1111111111111111, "#46039f"], [.2222222222222222, "#7201a8"], [.3333333333333333, "#9c179e"], [.4444444444444444, "#bd3786"], [.5555555555555556, "#d8576b"], [.6666666666666666, "#ed7953"], [.7777777777777778, "#fb9f3a"], [.8888888888888888, "#fdca26"], [1, "#f0f921"]] }, colorway: ["#254495", "#c13246", "#48277c", "#e4003a", "#ef7d00", "#822661", "#ffed00", "#00aaff", "#9b30d9", "#af005f", "#5f00af", "#af87ff"], font: { color: "#2a3f5f" }, geo: { bgcolor: "white", lakecolor: "white", landcolor: "white", showlakes: !0, showland: !0, subunitcolor: "#C8D4E3" }, hoverlabel: { align: "left" }, hovermode: "x", mapbox: { style: "light" }, paper_bgcolor: "white", plot_bgcolor: "white", polar: { angularaxis: { gridcolor: "#EBF0F8", linecolor: "#EBF0F8", ticks: "" }, bgcolor: "white", radialaxis: { gridcolor: "#EBF0F8", linecolor: "#EBF0F8", ticks: "" } }, scene: { xaxis: { backgroundcolor: "white", gridcolor: "#DFE8F3", gridwidth: 2, linecolor: "#EBF0F8", showbackground: !0, ticks: "", zerolinecolor: "#EBF0F8" }, yaxis: { backgroundcolor: "white", gridcolor: "#DFE8F3", gridwidth: 2, linecolor: "#EBF0F8", showbackground: !0, ticks: "", zerolinecolor: "#EBF0F8" }, zaxis: { backgroundcolor: "white", gridcolor: "#DFE8F3", gridwidth: 2, linecolor: "#EBF0F8", showbackground: !0, ticks: "", zerolinecolor: "#EBF0F8" } }, shapedefaults: { line: { color: "#2a3f5f" } }, ternary: { aaxis: { gridcolor: "#DFE8F3", linecolor: "#A2B1C6", ticks: "" }, baxis: { gridcolor: "#DFE8F3", linecolor: "#A2B1C6", ticks: "" }, bgcolor: "white", caxis: { gridcolor: "#DFE8F3", linecolor: "#A2B1C6", ticks: "" } }, title: { x: .05 }, xaxis: { automargin: !0, ticks: "outside", zerolinewidth: 2, rangeslider: { visible: !1 }, showgrid: !0, showline: !0, tickfont: { size: 15 }, title: { standoff: 20 }, mirror: !0, zeroline: !1 }, yaxis: { automargin: !0, ticks: "outside", tickfont: { size: 15 }, zerolinewidth: 2, fixedrange: !1, title: { standoff: 20 }, nticks: 8, showgrid: !0, showline: !0, side: "right", mirror: !0, zeroline: !1 }, dragmode: "pan", legend: { bgcolor: "rgba(0, 0, 0, 0)", x: 1.03, xanchor: "left", y: .99, yanchor: "top" } } }; function zo() { return zo = Object.assign ? Object.assign.bind() : function (L) { for (var I = 1; I < arguments.length; I++) { var $ = arguments[I]; for (var se in $) Object.prototype.hasOwnProperty.call($, se) && (L[se] = $[se]) } return L }, zo.apply(this, arguments) } function wf(L, I, { checkForDefaultPrevented: $ = !0 } = {}) { return function (Pe) { if (L == null || L(Pe), $ === !1 || !Pe.defaultPrevented) return I == null ? void 0 : I(Pe) } } function J7(L, I) { typeof L == "function" ? L(I) : L != null && (L.current = I) } function S5(...L) { return I => L.forEach($ => J7($, I)) } function pd(...L) { return In.useCallback(S5(...L), L) } function Q7(L, I = []) { let $ = []; function se(R, E) { const e = In.createContext(E), w = $.length; $ = [...$, E]; function k(_) { const { scope: y, children: h, ...l } = _, t = (y == null ? void 0 : y[L][w]) || e, o = In.useMemo(() => l, Object.values(l)); return In.createElement(t.Provider, { value: o }, h) } function i(_, y) { const h = (y == null ? void 0 : y[L][w]) || e, l = In.useContext(h); if (l) return l; if (E !== void 0) return E; throw new Error(`\`${_}\` must be used within \`${R}\``) } return k.displayName = R + "Provider", [k, i] } const Pe = () => { const R = $.map(E => In.createContext(E)); return function (e) { const w = (e == null ? void 0 : e[L]) || R; return In.useMemo(() => ({ [`__scope${L}`]: { ...e, [L]: w } }), [e, w]) } }; return Pe.scopeName = L, [se, eA(Pe, ...I)] } function eA(...L) { const I = L[0]; if (L.length === 1) return I; const $ = () => { const se = L.map(Pe => ({ useScope: Pe(), scopeName: Pe.scopeName })); return function (R) { const E = se.reduce((e, { useScope: w, scopeName: k }) => { const _ = w(R)[`__scope${k}`]; return { ...e, ..._ } }, {}); return In.useMemo(() => ({ [`__scope${I.scopeName}`]: E }), [E]) } }; return $.scopeName = I.scopeName, $ } const Tm = globalThis != null && globalThis.document ? In.useLayoutEffect : () => { }, tA = Z6["useId".toString()] || (() => { }); let nA = 0; function sv(L) { const [I, $] = In.useState(tA()); return Tm(() => { L || $(se => se ?? String(nA++)) }, [L]), L || (I ? `radix-${I}` : "") } function Cf(L) { const I = In.useRef(L); return In.useEffect(() => { I.current = L }), In.useMemo(() => (...$) => { var se; return (se = I.current) === null || se === void 0 ? void 0 : se.call(I, ...$) }, []) } function rA({ prop: L, defaultProp: I, onChange: $ = () => { } }) { const [se, Pe] = iA({ defaultProp: I, onChange: $ }), R = L !== void 0, E = R ? L : se, e = Cf($), w = In.useCallback(k => { if (R) { const _ = typeof k == "function" ? k(L) : k; _ !== L && e(_) } else Pe(k) }, [R, L, Pe, e]); return [E, w] } function iA({ defaultProp: L, onChange: I }) { const $ = In.useState(L), [se] = $, Pe = In.useRef(se), R = Cf(I); return In.useEffect(() => { Pe.current !== se && (R(se), Pe.current = se) }, [se, Pe, R]), $ } const Fy = In.forwardRef((L, I) => { const { children: $, ...se } = L, Pe = In.Children.toArray($), R = Pe.find(oA); if (R) { const E = R.props.children, e = Pe.map(w => w === R ? In.Children.count(E) > 1 ? In.Children.only(null) : In.isValidElement(E) ? E.props.children : null : w); return In.createElement(Am, zo({}, se, { ref: I }), In.isValidElement(E) ? In.cloneElement(E, void 0, e) : null) } return In.createElement(Am, zo({}, se, { ref: I }), $) }); Fy.displayName = "Slot"; const Am = In.forwardRef((L, I) => { const { children: $, ...se } = L; return In.isValidElement($) ? In.cloneElement($, { ...sA(se, $.props), ref: I ? S5(I, $.ref) : $.ref }) : In.Children.count($) > 1 ? In.Children.only(null) : null }); Am.displayName = "SlotClone"; const aA = ({ children: L }) => In.createElement(In.Fragment, null, L); function oA(L) { return In.isValidElement(L) && L.type === aA } function sA(L, I) { const $ = { ...I }; for (const se in I) { const Pe = L[se], R = I[se]; /^on[A-Z]/.test(se) ? Pe && R ? $[se] = (...e) => { R(...e), Pe(...e) } : Pe && ($[se] = Pe) : se === "style" ? $[se] = { ...Pe, ...R } : se === "className" && ($[se] = [Pe, R].filter(Boolean).join(" ")) } return { ...L, ...$ } } const lA = ["a", "button", "div", "form", "h2", "h3", "img", "input", "label", "li", "nav", "ol", "p", "span", "svg", "ul"], Nh = lA.reduce((L, I) => { const $ = In.forwardRef((se, Pe) => { const { asChild: R, ...E } = se, e = R ? Fy : I; return In.useEffect(() => { window[Symbol.for("radix-ui")] = !0 }, []), In.createElement(e, zo({}, E, { ref: Pe })) }); return $.displayName = `Primitive.${I}`, { ...L, [I]: $ } }, {}); function uA(L, I) { L && Ay.flushSync(() => L.dispatchEvent(I)) } function cA(L, I = globalThis == null ? void 0 : globalThis.document) { const $ = Cf(L); In.useEffect(() => { const se = Pe => { Pe.key === "Escape" && $(Pe) }; return I.addEventListener("keydown", se), () => I.removeEventListener("keydown", se) }, [$, I]) } const Mm = "dismissableLayer.update", fA = "dismissableLayer.pointerDownOutside", hA = "dismissableLayer.focusOutside"; let f_; const pA = In.createContext({ layers: new Set, layersWithOutsidePointerEventsDisabled: new Set, branches: new Set }), dA = In.forwardRef((L, I) => { var $; const { disableOutsidePointerEvents: se = !1, onEscapeKeyDown: Pe, onPointerDownOutside: R, onFocusOutside: E, onInteractOutside: e, onDismiss: w, ...k } = L, i = In.useContext(pA), [_, y] = In.useState(null), h = ($ = _ == null ? void 0 : _.ownerDocument) !== null && $ !== void 0 ? $ : globalThis == null ? void 0 : globalThis.document, [, l] = In.useState({}), t = pd(I, b => y(b)), o = Array.from(i.layers), [r] = [...i.layersWithOutsidePointerEventsDisabled].slice(-1), n = o.indexOf(r), a = _ ? o.indexOf(_) : -1, s = i.layersWithOutsidePointerEventsDisabled.size > 0, u = a >= n, p = gA(b => { const g = b.target, f = [...i.branches].some(v => v.contains(g)); !u || f || (R == null || R(b), e == null || e(b), b.defaultPrevented || w == null || w()) }, h), c = vA(b => { const g = b.target;[...i.branches].some(v => v.contains(g)) || (E == null || E(b), e == null || e(b), b.defaultPrevented || w == null || w()) }, h); return cA(b => { a === i.layers.size - 1 && (Pe == null || Pe(b), !b.defaultPrevented && w && (b.preventDefault(), w())) }, h), In.useEffect(() => { if (_) return se && (i.layersWithOutsidePointerEventsDisabled.size === 0 && (f_ = h.body.style.pointerEvents, h.body.style.pointerEvents = "none"), i.layersWithOutsidePointerEventsDisabled.add(_)), i.layers.add(_), h_(), () => { se && i.layersWithOutsidePointerEventsDisabled.size === 1 && (h.body.style.pointerEvents = f_) } }, [_, h, se, i]), In.useEffect(() => () => { _ && (i.layers.delete(_), i.layersWithOutsidePointerEventsDisabled.delete(_), h_()) }, [_, i]), In.useEffect(() => { const b = () => l({}); return document.addEventListener(Mm, b), () => document.removeEventListener(Mm, b) }, []), In.createElement(Nh.div, zo({}, k, { ref: t, style: { pointerEvents: s ? u ? "auto" : "none" : void 0, ...L.style }, onFocusCapture: wf(L.onFocusCapture, c.onFocusCapture), onBlurCapture: wf(L.onBlurCapture, c.onBlurCapture), onPointerDownCapture: wf(L.onPointerDownCapture, p.onPointerDownCapture) })) }); function gA(L, I = globalThis == null ? void 0 : globalThis.document) { const $ = Cf(L), se = In.useRef(!1), Pe = In.useRef(() => { }); return In.useEffect(() => { const R = e => { if (e.target && !se.current) { let i = function () { E5(fA, $, k, { discrete: !0 }) }; var w = i; const k = { originalEvent: e }; e.pointerType === "touch" ? (I.removeEventListener("click", Pe.current), Pe.current = i, I.addEventListener("click", Pe.current, { once: !0 })) : i() } se.current = !1 }, E = window.setTimeout(() => { I.addEventListener("pointerdown", R) }, 0); return () => { window.clearTimeout(E), I.removeEventListener("pointerdown", R), I.removeEventListener("click", Pe.current) } }, [I, $]), { onPointerDownCapture: () => se.current = !0 } } function vA(L, I = globalThis == null ? void 0 : globalThis.document) { const $ = Cf(L), se = In.useRef(!1); return In.useEffect(() => { const Pe = R => { R.target && !se.current && E5(hA, $, { originalEvent: R }, { discrete: !1 }) }; return I.addEventListener("focusin", Pe), () => I.removeEventListener("focusin", Pe) }, [I, $]), { onFocusCapture: () => se.current = !0, onBlurCapture: () => se.current = !1 } } function h_() { const L = new CustomEvent(Mm); document.dispatchEvent(L) } function E5(L, I, $, { discrete: se }) { const Pe = $.originalEvent.target, R = new CustomEvent(L, { bubbles: !1, cancelable: !0, detail: $ }); I && Pe.addEventListener(L, I, { once: !0 }), se ? uA(Pe, R) : Pe.dispatchEvent(R) } const lv = "focusScope.autoFocusOnMount", uv = "focusScope.autoFocusOnUnmount", p_ = { bubbles: !1, cancelable: !0 }, mA = In.forwardRef((L, I) => { const { loop: $ = !1, trapped: se = !1, onMountAutoFocus: Pe, onUnmountAutoFocus: R, ...E } = L, [e, w] = In.useState(null), k = Cf(Pe), i = Cf(R), _ = In.useRef(null), y = pd(I, t => w(t)), h = In.useRef({ paused: !1, pause() { this.paused = !0 }, resume() { this.paused = !1 } }).current; In.useEffect(() => { if (se) { let n = function (p) { if (h.paused || !e) return; const c = p.target; e.contains(c) ? _.current = c : kc(_.current, { select: !0 }) }, a = function (p) { if (h.paused || !e) return; const c = p.relatedTarget; c !== null && (e.contains(c) || kc(_.current, { select: !0 })) }, s = function (p) { const c = document.activeElement; for (const b of p) b.removedNodes.length > 0 && (e != null && e.contains(c) || kc(e)) }; var t = n, o = a, r = s; document.addEventListener("focusin", n), document.addEventListener("focusout", a); const u = new MutationObserver(s); return e && u.observe(e, { childList: !0, subtree: !0 }), () => { document.removeEventListener("focusin", n), document.removeEventListener("focusout", a), u.disconnect() } } }, [se, e, h.paused]), In.useEffect(() => { if (e) { g_.add(h); const t = document.activeElement; if (!e.contains(t)) { const r = new CustomEvent(lv, p_); e.addEventListener(lv, k), e.dispatchEvent(r), r.defaultPrevented || (yA(kA(C5(e)), { select: !0 }), document.activeElement === t && kc(e)) } return () => { e.removeEventListener(lv, k), setTimeout(() => { const r = new CustomEvent(uv, p_); e.addEventListener(uv, i), e.dispatchEvent(r), r.defaultPrevented || kc(t ?? document.body, { select: !0 }), e.removeEventListener(uv, i), g_.remove(h) }, 0) } } }, [e, k, i, h]); const l = In.useCallback(t => { if (!$ && !se || h.paused) return; const o = t.key === "Tab" && !t.altKey && !t.ctrlKey && !t.metaKey, r = document.activeElement; if (o && r) { const n = t.currentTarget, [a, s] = xA(n); a && s ? !t.shiftKey && r === s ? (t.preventDefault(), $ && kc(a, { select: !0 })) : t.shiftKey && r === a && (t.preventDefault(), $ && kc(s, { select: !0 })) : r === n && t.preventDefault() } }, [$, se, h.paused]); return In.createElement(Nh.div, zo({ tabIndex: -1 }, E, { ref: y, onKeyDown: l })) }); function yA(L, { select: I = !1 } = {}) { const $ = document.activeElement; for (const se of L) if (kc(se, { select: I }), document.activeElement !== $) return } function xA(L) { const I = C5(L), $ = d_(I, L), se = d_(I.reverse(), L); return [$, se] } function C5(L) { const I = [], $ = document.createTreeWalker(L, NodeFilter.SHOW_ELEMENT, { acceptNode: se => { const Pe = se.tagName === "INPUT" && se.type === "hidden"; return se.disabled || se.hidden || Pe ? NodeFilter.FILTER_SKIP : se.tabIndex >= 0 ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_SKIP } }); for (; $.nextNode();)I.push($.currentNode); return I } function d_(L, I) { for (const $ of L) if (!bA($, { upTo: I })) return $ } function bA(L, { upTo: I }) { if (getComputedStyle(L).visibility === "hidden") return !0; for (; L;) { if (I !== void 0 && L === I) return !1; if (getComputedStyle(L).display === "none") return !0; L = L.parentElement } return !1 } function _A(L) { return L instanceof HTMLInputElement && "select" in L } function kc(L, { select: I = !1 } = {}) { if (L && L.focus) { const $ = document.activeElement; L.focus({ preventScroll: !0 }), L !== $ && _A(L) && I && L.select() } } const g_ = wA(); function wA() { let L = []; return { add(I) { const $ = L[0]; I !== $ && ($ == null || $.pause()), L = v_(L, I), L.unshift(I) }, remove(I) { var $; L = v_(L, I), ($ = L[0]) === null || $ === void 0 || $.resume() } } } function v_(L, I) { const $ = [...L], se = $.indexOf(I); return se !== -1 && $.splice(se, 1), $ } function kA(L) { return L.filter(I => I.tagName !== "A") } function TA(L, I) { return In.useReducer(($, se) => { const Pe = I[$][se]; return Pe ?? $ }, L) } const By = L => { const { present: I, children: $ } = L, se = AA(I), Pe = typeof $ == "function" ? $({ present: se.isPresent }) : In.Children.only($), R = pd(se.ref, Pe.ref); return typeof $ == "function" || se.isPresent ? In.cloneElement(Pe, { ref: R }) : null }; By.displayName = "Presence"; function AA(L) { const [I, $] = In.useState(), se = In.useRef({}), Pe = In.useRef(L), R = In.useRef("none"), E = L ? "mounted" : "unmounted", [e, w] = TA(E, { mounted: { UNMOUNT: "unmounted", ANIMATION_OUT: "unmountSuspended" }, unmountSuspended: { MOUNT: "mounted", ANIMATION_END: "unmounted" }, unmounted: { MOUNT: "mounted" } }); return In.useEffect(() => { const k = b0(se.current); R.current = e === "mounted" ? k : "none" }, [e]), Tm(() => { const k = se.current, i = Pe.current; if (i !== L) { const y = R.current, h = b0(k); L ? w("MOUNT") : h === "none" || (k == null ? void 0 : k.display) === "none" ? w("UNMOUNT") : w(i && y !== h ? "ANIMATION_OUT" : "UNMOUNT"), Pe.current = L } }, [L, w]), Tm(() => { if (I) { const k = _ => { const h = b0(se.current).includes(_.animationName); _.target === I && h && Ay.flushSync(() => w("ANIMATION_END")) }, i = _ => { _.target === I && (R.current = b0(se.current)) }; return I.addEventListener("animationstart", i), I.addEventListener("animationcancel", k), I.addEventListener("animationend", k), () => { I.removeEventListener("animationstart", i), I.removeEventListener("animationcancel", k), I.removeEventListener("animationend", k) } } else w("ANIMATION_END") }, [I, w]), { isPresent: ["mounted", "unmountSuspended"].includes(e), ref: In.useCallback(k => { k && (se.current = getComputedStyle(k)), $(k) }, []) } } function b0(L) { return (L == null ? void 0 : L.animationName) || "none" } let cv = 0; function MA() { In.useEffect(() => { var L, I; const $ = document.querySelectorAll("[data-radix-focus-guard]"); return document.body.insertAdjacentElement("afterbegin", (L = $[0]) !== null && L !== void 0 ? L : m_()), document.body.insertAdjacentElement("beforeend", (I = $[1]) !== null && I !== void 0 ? I : m_()), cv++, () => { cv === 1 && document.querySelectorAll("[data-radix-focus-guard]").forEach(se => se.remove()), cv-- } }, []) } function m_() { const L = document.createElement("span"); return L.setAttribute("data-radix-focus-guard", ""), L.tabIndex = 0, L.style.cssText = "outline: none; opacity: 0; position: fixed; pointer-events: none", L } var ku = function () { return ku = Object.assign || function (I) { for (var $, se = 1, Pe = arguments.length; se < Pe; se++) { $ = arguments[se]; for (var R in $) Object.prototype.hasOwnProperty.call($, R) && (I[R] = $[R]) } return I }, ku.apply(this, arguments) }; function L5(L, I) { var $ = {}; for (var se in L) Object.prototype.hasOwnProperty.call(L, se) && I.indexOf(se) < 0 && ($[se] = L[se]); if (L != null && typeof Object.getOwnPropertySymbols == "function") for (var Pe = 0, se = Object.getOwnPropertySymbols(L); Pe < se.length; Pe++)I.indexOf(se[Pe]) < 0 && Object.prototype.propertyIsEnumerable.call(L, se[Pe]) && ($[se[Pe]] = L[se[Pe]]); return $ } function SA(L, I, $) { if ($ || arguments.length === 2) for (var se = 0, Pe = I.length, R; se < Pe; se++)(R || !(se in I)) && (R || (R = Array.prototype.slice.call(I, 0, se)), R[se] = I[se]); return L.concat(R || Array.prototype.slice.call(I)) } var H0 = "right-scroll-bar-position", q0 = "width-before-scroll-bar", EA = "with-scroll-bars-hidden", CA = "--removed-body-scroll-bar-size"; function LA(L, I) { return typeof L == "function" ? L(I) : L && (L.current = I), L } function PA(L, I) { var $ = In.useState(function () { return { value: L, callback: I, facade: { get current() { return $.value }, set current(se) { var Pe = $.value; Pe !== se && ($.value = se, $.callback(se, Pe)) } } } })[0]; return $.callback = I, $.facade } function OA(L, I) { return PA(I || null, function ($) { return L.forEach(function (se) { return LA(se, $) }) }) } function IA(L) { return L } function RA(L, I) { I === void 0 && (I = IA); var $ = [], se = !1, Pe = { read: function () { if (se) throw new Error("Sidecar: could not `read` from an `assigned` medium. `read` could be used only with `useMedium`."); return $.length ? $[$.length - 1] : L }, useMedium: function (R) { var E = I(R, se); return $.push(E), function () { $ = $.filter(function (e) { return e !== E }) } }, assignSyncMedium: function (R) { for (se = !0; $.length;) { var E = $; $ = [], E.forEach(R) } $ = { push: function (e) { return R(e) }, filter: function () { return $ } } }, assignMedium: function (R) { se = !0; var E = []; if ($.length) { var e = $; $ = [], e.forEach(R), E = $ } var w = function () { var i = E; E = [], i.forEach(R) }, k = function () { return Promise.resolve().then(w) }; k(), $ = { push: function (i) { E.push(i), k() }, filter: function (i) { return E = E.filter(i), $ } } } }; return Pe } function zA(L) { L === void 0 && (L = {}); var I = RA(null); return I.options = ku({ async: !0, ssr: !1 }, L), I } var P5 = function (L) { var I = L.sideCar, $ = L5(L, ["sideCar"]); if (!I) throw new Error("Sidecar: please provide `sideCar` property to import the right car"); var se = I.read(); if (!se) throw new Error("Sidecar medium not found"); return In.createElement(se, ku({}, $)) }; P5.isSideCarExport = !0; function DA(L, I) { return L.useMedium(I), P5 } var O5 = zA(), fv = function () { }, B1 = In.forwardRef(function (L, I) { var $ = In.useRef(null), se = In.useState({ onScrollCapture: fv, onWheelCapture: fv, onTouchMoveCapture: fv }), Pe = se[0], R = se[1], E = L.forwardProps, e = L.children, w = L.className, k = L.removeScrollBar, i = L.enabled, _ = L.shards, y = L.sideCar, h = L.noIsolation, l = L.inert, t = L.allowPinchZoom, o = L.as, r = o === void 0 ? "div" : o, n = L5(L, ["forwardProps", "children", "className", "removeScrollBar", "enabled", "shards", "sideCar", "noIsolation", "inert", "allowPinchZoom", "as"]), a = y, s = OA([$, I]), u = ku(ku({}, n), Pe); return In.createElement(In.Fragment, null, i && In.createElement(a, { sideCar: O5, removeScrollBar: k, shards: _, noIsolation: h, inert: l, setCallbacks: R, allowPinchZoom: !!t, lockRef: $ }), E ? In.cloneElement(In.Children.only(e), ku(ku({}, u), { ref: s })) : In.createElement(r, ku({}, u, { className: w, ref: s }), e)) }); B1.defaultProps = { enabled: !0, removeScrollBar: !0, inert: !1 }; B1.classNames = { fullWidth: q0, zeroRight: H0 }; var y_, FA = function () { if (y_) return y_; if (typeof __webpack_nonce__ < "u") return __webpack_nonce__ }; function BA() { if (!document) return null; var L = document.createElement("style"); L.type = "text/css"; var I = FA(); return I && L.setAttribute("nonce", I), L } function NA(L, I) { L.styleSheet ? L.styleSheet.cssText = I : L.appendChild(document.createTextNode(I)) } function jA(L) { var I = document.head || document.getElementsByTagName("head")[0]; I.appendChild(L) } var UA = function () { var L = 0, I = null; return { add: function ($) { L == 0 && (I = BA()) && (NA(I, $), jA(I)), L++ }, remove: function () { L--, !L && I && (I.parentNode && I.parentNode.removeChild(I), I = null) } } }, VA = function () { var L = UA(); return function (I, $) { In.useEffect(function () { return L.add(I), function () { L.remove() } }, [I && $]) } }, I5 = function () { var L = VA(), I = function ($) { var se = $.styles, Pe = $.dynamic; return L(se, Pe), null }; return I }, HA = { left: 0, top: 0, right: 0, gap: 0 }, hv = function (L) { return parseInt(L || "", 10) || 0 }, qA = function (L) { var I = window.getComputedStyle(document.body), $ = I[L === "padding" ? "paddingLeft" : "marginLeft"], se = I[L === "padding" ? "paddingTop" : "marginTop"], Pe = I[L === "padding" ? "paddingRight" : "marginRight"]; return [hv($), hv(se), hv(Pe)] }, GA = function (L) { if (L === void 0 && (L = "margin"), typeof window > "u") return HA; var I = qA(L), $ = document.documentElement.clientWidth, se = window.innerWidth; return { left: I[0], top: I[1], right: I[2], gap: Math.max(0, se - $ + I[2] - I[0]) } }, WA = I5(), ZA = function (L, I, $, se) { var Pe = L.left, R = L.top, E = L.right, e = L.gap; return $ === void 0 && ($ = "margin"), ` .`.concat(EA, ` { overflow: hidden `).concat(se, `; @@ -4068,7 +4068,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho }) }) } function z9({ csvData: L, plotlyData: I, yaxisOptions: $, traceType: se, traceColor: Pe, traceName: R, options: E, increasingColor: e, decreasingColor: w }) { console.log("options", E); const k = I.data[0] || {}; k.xaxis === void 0 && (k.xaxis = "x"), k.yaxis === void 0 && (k.yaxis = "y"); let i = k.yaxis, _; const h = Object.keys(I.layout).filter(o => o.startsWith("yaxis")).map(o => I.layout[o]).filter(o => o.side === "left" && (o.overlaying === "y" || o.fixedrange !== void 0 && o.fixedrange === !0)).length > 0 ? " " : ""; if ($.sameYaxis !== !0) { const o = Object.keys(I.layout).filter(r => r.startsWith("yaxis")).map(r => I.layout[r]); _ = `y${o.length + 1}`, i = `yaxis${o.length + 1}`, I.layout[i] = { ...I9, title: { text: R, font: { size: 14 }, standoff: 0 }, ticksuffix: h, layer: "below traces" } } else _ = k.yaxis.replace("yaxis", "y"); const l = { type: se, name: R, showlegend: !0, yaxis: _ }; let t = {}; if (["scatter", "bar"].includes(se)) { if (!L || L.length === 0) return I; const o = L.findIndex(n => n[E.y] !== null && n[E.y] !== 0); if (o === -1) return I; const r = { x: [], y: [], customdata: [] }; L.forEach(n => { let a = n[E.y]; r.customdata.push(a), $.percentChange && (se === "scatter" || se === "line") && (a = (n[E.y] - L[o][E.y]) / L[o][E.y]), r.x.push(n[E.x]), r.y.push(a) }), t = { ...l, x: r.x, y: r.y, customdata: r.customdata, hovertemplate: "%{customdata:.2f}", connectgaps: !0, marker: { color: Pe } }, se === "bar" && (t.orientation = E.orientation, t.marker.opacity = .7, t.connectgaps = void 0, t.hovertemplate = void 0, t.customdata = void 0) } else if (se === "candlestick") { const o = { x: [], open: [], high: [], low: [], close: [] }; L.forEach(r => { o.x.push(r[E.x]), o.open.push(r[E.open]), o.high.push(r[E.high]), o.low.push(r[E.low]), o.close.push(r[E.close]) }), t = { ...l, x: o.x, open: o.open, high: o.high, low: o.low, close: o.close, increasing: { line: { color: e, width: .8 }, fillcolor: e }, decreasing: { line: { color: w, width: .8 }, fillcolor: w } } } return { ...I, data: [...I.data, t] } } const A_ = { padding: "5px 2px 2px 5px", margin: "2px 0" }; function D9({ open: L, close: I, addAnnotation: $, deleteAnnotation: se, popupData: Pe }) { var l, t, o, r, n; const R = { text: "", color: "#0088CC", size: 18, bordercolor: "#822661", yanchor: "above" }, [E, e] = In.useState(R), [w, k] = In.useState(R); Pe && Pe !== E && Pe.annotation && (Pe.annotation = (Pe == null ? void 0 : Pe.annotation) || {}, e(Pe), k(Pe)); function i() { console.log("closing"), e(R), k(R), I() } function _(a) { console.log(a.target.id.replace("addtext_", ""), a.target.value); const s = a.target.id.replace("addtext_", ""), u = a.target.value; k({ ...w, [s]: u }) } function y() { console.log("submitting", w), w.text !== "" ? (E != null && E.annotation && k({ ...w, annotation: E.annotation }), $(w), I()) : (document.getElementById("popup_textarea_warning").style.display = "block", document.getElementById("addtext_text").style.border = "1px solid red") } function h() { se(E), i() } return hr(dd, { title: "Add Text to Chart", description: "Change the titles on the chart.", open: L, close: i, children: Xr("div", { id: "popup_title", className: "popup_content", children: [Xr("div", { style: { display: "flex", flexDirection: "column", gap: 6 }, children: [Xr("div", { style: { marginBottom: 20 }, children: [Xr("label", { htmlFor: "popup_text", children: [hr("b", { children: "Text:" }), hr("div", { id: "popup_textarea_warning", className: "popup_warning", children: "Text is required" })] }), hr("textarea", { id: "addtext_text", style: { ...A_, width: "100%", maxWidth: "100%", maxHeight: "200px", marginTop: "8px" }, rows: 4, cols: 50, placeholder: "Enter text here", onChange: _, defaultValue: ((l = E == null ? void 0 : E.annotation) == null ? void 0 : l.text) || (w == null ? void 0 : w.text) })] }), Xr("div", { style: { display: "flex", gap: 15, alignItems: "center", flexWrap: "wrap", columnCount: 2, justifyContent: "space-between", marginBottom: 20 }, children: [hr("label", { htmlFor: "addtext_color", children: hr("b", { children: "Font color" }) }), hr("input", { type: "color", id: "addtext_color", style: { margin: "2px 2px 2px 15px" }, defaultValue: ((t = E == null ? void 0 : E.annotation) == null ? void 0 : t.color) || (w == null ? void 0 : w.color), onChange: _ }), hr("label", { htmlFor: "addtext_bordercolor", style: { marginLeft: 20 }, children: hr("b", { children: "Border color" }) }), hr("input", { type: "color", id: "addtext_bordercolor", style: { margin: "2px 2px 10px 15px" }, defaultValue: ((o = E == null ? void 0 : E.annotation) == null ? void 0 : o.bordercolor) || (w == null ? void 0 : w.bordercolor), onChange: _ }), hr("label", { htmlFor: "addtext_size", children: hr("b", { children: "Font size" }) }), hr("input", { style: { ...A_, width: "52px", margin: "0px 0px 0px 2px" }, type: "number", id: "addtext_size", onChange: _, defaultValue: ((r = E == null ? void 0 : E.annotation) == null ? void 0 : r.size) || (w == null ? void 0 : w.size) }), Xr("div", { children: [hr("label", { htmlFor: "addtext_yanchor", style: { marginRight: 31 }, children: hr("b", { children: "Position" }) }), Xr("select", { id: "addtext_yanchor", name: "yanchor", style: { width: "100px" }, defaultValue: ((n = E == null ? void 0 : E.annotation) == null ? void 0 : n.yanchor) || (w == null ? void 0 : w.yanchor), onChange: _, children: [hr("option", { value: "above", children: "Above" }), hr("option", { value: "below", children: "Below" })] })] })] })] }), Xr("div", { style: { float: "right", marginTop: 20 }, children: [hr("button", { className: "_btn-tertiary ph-capture", id: "title_cancel", onClick: i, children: "Cancel" }), hr("button", { className: "_btn ph-capture", id: "title_delete", onClick: h, children: "Delete" }), hr("button", { className: "_btn ph-capture", id: "title_submit", onClick: y, children: "Submit" })] })] }) }) } function F9({ plotlyData: L, open: I, close: $, defaultTitle: se, updateTitle: Pe, updateAxesTitles: R }) { const [E, e] = In.useState(se), w = Object.keys(L.layout || {}).filter(y => y.startsWith("yaxis") && L.layout[y].range != null), k = Object.keys(L.layout || {}).filter(y => { var h; return y.startsWith("xaxis") && L.layout[y].showticklabels != null && ((h = L.layout[y]) == null ? void 0 : h.anchor) }), [i, _] = In.useState({}); return hr(dd, { title: "Chart Titles", description: "Change the titles on the chart.", open: I, close: $, children: Xr("div", { id: "popup_title", className: "popup_content", children: [Xr("div", { style: { display: "flex", flexDirection: "column", gap: 0 }, children: [Xr("div", { children: [hr("label", { htmlFor: "title_text", children: hr("b", { children: "Title:" }) }), hr("textarea", { id: "title_text", style: { ...q5, width: "100%", maxWidth: "100%", maxHeight: "200px", marginTop: "8px", marginLeft: "0px" }, rows: 2, cols: 20, value: E, onChange: y => e(y.target.value) })] }), hr("div", { id: "xaxis_div", className: "csv_column_container", style: { marginTop: 5, marginBottom: -5 }, children: k.map((y, h) => { var l, t; return Xr("div", { style: { marginTop: 5, marginBottom: 5 }, children: [hr("label", { htmlFor: `title_${y}`, children: h === 0 ? hr("b", { children: "X axis:" }) : Xr("b", { children: ["X axis ", h + 1, ":"] }) }), hr("input", { id: `title_${y}`, style: { marginLeft: "0px", padding: "5px 2px 2px 5px" }, type: "text", defaultValue: ((t = (l = L == null ? void 0 : L.layout[y]) == null ? void 0 : l.title) == null ? void 0 : t.text) || "", onChange: o => { _({ ...i, [y]: o.target.value }) } })] }, y) }) }), hr("div", { id: "yaxis_div", className: "csv_column_container", style: { marginTop: 5, marginBottom: 5 }, children: w.map((y, h) => { var l, t; return Xr("div", { style: { marginTop: 10 }, children: [hr("label", { htmlFor: `title_${y}`, children: h === 0 ? hr("b", { children: "Y axis:" }) : Xr("b", { children: ["Y axis ", h + 1, ":"] }) }), hr("input", { id: `title_${y}`, style: { marginLeft: "0px", padding: "5px 2px 2px 5px" }, type: "text", defaultValue: ((t = (l = L == null ? void 0 : L.layout[y]) == null ? void 0 : l.title) == null ? void 0 : t.text) || "", onChange: o => { _({ ...i, [y]: o.target.value }) } })] }, y) }) })] }), Xr("div", { style: { float: "right", marginTop: 20 }, children: [hr("button", { className: "_btn-tertiary ph-capture", id: "title_cancel", onClick: $, children: "Cancel" }), hr("button", { className: "_btn ph-capture", id: "title_submit", onClick: () => { Pe(E), R(i), $() }, children: "Submit" })] })] }) }) } function Cm() { return Cm = Object.assign ? Object.assign.bind() : function (L) { for (var I = 1; I < arguments.length; I++) { var $ = arguments[I]; for (var se in $) Object.prototype.hasOwnProperty.call($, se) && (L[se] = $[se]) } return L }, Cm.apply(this, arguments) } var G5 = ["shift", "alt", "meta", "mod", "ctrl"], B9 = { esc: "escape", return: "enter", ".": "period", ",": "comma", "-": "slash", " ": "space", "`": "backquote", "#": "backslash", "+": "bracketright", ShiftLeft: "shift", ShiftRight: "shift", AltLeft: "alt", AltRight: "alt", MetaLeft: "meta", MetaRight: "meta", OSLeft: "meta", OSRight: "meta", ControlLeft: "ctrl", ControlRight: "ctrl" }; function Ic(L) { return (B9[L] || L).trim().toLowerCase().replace(/key|digit|numpad|arrow/, "") } function N9(L) { return G5.includes(L) } function dv(L, I) { return I === void 0 && (I = ","), L.split(I) } function gv(L, I, $) { I === void 0 && (I = "+"); var se = L.toLocaleLowerCase().split(I).map(function (E) { return Ic(E) }), Pe = { alt: se.includes("alt"), ctrl: se.includes("ctrl") || se.includes("control"), shift: se.includes("shift"), meta: se.includes("meta"), mod: se.includes("mod") }, R = se.filter(function (E) { return !G5.includes(E) }); return Cm({}, Pe, { keys: R, description: $ }) } (function () { typeof document < "u" && (document.addEventListener("keydown", function (L) { L.key !== void 0 && W5([Ic(L.key), Ic(L.code)]) }), document.addEventListener("keyup", function (L) { L.key !== void 0 && Z5([Ic(L.key), Ic(L.code)]) })), typeof window < "u" && window.addEventListener("blur", function () { Rc.clear() }) })(); var Rc = new Set; function j9(L, I) { I === void 0 && (I = ","); var $ = Array.isArray(L) ? L : L.split(I); return $.every(function (se) { return Rc.has(se.trim().toLowerCase()) }) } function W5(L) { var I = Array.isArray(L) ? L : [L]; Rc.has("meta") && Rc.forEach(function ($) { return !N9($) && Rc.delete($.toLowerCase()) }), I.forEach(function ($) { return Rc.add($.toLowerCase()) }) } function Z5(L) { var I = Array.isArray(L) ? L : [L]; L === "meta" ? Rc.clear() : I.forEach(function ($) { return Rc.delete($.toLowerCase()) }) } function U9(L, I, $) { (typeof $ == "function" && $(L, I) || $ === !0) && L.preventDefault() } function V9(L, I, $) { return typeof $ == "function" ? $(L, I) : $ === !0 || $ === void 0 } function H9(L) { return Y5(L, ["input", "textarea", "select"]) } function Y5(L, I) { var $ = L.target; I === void 0 && (I = !1); var se = $ && $.tagName; return I instanceof Array ? !!(se && I && I.some(function (Pe) { return Pe.toLowerCase() === se.toLowerCase() })) : !!(se && I && I === !0) } function q9(L, I) { return L.length === 0 && I ? (console.warn('A hotkey has the "scopes" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a '), !0) : I ? L.some(function ($) { return I.includes($) }) || L.includes("*") : !0 } var G9 = function (I, $, se) { se === void 0 && (se = !1); var Pe = $.alt, R = $.meta, E = $.mod, e = $.shift, w = $.ctrl, k = $.keys, i = I.key, _ = I.code, y = I.ctrlKey, h = I.metaKey, l = I.shiftKey, t = I.altKey, o = Ic(_), r = i.toLowerCase(); if (!se) { if (Pe === !t && r !== "alt" || e === !l && r !== "shift") return !1; if (E) { if (!h && !y) return !1 } else if (R === !h && r !== "meta" && r !== "os" || w === !y && r !== "ctrl" && r !== "control") return !1 } return k && k.length === 1 && (k.includes(r) || k.includes(o)) ? !0 : k ? j9(k) : !k }, W9 = In.createContext(void 0), Z9 = function () { return In.useContext(W9) }; function X5(L, I) { return L && I && typeof L == "object" && typeof I == "object" ? Object.keys(L).length === Object.keys(I).length && Object.keys(L).reduce(function ($, se) { return $ && X5(L[se], I[se]) }, !0) : L === I } var Y9 = In.createContext({ hotkeys: [], enabledScopes: [], toggleScope: function () { }, enableScope: function () { }, disableScope: function () { } }), X9 = function () { return In.useContext(Y9) }; function $9(L) { var I = In.useRef(void 0); return X5(I.current, L) || (I.current = L), I.current } var M_ = function (I) { I.stopPropagation(), I.preventDefault(), I.stopImmediatePropagation() }, K9 = typeof window < "u" ? In.useLayoutEffect : In.useEffect; function _c(L, I, $, se) { var Pe = In.useRef(null), R = In.useRef(!1), E = $ instanceof Array ? se instanceof Array ? void 0 : se : $, e = L instanceof Array ? L.join(E == null ? void 0 : E.splitKey) : L, w = $ instanceof Array ? $ : se instanceof Array ? se : void 0, k = In.useCallback(I, w ?? []), i = In.useRef(k); w ? i.current = k : i.current = I; var _ = $9(E), y = X9(), h = y.enabledScopes, l = Z9(); return K9(function () { if (!((_ == null ? void 0 : _.enabled) === !1 || !q9(h, _ == null ? void 0 : _.scopes))) { var t = function (s, u) { var p; if (u === void 0 && (u = !1), !(H9(s) && !Y5(s, _ == null ? void 0 : _.enableOnFormTags)) && !(_ != null && _.ignoreEventWhen != null && _.ignoreEventWhen(s))) { if (Pe.current !== null && document.activeElement !== Pe.current && !Pe.current.contains(document.activeElement)) { M_(s); return } (p = s.target) != null && p.isContentEditable && !(_ != null && _.enableOnContentEditable) || dv(e, _ == null ? void 0 : _.splitKey).forEach(function (c) { var b, g = gv(c, _ == null ? void 0 : _.combinationKey); if (G9(s, g, _ == null ? void 0 : _.ignoreModifiers) || (b = g.keys) != null && b.includes("*")) { if (u && R.current) return; if (U9(s, g, _ == null ? void 0 : _.preventDefault), !V9(s, g, _ == null ? void 0 : _.enabled)) { M_(s); return } i.current(s, g), u || (R.current = !0) } }) } }, o = function (s) { s.key !== void 0 && (W5(Ic(s.code)), ((_ == null ? void 0 : _.keydown) === void 0 && (_ == null ? void 0 : _.keyup) !== !0 || _ != null && _.keydown) && t(s)) }, r = function (s) { s.key !== void 0 && (Z5(Ic(s.code)), R.current = !1, _ != null && _.keyup && t(s, !0)) }, n = Pe.current || (E == null ? void 0 : E.document) || document; return n.addEventListener("keyup", r), n.addEventListener("keydown", o), l && dv(e, _ == null ? void 0 : _.splitKey).forEach(function (a) { return l.addHotkey(gv(a, _ == null ? void 0 : _.combinationKey, _ == null ? void 0 : _.description)) }), function () { n.removeEventListener("keyup", r), n.removeEventListener("keydown", o), l && dv(e, _ == null ? void 0 : _.splitKey).forEach(function (a) { return l.removeHotkey(gv(a, _ == null ? void 0 : _.combinationKey, _ == null ? void 0 : _.description)) }) } } }, [e, _, h]), Pe } function Lc(L = !0) { return new Promise(I => { window.MODEBAR || (window.MODEBAR = window.document.getElementsByClassName("modebar-container")[0], window.MODEBAR.style.cssText = `${window.MODEBAR.style.cssText}; display:flex;`), window.MODEBAR && (window.MODEBAR.style.cssText.includes("display: none") || !L ? window.MODEBAR.style.cssText = `${window.MODEBAR.style.cssText}; display:flex;` : window.MODEBAR.style.cssText = `${window.MODEBAR.style.cssText}; display:none;`, I(!0)) }) } function J9({ setModal: L, changeTheme: I, autoScaling: $, Loading: se, changeColor: Pe, downloadFinished: R }) { return _c("ctrl+shift+t", () => { L({ name: "titleDialog" }) }, { preventDefault: !0 }), _c("ctrl+t", () => { L({ name: "textDialog" }) }, { preventDefault: !0 }), _c("ctrl+o", () => { L({ name: "overlayChart" }) }, { preventDefault: !0 }), _c(["ctrl+shift+h", "ctrl+h"], () => { Lc() }, { preventDefault: !0 }), _c("ctrl+e", () => { Pe(!0) }, { preventDefault: !0 }), _c("ctrl+shift+s", async () => { L({ name: "downloadCsv" }), await s_(document.getElementById("plotlyChart"), R) }, { preventDefault: !0 }), _c("ctrl+s", async () => { Lc(), u_("MainChart", Lc, se, R) }, { preventDefault: !0 }), _c("ctrl+w", () => { window.close() }, { preventDefault: !0 }), { plotGlPixelRatio: 1, scrollZoom: !0, responsive: !0, displaylogo: !1, displayModeBar: !0, modeBarButtonsToRemove: ["lasso2d", "select2d", "downloadImage"], modeBarButtons: [[{ name: "Download CSV (Ctrl+Shift+S)", icon: qu.downloadCsv, click: async function (e) { await s_(e, R) } }, { name: "Download Chart as Image (Ctrl+S)", icon: qu.downloadImage, click: async function () { Lc(), await u_("MainChart", Lc, se, R) } }], [{ name: "Edit Color (Ctrl+E)", icon: qu.changeColor, click: function () { Pe(!0) } }, "drawline", "drawopenpath", "drawcircle", "drawrect", "eraseshape"], [{ name: "Overlay chart from CSV (Ctrl+O)", icon: qu.plotCsv, click: function () { L({ name: "overlayChart" }) } }, { name: "Add Text (Ctrl+T)", icon: qu.addText, click: function () { L({ name: "textDialog", data: { text: "" } }) } }, { name: "Change Titles (Ctrl+Shift+T)", icon: qu.changeTitle, click: function () { L({ name: "titleDialog" }) } }, { name: "Change Theme", icon: qu.sunIcon, click: function () { I(!0) } }], ["hoverClosestCartesian", "hoverCompareCartesian", "toggleSpikelines"], [{ name: "Auto Scale (Ctrl+Shift+A)", icon: ds.Icons.autoscale, click: function () { $(!0) } }, "zoomIn2d", "zoomOut2d", "autoScale2d", "zoom2d", "pan2d"]] } } async function Q9({ plotData: L, volumeBars: I, setMaximizePlot: $ }) { const se = Object.keys(L.layout).filter(i => i.startsWith("xaxis")).filter(i => L.layout[i].showticklabels || L.layout[i].matches === void 0), Pe = L.data.filter(i => { var _; return ((_ = i == null ? void 0 : i.name) == null ? void 0 : _.trim()) === "Volume" }), R = {}, E = I || { old_nticks: {} }, e = window.innerWidth, w = window.innerHeight, k = w > 420 && e < 920 ? 8 : w > 420 && e < 500 ? 9 : 7; return e < 750 ? (Pe.forEach(i => { i.type === "bar" && (i.opacity = 1, i.marker.line.width = .09, I.yaxis === void 0 && (E.yaxis = `yaxis${i.yaxis.replace("y", "")}`, R[`${E.yaxis}.tickfont.size`] = k, E.tickfont = L.layout[E.yaxis].tickfont || {}, L.layout.margin.l -= 40)) }), se.forEach(i => { var _; ((_ = I.old_nticks) == null ? void 0 : _[i]) === void 0 && (R[`${i}.nticks`] = 6, E.old_nticks[i] = L.layout[i].nticks || 10) }), $(!0), await Lc()) : window.MODEBAR.style.cssText.includes("display: none") && (await Lc(!1), $(!1), I.old_nticks !== void 0 && se.forEach(i => { I.old_nticks[i] !== void 0 && (R[`${i}.nticks`] = E.old_nticks[i], E.old_nticks[i] = void 0) }), I.yaxis !== void 0 && Pe.forEach(i => { i.type === "bar" && (i.opacity = .5, i.marker.line.width = .2, R[`${E.yaxis}.tickfont.size`] = E.tickfont.size + 3, L.layout.margin.l += 40, E.yaxis = void 0) })), { volume_update: E, layout_update: R, plotData: L } } const eM = j7(R7); function $5(L, I) { var se, Pe; I || (I = [(se = L[0]) == null ? void 0 : se.x[L[0].x.length - 1e3], (Pe = L[0]) == null ? void 0 : Pe.x[L[0].x.length - 1]]); const $ = []; return L.forEach(R => { const E = { ...R }, e = ["x", "y", "low", "high", "open", "close", "text", "customdata"], w = R.x ? R.x : [], k = []; for (let _ = 0; _ < w.length; _++)w[_] >= I[0] && w[_] <= I[1] && k.push(_); e.forEach(_ => { R[_] && Array.isArray(R[_]) && (E[_] = R[_].filter((y, h) => k.includes(h))) }), ["marker", "line"].forEach(_ => { var y; (y = R[_]) != null && y.color && Array.isArray(R[_].color) && (E[_] = { ...R[_] }, E[_].color = R[_].color.filter((h, l) => k.includes(l))) }), $.push(E) }), $.length === 0 ? L : $ } async function S_({ event: L, figure: I }) { var $, se; try { const Pe = I.data.filter(e => e.x !== void 0 && e.x.length > 0 && e.x[0] !== void 0); if (Pe.length === 0) return I; const R = L ? [L["xaxis.range[0]"], L["xaxis.range[1]"]] : [($ = Pe[0]) == null ? void 0 : $.x[Pe[0].x.length - 1e3], (se = Pe[0]) == null ? void 0 : se.x[Pe[0].x.length - 1]], E = $5(I.data, R); return I.data = E, I.layout.xaxis.range = R, I } catch (Pe) { console.log("error", Pe) } } function tM({ json: L, date: I, cmd: $, title: se, globals: Pe, theme: R, info: E }) { - var De, Ee, Me, he; const e = P7(); In.useEffect(() => { e && e.capture("chart", E) }, []), L.layout.width = void 0, L.layout.height = void 0, (Ee = (De = L.layout) == null ? void 0 : De.title) != null && Ee.text && (L.layout.title.text = ""); const [w, k] = In.useState(L), [i, _] = In.useState({}), [y, h] = In.useState(!1), [l, t] = In.useState(se), [o, r] = In.useState({}), [n, a] = In.useState(!1), [s, u] = In.useState({ name: "" }), [p, c] = In.useState(!1), [b, g] = In.useState(null), [f, v] = In.useState({ old_nticks: {} }), [m, x] = In.useState(!1), [T, d] = In.useState(!1), [M, A] = In.useState(!1), [C, P] = In.useState(w), [O, z] = In.useState([]), [B, Y] = In.useState(!1), [D, G] = In.useState(!0), [V, j] = In.useState(!1), [W, Z] = In.useState(!1), [ie, te] = In.useState(!1), [J, X] = In.useState({}), [ee, re] = In.useState([]), [oe, ue] = In.useState([]), ce = () => u({ name: "" }); function de(fe) { var be, Ie, Te, Ne, qe; console.log("onDeleteAnnotation", fe); const ae = (Ie = (be = C == null ? void 0 : C.layout) == null ? void 0 : be.annotations) == null ? void 0 : Ie.findIndex(ve => ve.text === fe.text); console.log("index", ae), ae > -1 && ((Ne = (Te = C == null ? void 0 : C.layout) == null ? void 0 : Te.annotations) == null || Ne.splice(ae, 1), P({ ...C }), z((qe = C == null ? void 0 : C.layout) == null ? void 0 : qe.annotations)) } function me(fe) { V7({ plotData: C, popupData: fe, setPlotData: P, setModal: u, setOnAnnotationClick: X, setAnnotations: z, onAnnotationClick: J, ohlcAnnotation: ee, setOhlcAnnotation: re, annotations: O, plotDiv: b }) } In.useEffect(() => { T && (u({ name: "downloadFinished" }), d(!1)) }, [T]), In.useEffect(() => { o && Object.keys(o).length > 0 && (Object.keys(o).forEach(fe => { C.layout[fe].title = { ...C.layout[fe].title || {}, text: o[fe] }, C.layout[fe].showticklabels = !0 }), r({})) }, [o]); function _e(fe) { const ae = b.layout.shapes; if (!ae || ae.length === 0) return; const be = ae[ae.length - 1]; be.line.color = fe, ds.update(b, {}, { shapes: ae }) } function Se(fe, ae = !1) { const be = i[fe] || document.querySelector(`[data-title="${fe}"]`); ae ? (be.style.border = "transparent", be.style.boxShadow = "none") : (be.style.border = "1px solid rgba(0, 151, 222, 1.0)", be.style.borderRadius = "5px", be.style.borderpadding = "5px", be.style.boxShadow = "0 0 5px rgba(0, 151, 222, 1.0)"), _({ ...i, [fe]: be }) } function we() { const fe = "Auto Scale (Ctrl+Shift+A)", ae = i[fe] || document.querySelector(`[data-title="${fe}"]`); let be = !0; ae.style.border === "transparent" ? (b.removeAllListeners("plotly_relayout"), be = !1, b.on("plotly_relayout", Sh(async function (Ie) { if (Ie["xaxis.range[0]"] !== void 0) if (M) { const Te = { ...w }; await S_({ event: Ie, figure: Te }).then(async Ne => { P(Ne), ds.react(b, Ne.data, Ne.layout); const qe = await c_(Ie, b); ue(qe.yaxis_fixedrange), ds.update(b, {}, qe.to_update) }) } else { const Te = await c_(Ie, b); ue(Te.yaxis_fixedrange), ds.update(b, {}, Te.to_update) } }, 100))) : (b.removeAllListeners("plotly_relayout"), oe.forEach(Ie => { b.layout[Ie].fixedrange = !1 }), ue([]), M && b.on("plotly_relayout", Sh(async function (Ie) { if (Ie["xaxis.range[0]"] === void 0) return; const Te = { ...w }; await S_({ event: Ie, figure: Te }).then(async Ne => { P(Ne), ds.react(b, Ne.data, Ne.layout) }) }, 100))), Se(fe, be) } function xe() { const fe = "Edit Color (Ctrl+E)", ae = i[fe] || document.querySelector(`[data-title="${fe}"]`); let be = !0; ae.style.border === "transparent" && (be = !1), te(!be), Se(fe, be) } return In.useEffect(() => { V && (console.log("activateAutoScale", !V), we(), j(!1)) }, [V]), In.useEffect(() => { W && (xe(), Z(!1)) }, [W]), In.useEffect(() => { if (B) try { console.log("changeTheme", B); const fe = C == null ? void 0 : C.data.filter(qe => { var ve; return ((ve = qe == null ? void 0 : qe.name) == null ? void 0 : ve.trim()) === "Volume" }), ae = !D; window.document.body.style.backgroundColor = ae ? "#000" : "#fff", C.layout.font = { ...C.layout.font || {}, color: ae ? "#fff" : "#000" }; const be = ae ? qu.sunIcon : qu.moonIcon; document.querySelector('[data-title="Change Theme"]').getElementsByTagName("path")[0].setAttribute("d", be.path), document.querySelector('[data-title="Change Theme"]').getElementsByTagName("svg")[0].setAttribute("viewBox", be.viewBox); const Ne = ae ? { "#009600": "#00ACFF", "#c80000": "#e4003a" } : { "#e4003a": "#c80000", "#00ACFF": "#009600" }; fe.forEach(qe => { qe.type === "bar" && Array.isArray(qe.marker.color) && (qe.marker.color = qe.marker.color.map(ve => Ne[ve] || ve)) }), C.layout.template = ae ? $7 : K7, P({ ...C }), ds.react(b, C.data, C.layout), G(ae), Y(!1) } catch (fe) { console.log("error", fe) } }, [B]), In.useEffect(() => { + var De, Ee, Me, he; const e = P7(); In.useEffect(() => { e && e.capture("chart", E) }, []), L.layout.width = void 0, L.layout.height = void 0, (Ee = (De = L.layout) == null ? void 0 : De.title) != null && Ee.text && (L.layout.title.text = ""); const [w, k] = In.useState(L), [i, _] = In.useState({}), [y, h] = In.useState(!1), [l, t] = In.useState(se), [o, r] = In.useState({}), [n, a] = In.useState(!1), [s, u] = In.useState({ name: "" }), [p, c] = In.useState(!1), [b, g] = In.useState(null), [f, v] = In.useState({ old_nticks: {} }), [m, x] = In.useState(!1), [T, d] = In.useState(!1), [M, A] = In.useState(!1), [C, P] = In.useState(w), [O, z] = In.useState([]), [B, Y] = In.useState(!1), [D, G] = In.useState(!0), [V, j] = In.useState(!1), [W, Z] = In.useState(!1), [ie, te] = In.useState(!1), [J, X] = In.useState({}), [ee, re] = In.useState([]), [oe, ue] = In.useState([]), ce = () => u({ name: "" }); function de(fe) { var be, Ie, Te, Ne, qe; console.log("onDeleteAnnotation", fe); const ae = (Ie = (be = C == null ? void 0 : C.layout) == null ? void 0 : be.annotations) == null ? void 0 : Ie.findIndex(ve => ve.text === fe.text); console.log("index", ae), ae > -1 && ((Ne = (Te = C == null ? void 0 : C.layout) == null ? void 0 : Te.annotations) == null || Ne.splice(ae, 1), P({ ...C }), z((qe = C == null ? void 0 : C.layout) == null ? void 0 : qe.annotations)) } function me(fe) { V7({ plotData: C, popupData: fe, setPlotData: P, setModal: u, setOnAnnotationClick: X, setAnnotations: z, onAnnotationClick: J, ohlcAnnotation: ee, setOhlcAnnotation: re, annotations: O, plotDiv: b }) } In.useEffect(() => { T && (u({ name: "downloadFinished" }), d(!1)) }, [T]), In.useEffect(() => { o && Object.keys(o).length > 0 && (Object.keys(o).forEach(fe => { C.layout[fe].title = { ...C.layout[fe].title || {}, text: o[fe] }, C.layout[fe].showticklabels = !0 }), r({})) }, [o]); function _e(fe) { const ae = b.layout.shapes; if (!ae || ae.length === 0) return; const be = ae[ae.length - 1]; be.line.color = fe, ds.update(b, {}, { shapes: ae }) } function Se(fe, ae = !1) { const be = i[fe] || document.querySelector(`[data-title="${fe}"]`); ae ? (be.style.border = "transparent", be.style.boxShadow = "none") : (be.style.border = "1px solid rgba(0, 151, 222, 1.0)", be.style.borderRadius = "5px", be.style.borderpadding = "5px", be.style.boxShadow = "0 0 5px rgba(0, 151, 222, 1.0)"), _({ ...i, [fe]: be }) } function we() { const fe = "Auto Scale (Ctrl+Shift+A)", ae = i[fe] || document.querySelector(`[data-title="${fe}"]`); let be = !0; ae.style.border === "transparent" ? (b.removeAllListeners("plotly_relayout"), be = !1, b.on("plotly_relayout", Sh(async function (Ie) { if (Ie["xaxis.range[0]"] !== void 0) if (M) { const Te = { ...w }; await S_({ event: Ie, figure: Te }).then(async Ne => { P(Ne), ds.react(b, Ne.data, Ne.layout); const qe = await c_(Ie, b); ue(qe.yaxis_fixedrange), ds.update(b, {}, qe.to_update) }) } else { const Te = await c_(Ie, b); ue(Te.yaxis_fixedrange), ds.update(b, {}, Te.to_update) } }, 100))) : (b.removeAllListeners("plotly_relayout"), oe.forEach(Ie => { b.layout[Ie].fixedrange = !1 }), ue([]), M && b.on("plotly_relayout", Sh(async function (Ie) { if (Ie["xaxis.range[0]"] === void 0) return; const Te = { ...w }; await S_({ event: Ie, figure: Te }).then(async Ne => { P(Ne), ds.react(b, Ne.data, Ne.layout) }) }, 100))), Se(fe, be) } function xe() { const fe = "Edit Color (Ctrl+E)", ae = i[fe] || document.querySelector(`[data-title="${fe}"]`); let be = !0; ae.style.border === "transparent" && (be = !1), te(!be), Se(fe, be) } return In.useEffect(() => { V && (console.log("activateAutoScale", !V), we(), j(!1)) }, [V]), In.useEffect(() => { W && (xe(), Z(!1)) }, [W]), In.useEffect(() => { if (B) try { console.log("changeTheme", B); const fe = C == null ? void 0 : C.data.filter(qe => { var ve; return ((ve = qe == null ? void 0 : qe.name) == null ? void 0 : ve.trim()) === "Volume" }), ae = !D; window.document.body.style.backgroundColor = ae ? "#000" : "#fff", C.layout.font = { ...C.layout.font || {}, color: ae ? "#fff" : "#000" }; const be = ae ? qu.sunIcon : qu.moonIcon; document.querySelector('[data-title="Change Theme"]').getElementsByTagName("path")[0].setAttribute("d", be.path), document.querySelector('[data-title="Change Theme"]').getElementsByTagName("svg")[0].setAttribute("viewBox", be.viewBox); const Ne = ae ? { "#00ACFF": "#00ACFF", "#c80000": "#e4003a" } : { "#e4003a": "#c80000", "#00ACFF": "#00ACFF" }; fe.forEach(qe => { qe.type === "bar" && Array.isArray(qe.marker.color) && (qe.marker.color = qe.marker.color.map(ve => Ne[ve] || ve)) }), C.layout.template = ae ? $7 : K7, P({ ...C }), ds.react(b, C.data, C.layout), G(ae), Y(!1) } catch (fe) { console.log("error", fe) } }, [B]), In.useEffect(() => { var fe, ae, be, Ie; if (n) { G(!0), j(!1); const Te = ["Download CSV", "Download Chart as Image", "Overlay chart from CSV", "Add Text", "Change Titles", "Auto Scale (Ctrl+Shift+A)", "Reset Axes"], Ne = document.querySelector('[data-title="Autoscale"]'); Ne && (Ne.getElementsByTagName("path")[0].setAttribute("d", ds.Icons.home.path), Ne.setAttribute("data-title", "Reset Axes")), window.MODEBAR = document.getElementsByClassName("modebar-container")[0]; const qe = window.MODEBAR.getElementsByClassName("modebar-btn"); if (window.MODEBAR.style.cssText = `${window.MODEBAR.style.cssText}; display:flex;`, qe) { const Ae = {}; for (let ze = 0; ze < qe.length; ze++) { const Ue = qe[ze]; Te.includes(Ue.getAttribute("data-title")) && Ue.classList.add("ph-capture"), Ue.style.border = "transparent", Ae[Ue.getAttribute("data-title")] = Ue } _(Ae) } if (((ae = (fe = C == null ? void 0 : C.layout) == null ? void 0 : fe.yaxis) == null ? void 0 : ae.type) !== void 0 && (C.layout.yaxis.type === "log" && !y && (console.log("yaxis.type changed to log"), h(!0)), C.layout.yaxis.type === "linear" && y)) { console.log("yaxis.type changed to linear"), h(!1); const Ae = { "yaxis.exponentformat": "none", "yaxis.tickformat": null, "yaxis.exponentbase": 10 }; ds.update(b, {}, Ae) } if (window.export_image !== void 0) { const Ae = window.export_image.split("/").pop(), ze = Ae.split(".").pop().replace("jpg", "jpeg"); if (["jpeg", "png", "svg", "pdf"].includes(ze)) return Sh(async function () { await Lc(), await M5("MainChart", Ae.split(".")[0], ze) }, 2)() } window.addEventListener("resize", async function () { const Ae = await Q9({ plotData: C, volumeBars: f, setMaximizePlot: x }), ze = Ae.layout_update, Ue = Ae.plotData, Ve = Ae.volume_update; Object.keys(ze).length > 0 && (P(Ue), v(Ve), ds.relayout(b, ze)) }), R !== "dark" && Y(!0); const ve = w.data.map(Ae => Ae.type === "candlestick"); if (((be = w.data[0]) == null ? void 0 : be.x) !== void 0 && ((Ie = w.data[0]) == null ? void 0 : Ie.x.length) <= 1e3 || !ve.includes(!0)) return; u({ name: "alertDialog", data: { @@ -4082,7 +4082,7 @@ In order to be iterable, non-array objects must have a [Symbol.iterator]() metho + + - + - - - - -
- - - - \ No newline at end of file +`),e.join("")}function fR(e){var t={};t.i=e.read_shift(4);var r={};r.r=e.read_shift(4),r.c=e.read_shift(4),t.r=Ue(r);var n=e.read_shift(1);return n&2&&(t.l="1"),n&8&&(t.a="1"),t}var Xi=1024;function Dw(e,t){for(var r=[21600,21600],n=["m0,0l0",r[1],r[0],r[1],r[0],"0xe"].join(","),i=[fe("xml",null,{"xmlns:v":Qt.v,"xmlns:o":Qt.o,"xmlns:x":Qt.x,"xmlns:mv":Qt.mv}).replace(/\/>/,">"),fe("o:shapelayout",fe("o:idmap",null,{"v:ext":"edit",data:e}),{"v:ext":"edit"}),fe("v:shapetype",[fe("v:stroke",null,{joinstyle:"miter"}),fe("v:path",null,{gradientshapeok:"t","o:connecttype":"rect"})].join(""),{id:"_x0000_t202","o:spt":202,coordsize:r.join(","),path:n})];Xi",u,fe("v:shadow",null,c),fe("v:path",null,{"o:connecttype":"none"}),'
','',"","",Et("x:Anchor",[a.c+1,0,a.r+1,0,a.c+3,20,a.r+5,20].join(",")),Et("x:AutoFill","False"),Et("x:Row",String(a.r)),Et("x:Column",String(a.c)),o[1].hidden?"":"","",""])}),i.push(""),i.join("")}function Pw(e){var t=[at,fe("comments",null,{xmlns:Oo[0]})],r=[];return t.push(""),e.forEach(function(n){n[1].forEach(function(i){var o=Be(i.a);r.indexOf(o)==-1&&(r.push(o),t.push(""+o+"")),i.T&&i.ID&&r.indexOf("tc="+i.ID)==-1&&(r.push("tc="+i.ID),t.push("tc="+i.ID+""))})}),r.length==0&&(r.push("SheetJ5"),t.push("SheetJ5")),t.push(""),t.push(""),e.forEach(function(n){var i=0,o=[];if(n[1][0]&&n[1][0].T&&n[1][0].ID?i=r.indexOf("tc="+n[1][0].ID):n[1].forEach(function(l){l.a&&(i=r.indexOf(Be(l.a))),o.push(l.t||"")}),t.push(''),o.length<=1)t.push(Et("t",Be(o[0]||"")));else{for(var a=`Comment: + `+o[0]+` +`,s=1;s")}),t.push(""),t.length>2&&(t[t.length]="",t[1]=t[1].replace("/>",">")),t.join("")}function dR(e,t,r){var n=[at,fe("ThreadedComments",null,{xmlns:ft.TCMNT}).replace(/[\/]>/,">")];return e.forEach(function(i){var o="";(i[1]||[]).forEach(function(a,s){if(!a.T){delete a.ID;return}a.a&&t.indexOf(a.a)==-1&&t.push(a.a);var l={ref:i[0],id:"{54EE7951-7262-4200-6969-"+("000000000000"+r.tcid++).slice(-12)+"}"};s==0?o=l.id:l.parentId=o,a.ID=l.id,a.a&&(l.personId="{54EE7950-7262-4200-6969-"+("000000000000"+t.indexOf(a.a)).slice(-12)+"}"),n.push(fe("threadedComment",Et("text",a.t||""),l))})}),n.push(""),n.join("")}function hR(e){var t=[at,fe("personList",null,{xmlns:ft.TCMNT,"xmlns:x":Oo[0]}).replace(/[\/]>/,">")];return e.forEach(function(r,n){t.push(fe("person",null,{displayName:r,id:"{54EE7950-7262-4200-6969-"+("000000000000"+n).slice(-12)+"}",userId:r,providerId:"None"}))}),t.push(""),t.join("")}function pR(e){var t={};t.iauthor=e.read_shift(4);var r=Si(e);return t.rfx=r.s,t.ref=Ue(r.s),e.l+=16,t}function gR(e,t){return t==null&&(t=Z(36)),t.write_shift(4,e[1].iauthor),Do(e[0],t),t.write_shift(4,0),t.write_shift(4,0),t.write_shift(4,0),t.write_shift(4,0),t}var mR=Dt;function vR(e){return ht(e.slice(0,54))}function xR(e){var t=jt(),r=[];return ie(t,628),ie(t,630),e.forEach(function(n){n[1].forEach(function(i){r.indexOf(i.a)>-1||(r.push(i.a.slice(0,54)),ie(t,632,vR(i.a)))})}),ie(t,631),ie(t,633),e.forEach(function(n){n[1].forEach(function(i){i.iauthor=r.indexOf(i.a);var o={s:dt(n[0]),e:dt(n[0])};ie(t,635,gR([o,i])),i.t&&i.t.length>0&&ie(t,637,y3(i)),ie(t,636),delete i.iauthor})}),ie(t,634),ie(t,629),t.end()}function wR(e,t){t.FullPaths.forEach(function(r,n){if(n!=0){var i=r.replace(/[^\/]*[\/]/,"/_VBA_PROJECT_CUR/");i.slice(-1)!=="/"&&He.utils.cfb_add(e,i,t.FileIndex[n].content)}})}var Iw=["xlsb","xlsm","xlam","biff8","xla"],yR=function(){var e=/(^|[^A-Za-z_])R(\[?-?\d+\]|[1-9]\d*|)C(\[?-?\d+\]|[1-9]\d*|)(?![A-Za-z0-9_])/g,t={r:0,c:0};function r(n,i,o,a){var s=!1,l=!1;o.length==0?l=!0:o.charAt(0)=="["&&(l=!0,o=o.slice(1,-1)),a.length==0?s=!0:a.charAt(0)=="["&&(s=!0,a=a.slice(1,-1));var u=o.length>0?parseInt(o,10)|0:0,c=a.length>0?parseInt(a,10)|0:0;return s?c+=t.c:--c,l?u+=t.r:--u,i+(s?"":"$")+Ft(c)+(l?"":"$")+_t(u)}return function(i,o){return t=o,i.replace(e,r)}}(),jd=/(^|[^._A-Z0-9])([$]?)([A-Z]{1,2}|[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D])([$]?)(10[0-3]\d{4}|104[0-7]\d{3}|1048[0-4]\d{2}|10485[0-6]\d|104857[0-6]|[1-9]\d{0,5})(?![_.\(A-Za-z0-9])/g,Xd=function(){return function(t,r){return t.replace(jd,function(n,i,o,a,s,l){var u=Ud(a)-(o?0:r.c),c=Bd(l)-(s?0:r.r),f=c==0?"":s?c+1:"["+c+"]",d=u==0?"":o?u+1:"["+u+"]";return i+"R"+f+"C"+d})}}();function ER(e,t){return e.replace(jd,function(r,n,i,o,a,s){return n+(i=="$"?i+o:Ft(Ud(o)+t.c))+(a=="$"?a+s:_t(Bd(s)+t.r))})}function _R(e){return e.length!=1}function it(e){e.l+=1}function Mn(e,t){var r=e.read_shift(t==1?1:2);return[r&16383,r>>14&1,r>>15&1]}function bw(e,t,r){var n=2;if(r){if(r.biff>=2&&r.biff<=5)return kw(e);r.biff==12&&(n=4)}var i=e.read_shift(n),o=e.read_shift(n),a=Mn(e,2),s=Mn(e,2);return{s:{r:i,c:a[0],cRel:a[1],rRel:a[2]},e:{r:o,c:s[0],cRel:s[1],rRel:s[2]}}}function kw(e){var t=Mn(e,2),r=Mn(e,2),n=e.read_shift(1),i=e.read_shift(1);return{s:{r:t[0],c:n,cRel:t[1],rRel:t[2]},e:{r:r[0],c:i,cRel:r[1],rRel:r[2]}}}function SR(e,t,r){if(r.biff<8)return kw(e);var n=e.read_shift(r.biff==12?4:2),i=e.read_shift(r.biff==12?4:2),o=Mn(e,2),a=Mn(e,2);return{s:{r:n,c:o[0],cRel:o[1],rRel:o[2]},e:{r:i,c:a[0],cRel:a[1],rRel:a[2]}}}function $w(e,t,r){if(r&&r.biff>=2&&r.biff<=5)return TR(e);var n=e.read_shift(r&&r.biff==12?4:2),i=Mn(e,2);return{r:n,c:i[0],cRel:i[1],rRel:i[2]}}function TR(e){var t=Mn(e,2),r=e.read_shift(1);return{r:t[0],c:r,cRel:t[1],rRel:t[2]}}function CR(e){var t=e.read_shift(2),r=e.read_shift(2);return{r:t,c:r&255,fQuoted:!!(r&16384),cRel:r>>15,rRel:r>>15}}function AR(e,t,r){var n=r&&r.biff?r.biff:8;if(n>=2&&n<=5)return RR(e);var i=e.read_shift(n>=12?4:2),o=e.read_shift(2),a=(o&16384)>>14,s=(o&32768)>>15;if(o&=16383,s==1)for(;i>524287;)i-=1048576;if(a==1)for(;o>8191;)o=o-16384;return{r:i,c:o,cRel:a,rRel:s}}function RR(e){var t=e.read_shift(2),r=e.read_shift(1),n=(t&32768)>>15,i=(t&16384)>>14;return t&=16383,n==1&&t>=8192&&(t=t-16384),i==1&&r>=128&&(r=r-256),{r:t,c:r,cRel:i,rRel:n}}function OR(e,t,r){var n=(e[e.l++]&96)>>5,i=bw(e,r.biff>=2&&r.biff<=5?6:8,r);return[n,i]}function FR(e,t,r){var n=(e[e.l++]&96)>>5,i=e.read_shift(2,"i"),o=8;if(r)switch(r.biff){case 5:e.l+=12,o=6;break;case 12:o=12;break}var a=bw(e,o,r);return[n,i,a]}function DR(e,t,r){var n=(e[e.l++]&96)>>5;return e.l+=r&&r.biff>8?12:r.biff<8?6:8,[n]}function PR(e,t,r){var n=(e[e.l++]&96)>>5,i=e.read_shift(2),o=8;if(r)switch(r.biff){case 5:e.l+=12,o=6;break;case 12:o=12;break}return e.l+=o,[n,i]}function IR(e,t,r){var n=(e[e.l++]&96)>>5,i=SR(e,t-1,r);return[n,i]}function bR(e,t,r){var n=(e[e.l++]&96)>>5;return e.l+=r.biff==2?6:r.biff==12?14:7,[n]}function Gg(e){var t=e[e.l+1]&1,r=1;return e.l+=4,[t,r]}function kR(e,t,r){e.l+=2;for(var n=e.read_shift(r&&r.biff==2?1:2),i=[],o=0;o<=n;++o)i.push(e.read_shift(r&&r.biff==2?1:2));return i}function $R(e,t,r){var n=e[e.l+1]&255?1:0;return e.l+=2,[n,e.read_shift(r&&r.biff==2?1:2)]}function NR(e,t,r){var n=e[e.l+1]&255?1:0;return e.l+=2,[n,e.read_shift(r&&r.biff==2?1:2)]}function MR(e){var t=e[e.l+1]&255?1:0;return e.l+=2,[t,e.read_shift(2)]}function LR(e,t,r){var n=e[e.l+1]&255?1:0;return e.l+=r&&r.biff==2?3:4,[n]}function Nw(e){var t=e.read_shift(1),r=e.read_shift(1);return[t,r]}function BR(e){return e.read_shift(2),Nw(e)}function UR(e){return e.read_shift(2),Nw(e)}function HR(e,t,r){var n=(e[e.l]&96)>>5;e.l+=1;var i=$w(e,0,r);return[n,i]}function VR(e,t,r){var n=(e[e.l]&96)>>5;e.l+=1;var i=AR(e,0,r);return[n,i]}function WR(e,t,r){var n=(e[e.l]&96)>>5;e.l+=1;var i=e.read_shift(2);r&&r.biff==5&&(e.l+=12);var o=$w(e,0,r);return[n,i,o]}function zR(e,t,r){var n=(e[e.l]&96)>>5;e.l+=1;var i=e.read_shift(r&&r.biff<=3?1:2);return[zO[i],Bw[i],n]}function GR(e,t,r){var n=e[e.l++],i=e.read_shift(1),o=r&&r.biff<=3?[n==88?-1:0,e.read_shift(1)]:jR(e);return[i,(o[0]===0?Bw:WO)[o[1]]]}function jR(e){return[e[e.l+1]>>7,e.read_shift(2)&32767]}function XR(e,t,r){e.l+=r&&r.biff==2?3:4}function KR(e,t,r){if(e.l++,r&&r.biff==12)return[e.read_shift(4,"i"),0];var n=e.read_shift(2),i=e.read_shift(r&&r.biff==2?1:2);return[n,i]}function YR(e){return e.l++,ss[e.read_shift(1)]}function qR(e){return e.l++,e.read_shift(2)}function QR(e){return e.l++,e.read_shift(1)!==0}function ZR(e){return e.l++,Po(e)}function JR(e,t,r){return e.l++,xw(e,t-1,r)}function eO(e,t){var r=[e.read_shift(1)];if(t==12)switch(r[0]){case 2:r[0]=4;break;case 4:r[0]=16;break;case 0:r[0]=1;break;case 1:r[0]=2;break}switch(r[0]){case 4:r[1]=W3(e,1)?"TRUE":"FALSE",t!=12&&(e.l+=7);break;case 37:case 16:r[1]=ss[e[e.l]],e.l+=t==12?4:8;break;case 0:e.l+=8;break;case 1:r[1]=Po(e);break;case 2:r[1]=X3(e,0,{biff:t>0&&t<8?2:t});break;default:throw new Error("Bad SerAr: "+r[0])}return r}function tO(e,t,r){for(var n=e.read_shift(r.biff==12?4:2),i=[],o=0;o!=n;++o)i.push((r.biff==12?Si:q3)(e));return i}function rO(e,t,r){var n=0,i=0;r.biff==12?(n=e.read_shift(4),i=e.read_shift(4)):(i=1+e.read_shift(1),n=1+e.read_shift(2)),r.biff>=2&&r.biff<8&&(--n,--i==0&&(i=256));for(var o=0,a=[];o!=n&&(a[o]=[]);++o)for(var s=0;s!=i;++s)a[o][s]=eO(e,r.biff);return a}function nO(e,t,r){var n=e.read_shift(1)>>>5&3,i=!r||r.biff>=8?4:2,o=e.read_shift(i);switch(r.biff){case 2:e.l+=5;break;case 3:case 4:e.l+=8;break;case 5:e.l+=12;break}return[n,0,o]}function iO(e,t,r){if(r.biff==5)return oO(e);var n=e.read_shift(1)>>>5&3,i=e.read_shift(2),o=e.read_shift(4);return[n,i,o]}function oO(e){var t=e.read_shift(1)>>>5&3,r=e.read_shift(2,"i");e.l+=8;var n=e.read_shift(2);return e.l+=12,[t,r,n]}function aO(e,t,r){var n=e.read_shift(1)>>>5&3;e.l+=r&&r.biff==2?3:4;var i=e.read_shift(r&&r.biff==2?1:2);return[n,i]}function sO(e,t,r){var n=e.read_shift(1)>>>5&3,i=e.read_shift(r&&r.biff==2?1:2);return[n,i]}function lO(e,t,r){var n=e.read_shift(1)>>>5&3;return e.l+=4,r.biff<8&&e.l--,r.biff==12&&(e.l+=2),[n]}function uO(e,t,r){var n=(e[e.l++]&96)>>5,i=e.read_shift(2),o=4;if(r)switch(r.biff){case 5:o=15;break;case 12:o=6;break}return e.l+=o,[n,i]}var cO=$r,fO=$r,dO=$r;function ls(e,t,r){return e.l+=2,[CR(e)]}function Kd(e){return e.l+=6,[]}var hO=ls,pO=Kd,gO=Kd,mO=ls;function Mw(e){return e.l+=2,[mw(e),e.read_shift(2)&1]}var vO=ls,xO=Mw,wO=Kd,yO=ls,EO=ls,_O=["Data","All","Headers","??","?Data2","??","?DataHeaders","??","Totals","??","??","??","?DataTotals","??","??","??","?Current"];function SO(e){e.l+=2;var t=e.read_shift(2),r=e.read_shift(2),n=e.read_shift(4),i=e.read_shift(2),o=e.read_shift(2),a=_O[r>>2&31];return{ixti:t,coltype:r&3,rt:a,idx:n,c:i,C:o}}function TO(e){return e.l+=2,[e.read_shift(4)]}function CO(e,t,r){return e.l+=5,e.l+=2,e.l+=r.biff==2?1:4,["PTGSHEET"]}function AO(e,t,r){return e.l+=r.biff==2?4:5,["PTGENDSHEET"]}function RO(e){var t=e.read_shift(1)>>>5&3,r=e.read_shift(2);return[t,r]}function OO(e){var t=e.read_shift(1)>>>5&3,r=e.read_shift(2);return[t,r]}function FO(e){return e.l+=4,[0,0]}var jg={1:{n:"PtgExp",f:KR},2:{n:"PtgTbl",f:dO},3:{n:"PtgAdd",f:it},4:{n:"PtgSub",f:it},5:{n:"PtgMul",f:it},6:{n:"PtgDiv",f:it},7:{n:"PtgPower",f:it},8:{n:"PtgConcat",f:it},9:{n:"PtgLt",f:it},10:{n:"PtgLe",f:it},11:{n:"PtgEq",f:it},12:{n:"PtgGe",f:it},13:{n:"PtgGt",f:it},14:{n:"PtgNe",f:it},15:{n:"PtgIsect",f:it},16:{n:"PtgUnion",f:it},17:{n:"PtgRange",f:it},18:{n:"PtgUplus",f:it},19:{n:"PtgUminus",f:it},20:{n:"PtgPercent",f:it},21:{n:"PtgParen",f:it},22:{n:"PtgMissArg",f:it},23:{n:"PtgStr",f:JR},26:{n:"PtgSheet",f:CO},27:{n:"PtgEndSheet",f:AO},28:{n:"PtgErr",f:YR},29:{n:"PtgBool",f:QR},30:{n:"PtgInt",f:qR},31:{n:"PtgNum",f:ZR},32:{n:"PtgArray",f:bR},33:{n:"PtgFunc",f:zR},34:{n:"PtgFuncVar",f:GR},35:{n:"PtgName",f:nO},36:{n:"PtgRef",f:HR},37:{n:"PtgArea",f:OR},38:{n:"PtgMemArea",f:aO},39:{n:"PtgMemErr",f:cO},40:{n:"PtgMemNoMem",f:fO},41:{n:"PtgMemFunc",f:sO},42:{n:"PtgRefErr",f:lO},43:{n:"PtgAreaErr",f:DR},44:{n:"PtgRefN",f:VR},45:{n:"PtgAreaN",f:IR},46:{n:"PtgMemAreaN",f:RO},47:{n:"PtgMemNoMemN",f:OO},57:{n:"PtgNameX",f:iO},58:{n:"PtgRef3d",f:WR},59:{n:"PtgArea3d",f:FR},60:{n:"PtgRefErr3d",f:uO},61:{n:"PtgAreaErr3d",f:PR},255:{}},DO={64:32,96:32,65:33,97:33,66:34,98:34,67:35,99:35,68:36,100:36,69:37,101:37,70:38,102:38,71:39,103:39,72:40,104:40,73:41,105:41,74:42,106:42,75:43,107:43,76:44,108:44,77:45,109:45,78:46,110:46,79:47,111:47,88:34,120:34,89:57,121:57,90:58,122:58,91:59,123:59,92:60,124:60,93:61,125:61},PO={1:{n:"PtgElfLel",f:Mw},2:{n:"PtgElfRw",f:yO},3:{n:"PtgElfCol",f:hO},6:{n:"PtgElfRwV",f:EO},7:{n:"PtgElfColV",f:mO},10:{n:"PtgElfRadical",f:vO},11:{n:"PtgElfRadicalS",f:wO},13:{n:"PtgElfColS",f:pO},15:{n:"PtgElfColSV",f:gO},16:{n:"PtgElfRadicalLel",f:xO},25:{n:"PtgList",f:SO},29:{n:"PtgSxName",f:TO},255:{}},IO={0:{n:"PtgAttrNoop",f:FO},1:{n:"PtgAttrSemi",f:LR},2:{n:"PtgAttrIf",f:NR},4:{n:"PtgAttrChoose",f:kR},8:{n:"PtgAttrGoto",f:$R},16:{n:"PtgAttrSum",f:XR},32:{n:"PtgAttrBaxcel",f:Gg},33:{n:"PtgAttrBaxcel",f:Gg},64:{n:"PtgAttrSpace",f:BR},65:{n:"PtgAttrSpaceSemi",f:UR},128:{n:"PtgAttrIfError",f:MR},255:{}};function bO(e,t,r,n){if(n.biff<8)return $r(e,t);for(var i=e.l+t,o=[],a=0;a!==r.length;++a)switch(r[a][0]){case"PtgArray":r[a][1]=rO(e,0,n),o.push(r[a][1]);break;case"PtgMemArea":r[a][2]=tO(e,r[a][1],n),o.push(r[a][2]);break;case"PtgExp":n&&n.biff==12&&(r[a][1][1]=e.read_shift(4),o.push(r[a][1]));break;case"PtgList":case"PtgElfRadicalS":case"PtgElfColS":case"PtgElfColSV":throw"Unsupported "+r[a][0]}return t=i-e.l,t!==0&&o.push($r(e,t)),o}function kO(e,t,r){for(var n=e.l+t,i,o,a=[];n!=e.l;)t=n-e.l,o=e[e.l],i=jg[o]||jg[DO[o]],(o===24||o===25)&&(i=(o===24?PO:IO)[e[e.l+1]]),!i||!i.f?$r(e,t):a.push([i.n,i.f(e,t,r)]);return a}function $O(e){for(var t=[],r=0;r=",PtgGt:">",PtgLe:"<=",PtgLt:"<",PtgMul:"*",PtgNe:"<>",PtgPower:"^",PtgSub:"-"};function MO(e,t){if(!e&&!(t&&t.biff<=5&&t.biff>=2))throw new Error("empty sheet name");return/[^\w\u4E00-\u9FFF\u3040-\u30FF]/.test(e)?"'"+e+"'":e}function Lw(e,t,r){if(!e)return"SH33TJSERR0";if(r.biff>8&&(!e.XTI||!e.XTI[t]))return e.SheetNames[t];if(!e.XTI)return"SH33TJSERR6";var n=e.XTI[t];if(r.biff<8)return t>1e4&&(t-=65536),t<0&&(t=-t),t==0?"":e.XTI[t-1];if(!n)return"SH33TJSERR1";var i="";if(r.biff>8)switch(e[n[0]][0]){case 357:return i=n[1]==-1?"#REF":e.SheetNames[n[1]],n[1]==n[2]?i:i+":"+e.SheetNames[n[2]];case 358:return r.SID!=null?e.SheetNames[r.SID]:"SH33TJSSAME"+e[n[0]][0];case 355:default:return"SH33TJSSRC"+e[n[0]][0]}switch(e[n[0]][0][0]){case 1025:return i=n[1]==-1?"#REF":e.SheetNames[n[1]]||"SH33TJSERR3",n[1]==n[2]?i:i+":"+e.SheetNames[n[2]];case 14849:return e[n[0]].slice(1).map(function(o){return o.Name}).join(";;");default:return e[n[0]][0][3]?(i=n[1]==-1?"#REF":e[n[0]][0][3][n[1]]||"SH33TJSERR4",n[1]==n[2]?i:i+":"+e[n[0]][0][3][n[2]]):"SH33TJSERR2"}}function Xg(e,t,r){var n=Lw(e,t,r);return n=="#REF"?n:MO(n,r)}function xo(e,t,r,n,i){var o=i&&i.biff||8,a={s:{c:0,r:0},e:{c:0,r:0}},s=[],l,u,c,f=0,d=0,h,m="";if(!e[0]||!e[0][0])return"";for(var p=-1,g="",v=0,w=e[0].length;v=0){switch(e[0][p][1][0]){case 0:g=Je(" ",e[0][p][1][1]);break;case 1:g=Je("\r",e[0][p][1][1]);break;default:if(g="",i.WTF)throw new Error("Unexpected PtgAttrSpaceType "+e[0][p][1][0])}u=u+g,p=-1}s.push(u+NO[y[0]]+l);break;case"PtgIsect":l=s.pop(),u=s.pop(),s.push(u+" "+l);break;case"PtgUnion":l=s.pop(),u=s.pop(),s.push(u+","+l);break;case"PtgRange":l=s.pop(),u=s.pop(),s.push(u+":"+l);break;case"PtgAttrChoose":break;case"PtgAttrGoto":break;case"PtgAttrIf":break;case"PtgAttrIfError":break;case"PtgRef":c=_a(y[1][1],a,i),s.push(Sa(c,o));break;case"PtgRefN":c=r?_a(y[1][1],r,i):y[1][1],s.push(Sa(c,o));break;case"PtgRef3d":f=y[1][1],c=_a(y[1][2],a,i),m=Xg(n,f,i),s.push(m+"!"+Sa(c,o));break;case"PtgFunc":case"PtgFuncVar":var E=y[1][0],b=y[1][1];E||(E=0),E&=127;var k=E==0?[]:s.slice(-E);s.length-=E,b==="User"&&(b=k.shift()),s.push(b+"("+k.join(",")+")");break;case"PtgBool":s.push(y[1]?"TRUE":"FALSE");break;case"PtgInt":s.push(y[1]);break;case"PtgNum":s.push(String(y[1]));break;case"PtgStr":s.push('"'+y[1].replace(/"/g,'""')+'"');break;case"PtgErr":s.push(y[1]);break;case"PtgAreaN":h=Pg(y[1][1],r?{s:r}:a,i),s.push(kc(h,i));break;case"PtgArea":h=Pg(y[1][1],a,i),s.push(kc(h,i));break;case"PtgArea3d":f=y[1][1],h=y[1][2],m=Xg(n,f,i),s.push(m+"!"+kc(h,i));break;case"PtgAttrSum":s.push("SUM("+s.pop()+")");break;case"PtgAttrBaxcel":case"PtgAttrSemi":break;case"PtgName":d=y[1][2];var S=(n.names||[])[d-1]||(n[0]||[])[d],C=S?S.Name:"SH33TJSNAME"+String(d);C&&C.slice(0,6)=="_xlfn."&&!i.xlfn&&(C=C.slice(6)),s.push(C);break;case"PtgNameX":var A=y[1][1];d=y[1][2];var L;if(i.biff<=5)A<0&&(A=-A),n[A]&&(L=n[A][d]);else{var B="";if(((n[A]||[])[0]||[])[0]==14849||(((n[A]||[])[0]||[])[0]==1025?n[A][d]&&n[A][d].itab>0&&(B=n.SheetNames[n[A][d].itab-1]+"!"):B=n.SheetNames[d-1]+"!"),n[A]&&n[A][d])B+=n[A][d].Name;else if(n[0]&&n[0][d])B+=n[0][d].Name;else{var U=(Lw(n,A,i)||"").split(";;");U[d-1]?B=U[d-1]:B+="SH33TJSERRX"}s.push(B);break}L||(L={Name:"SH33TJSERRY"}),s.push(L.Name);break;case"PtgParen":var H="(",G=")";if(p>=0){switch(g="",e[0][p][1][0]){case 2:H=Je(" ",e[0][p][1][1])+H;break;case 3:H=Je("\r",e[0][p][1][1])+H;break;case 4:G=Je(" ",e[0][p][1][1])+G;break;case 5:G=Je("\r",e[0][p][1][1])+G;break;default:if(i.WTF)throw new Error("Unexpected PtgAttrSpaceType "+e[0][p][1][0])}p=-1}s.push(H+s.pop()+G);break;case"PtgRefErr":s.push("#REF!");break;case"PtgRefErr3d":s.push("#REF!");break;case"PtgExp":c={c:y[1][1],r:y[1][0]};var ee={c:r.c,r:r.r};if(n.sharedf[Ue(c)]){var ae=n.sharedf[Ue(c)];s.push(xo(ae,a,ee,n,i))}else{var he=!1;for(l=0;l!=n.arrayf.length;++l)if(u=n.arrayf[l],!(c.cu[0].e.c)&&!(c.ru[0].e.r)){s.push(xo(u[1],a,ee,n,i)),he=!0;break}he||s.push(y[1])}break;case"PtgArray":s.push("{"+$O(y[1])+"}");break;case"PtgMemArea":break;case"PtgAttrSpace":case"PtgAttrSpaceSemi":p=v;break;case"PtgTbl":break;case"PtgMemErr":break;case"PtgMissArg":s.push("");break;case"PtgAreaErr":s.push("#REF!");break;case"PtgAreaErr3d":s.push("#REF!");break;case"PtgList":s.push("Table"+y[1].idx+"[#"+y[1].rt+"]");break;case"PtgMemAreaN":case"PtgMemNoMemN":case"PtgAttrNoop":case"PtgSheet":case"PtgEndSheet":break;case"PtgMemFunc":break;case"PtgMemNoMem":break;case"PtgElfCol":case"PtgElfColS":case"PtgElfColSV":case"PtgElfColV":case"PtgElfLel":case"PtgElfRadical":case"PtgElfRadicalLel":case"PtgElfRadicalS":case"PtgElfRw":case"PtgElfRwV":throw new Error("Unsupported ELFs");case"PtgSxName":throw new Error("Unrecognized Formula Token: "+String(y));default:throw new Error("Unrecognized Formula Token: "+String(y))}var Te=["PtgAttrSpace","PtgAttrSpaceSemi","PtgAttrGoto"];if(i.biff!=3&&p>=0&&Te.indexOf(e[0][v][0])==-1){y=e[0][p];var oe=!0;switch(y[1][0]){case 4:oe=!1;case 0:g=Je(" ",y[1][1]);break;case 5:oe=!1;case 1:g=Je("\r",y[1][1]);break;default:if(g="",i.WTF)throw new Error("Unexpected PtgAttrSpaceType "+y[1][0])}s.push((oe?g:"")+s.pop()+(oe?"":g)),p=-1}}if(s.length>1&&i.WTF)throw new Error("bad formula stack");return s[0]}function LO(e){if(e==null){var t=Z(8);return t.write_shift(1,3),t.write_shift(1,0),t.write_shift(2,0),t.write_shift(2,0),t.write_shift(2,65535),t}else if(typeof e=="number")return li(e);return li(0)}function BO(e,t,r,n,i){var o=ui(t,r,i),a=LO(e.v),s=Z(6),l=33;s.write_shift(2,l),s.write_shift(4,0);for(var u=Z(e.bf.length),c=0;c0?bO(e,o,i,r):null;return[i,a]}var UO=Au,Ru=Au,HO=Au,VO=Au,WO={0:"BEEP",1:"OPEN",2:"OPEN.LINKS",3:"CLOSE.ALL",4:"SAVE",5:"SAVE.AS",6:"FILE.DELETE",7:"PAGE.SETUP",8:"PRINT",9:"PRINTER.SETUP",10:"QUIT",11:"NEW.WINDOW",12:"ARRANGE.ALL",13:"WINDOW.SIZE",14:"WINDOW.MOVE",15:"FULL",16:"CLOSE",17:"RUN",22:"SET.PRINT.AREA",23:"SET.PRINT.TITLES",24:"SET.PAGE.BREAK",25:"REMOVE.PAGE.BREAK",26:"FONT",27:"DISPLAY",28:"PROTECT.DOCUMENT",29:"PRECISION",30:"A1.R1C1",31:"CALCULATE.NOW",32:"CALCULATION",34:"DATA.FIND",35:"EXTRACT",36:"DATA.DELETE",37:"SET.DATABASE",38:"SET.CRITERIA",39:"SORT",40:"DATA.SERIES",41:"TABLE",42:"FORMAT.NUMBER",43:"ALIGNMENT",44:"STYLE",45:"BORDER",46:"CELL.PROTECTION",47:"COLUMN.WIDTH",48:"UNDO",49:"CUT",50:"COPY",51:"PASTE",52:"CLEAR",53:"PASTE.SPECIAL",54:"EDIT.DELETE",55:"INSERT",56:"FILL.RIGHT",57:"FILL.DOWN",61:"DEFINE.NAME",62:"CREATE.NAMES",63:"FORMULA.GOTO",64:"FORMULA.FIND",65:"SELECT.LAST.CELL",66:"SHOW.ACTIVE.CELL",67:"GALLERY.AREA",68:"GALLERY.BAR",69:"GALLERY.COLUMN",70:"GALLERY.LINE",71:"GALLERY.PIE",72:"GALLERY.SCATTER",73:"COMBINATION",74:"PREFERRED",75:"ADD.OVERLAY",76:"GRIDLINES",77:"SET.PREFERRED",78:"AXES",79:"LEGEND",80:"ATTACH.TEXT",81:"ADD.ARROW",82:"SELECT.CHART",83:"SELECT.PLOT.AREA",84:"PATTERNS",85:"MAIN.CHART",86:"OVERLAY",87:"SCALE",88:"FORMAT.LEGEND",89:"FORMAT.TEXT",90:"EDIT.REPEAT",91:"PARSE",92:"JUSTIFY",93:"HIDE",94:"UNHIDE",95:"WORKSPACE",96:"FORMULA",97:"FORMULA.FILL",98:"FORMULA.ARRAY",99:"DATA.FIND.NEXT",100:"DATA.FIND.PREV",101:"FORMULA.FIND.NEXT",102:"FORMULA.FIND.PREV",103:"ACTIVATE",104:"ACTIVATE.NEXT",105:"ACTIVATE.PREV",106:"UNLOCKED.NEXT",107:"UNLOCKED.PREV",108:"COPY.PICTURE",109:"SELECT",110:"DELETE.NAME",111:"DELETE.FORMAT",112:"VLINE",113:"HLINE",114:"VPAGE",115:"HPAGE",116:"VSCROLL",117:"HSCROLL",118:"ALERT",119:"NEW",120:"CANCEL.COPY",121:"SHOW.CLIPBOARD",122:"MESSAGE",124:"PASTE.LINK",125:"APP.ACTIVATE",126:"DELETE.ARROW",127:"ROW.HEIGHT",128:"FORMAT.MOVE",129:"FORMAT.SIZE",130:"FORMULA.REPLACE",131:"SEND.KEYS",132:"SELECT.SPECIAL",133:"APPLY.NAMES",134:"REPLACE.FONT",135:"FREEZE.PANES",136:"SHOW.INFO",137:"SPLIT",138:"ON.WINDOW",139:"ON.DATA",140:"DISABLE.INPUT",142:"OUTLINE",143:"LIST.NAMES",144:"FILE.CLOSE",145:"SAVE.WORKBOOK",146:"DATA.FORM",147:"COPY.CHART",148:"ON.TIME",149:"WAIT",150:"FORMAT.FONT",151:"FILL.UP",152:"FILL.LEFT",153:"DELETE.OVERLAY",155:"SHORT.MENUS",159:"SET.UPDATE.STATUS",161:"COLOR.PALETTE",162:"DELETE.STYLE",163:"WINDOW.RESTORE",164:"WINDOW.MAXIMIZE",166:"CHANGE.LINK",167:"CALCULATE.DOCUMENT",168:"ON.KEY",169:"APP.RESTORE",170:"APP.MOVE",171:"APP.SIZE",172:"APP.MINIMIZE",173:"APP.MAXIMIZE",174:"BRING.TO.FRONT",175:"SEND.TO.BACK",185:"MAIN.CHART.TYPE",186:"OVERLAY.CHART.TYPE",187:"SELECT.END",188:"OPEN.MAIL",189:"SEND.MAIL",190:"STANDARD.FONT",191:"CONSOLIDATE",192:"SORT.SPECIAL",193:"GALLERY.3D.AREA",194:"GALLERY.3D.COLUMN",195:"GALLERY.3D.LINE",196:"GALLERY.3D.PIE",197:"VIEW.3D",198:"GOAL.SEEK",199:"WORKGROUP",200:"FILL.GROUP",201:"UPDATE.LINK",202:"PROMOTE",203:"DEMOTE",204:"SHOW.DETAIL",206:"UNGROUP",207:"OBJECT.PROPERTIES",208:"SAVE.NEW.OBJECT",209:"SHARE",210:"SHARE.NAME",211:"DUPLICATE",212:"APPLY.STYLE",213:"ASSIGN.TO.OBJECT",214:"OBJECT.PROTECTION",215:"HIDE.OBJECT",216:"SET.EXTRACT",217:"CREATE.PUBLISHER",218:"SUBSCRIBE.TO",219:"ATTRIBUTES",220:"SHOW.TOOLBAR",222:"PRINT.PREVIEW",223:"EDIT.COLOR",224:"SHOW.LEVELS",225:"FORMAT.MAIN",226:"FORMAT.OVERLAY",227:"ON.RECALC",228:"EDIT.SERIES",229:"DEFINE.STYLE",240:"LINE.PRINT",243:"ENTER.DATA",249:"GALLERY.RADAR",250:"MERGE.STYLES",251:"EDITION.OPTIONS",252:"PASTE.PICTURE",253:"PASTE.PICTURE.LINK",254:"SPELLING",256:"ZOOM",259:"INSERT.OBJECT",260:"WINDOW.MINIMIZE",265:"SOUND.NOTE",266:"SOUND.PLAY",267:"FORMAT.SHAPE",268:"EXTEND.POLYGON",269:"FORMAT.AUTO",272:"GALLERY.3D.BAR",273:"GALLERY.3D.SURFACE",274:"FILL.AUTO",276:"CUSTOMIZE.TOOLBAR",277:"ADD.TOOL",278:"EDIT.OBJECT",279:"ON.DOUBLECLICK",280:"ON.ENTRY",281:"WORKBOOK.ADD",282:"WORKBOOK.MOVE",283:"WORKBOOK.COPY",284:"WORKBOOK.OPTIONS",285:"SAVE.WORKSPACE",288:"CHART.WIZARD",289:"DELETE.TOOL",290:"MOVE.TOOL",291:"WORKBOOK.SELECT",292:"WORKBOOK.ACTIVATE",293:"ASSIGN.TO.TOOL",295:"COPY.TOOL",296:"RESET.TOOL",297:"CONSTRAIN.NUMERIC",298:"PASTE.TOOL",302:"WORKBOOK.NEW",305:"SCENARIO.CELLS",306:"SCENARIO.DELETE",307:"SCENARIO.ADD",308:"SCENARIO.EDIT",309:"SCENARIO.SHOW",310:"SCENARIO.SHOW.NEXT",311:"SCENARIO.SUMMARY",312:"PIVOT.TABLE.WIZARD",313:"PIVOT.FIELD.PROPERTIES",314:"PIVOT.FIELD",315:"PIVOT.ITEM",316:"PIVOT.ADD.FIELDS",318:"OPTIONS.CALCULATION",319:"OPTIONS.EDIT",320:"OPTIONS.VIEW",321:"ADDIN.MANAGER",322:"MENU.EDITOR",323:"ATTACH.TOOLBARS",324:"VBAActivate",325:"OPTIONS.CHART",328:"VBA.INSERT.FILE",330:"VBA.PROCEDURE.DEFINITION",336:"ROUTING.SLIP",338:"ROUTE.DOCUMENT",339:"MAIL.LOGON",342:"INSERT.PICTURE",343:"EDIT.TOOL",344:"GALLERY.DOUGHNUT",350:"CHART.TREND",352:"PIVOT.ITEM.PROPERTIES",354:"WORKBOOK.INSERT",355:"OPTIONS.TRANSITION",356:"OPTIONS.GENERAL",370:"FILTER.ADVANCED",373:"MAIL.ADD.MAILER",374:"MAIL.DELETE.MAILER",375:"MAIL.REPLY",376:"MAIL.REPLY.ALL",377:"MAIL.FORWARD",378:"MAIL.NEXT.LETTER",379:"DATA.LABEL",380:"INSERT.TITLE",381:"FONT.PROPERTIES",382:"MACRO.OPTIONS",383:"WORKBOOK.HIDE",384:"WORKBOOK.UNHIDE",385:"WORKBOOK.DELETE",386:"WORKBOOK.NAME",388:"GALLERY.CUSTOM",390:"ADD.CHART.AUTOFORMAT",391:"DELETE.CHART.AUTOFORMAT",392:"CHART.ADD.DATA",393:"AUTO.OUTLINE",394:"TAB.ORDER",395:"SHOW.DIALOG",396:"SELECT.ALL",397:"UNGROUP.SHEETS",398:"SUBTOTAL.CREATE",399:"SUBTOTAL.REMOVE",400:"RENAME.OBJECT",412:"WORKBOOK.SCROLL",413:"WORKBOOK.NEXT",414:"WORKBOOK.PREV",415:"WORKBOOK.TAB.SPLIT",416:"FULL.SCREEN",417:"WORKBOOK.PROTECT",420:"SCROLLBAR.PROPERTIES",421:"PIVOT.SHOW.PAGES",422:"TEXT.TO.COLUMNS",423:"FORMAT.CHARTTYPE",424:"LINK.FORMAT",425:"TRACER.DISPLAY",430:"TRACER.NAVIGATE",431:"TRACER.CLEAR",432:"TRACER.ERROR",433:"PIVOT.FIELD.GROUP",434:"PIVOT.FIELD.UNGROUP",435:"CHECKBOX.PROPERTIES",436:"LABEL.PROPERTIES",437:"LISTBOX.PROPERTIES",438:"EDITBOX.PROPERTIES",439:"PIVOT.REFRESH",440:"LINK.COMBO",441:"OPEN.TEXT",442:"HIDE.DIALOG",443:"SET.DIALOG.FOCUS",444:"ENABLE.OBJECT",445:"PUSHBUTTON.PROPERTIES",446:"SET.DIALOG.DEFAULT",447:"FILTER",448:"FILTER.SHOW.ALL",449:"CLEAR.OUTLINE",450:"FUNCTION.WIZARD",451:"ADD.LIST.ITEM",452:"SET.LIST.ITEM",453:"REMOVE.LIST.ITEM",454:"SELECT.LIST.ITEM",455:"SET.CONTROL.VALUE",456:"SAVE.COPY.AS",458:"OPTIONS.LISTS.ADD",459:"OPTIONS.LISTS.DELETE",460:"SERIES.AXES",461:"SERIES.X",462:"SERIES.Y",463:"ERRORBAR.X",464:"ERRORBAR.Y",465:"FORMAT.CHART",466:"SERIES.ORDER",467:"MAIL.LOGOFF",468:"CLEAR.ROUTING.SLIP",469:"APP.ACTIVATE.MICROSOFT",470:"MAIL.EDIT.MAILER",471:"ON.SHEET",472:"STANDARD.WIDTH",473:"SCENARIO.MERGE",474:"SUMMARY.INFO",475:"FIND.FILE",476:"ACTIVE.CELL.FONT",477:"ENABLE.TIPWIZARD",478:"VBA.MAKE.ADDIN",480:"INSERTDATATABLE",481:"WORKGROUP.OPTIONS",482:"MAIL.SEND.MAILER",485:"AUTOCORRECT",489:"POST.DOCUMENT",491:"PICKLIST",493:"VIEW.SHOW",494:"VIEW.DEFINE",495:"VIEW.DELETE",509:"SHEET.BACKGROUND",510:"INSERT.MAP.OBJECT",511:"OPTIONS.MENONO",517:"MSOCHECKS",518:"NORMAL",519:"LAYOUT",520:"RM.PRINT.AREA",521:"CLEAR.PRINT.AREA",522:"ADD.PRINT.AREA",523:"MOVE.BRK",545:"HIDECURR.NOTE",546:"HIDEALL.NOTES",547:"DELETE.NOTE",548:"TRAVERSE.NOTES",549:"ACTIVATE.NOTES",620:"PROTECT.REVISIONS",621:"UNPROTECT.REVISIONS",647:"OPTIONS.ME",653:"WEB.PUBLISH",667:"NEWWEBQUERY",673:"PIVOT.TABLE.CHART",753:"OPTIONS.SAVE",755:"OPTIONS.SPELL",808:"HIDEALL.INKANNOTS"},Bw={0:"COUNT",1:"IF",2:"ISNA",3:"ISERROR",4:"SUM",5:"AVERAGE",6:"MIN",7:"MAX",8:"ROW",9:"COLUMN",10:"NA",11:"NPV",12:"STDEV",13:"DOLLAR",14:"FIXED",15:"SIN",16:"COS",17:"TAN",18:"ATAN",19:"PI",20:"SQRT",21:"EXP",22:"LN",23:"LOG10",24:"ABS",25:"INT",26:"SIGN",27:"ROUND",28:"LOOKUP",29:"INDEX",30:"REPT",31:"MID",32:"LEN",33:"VALUE",34:"TRUE",35:"FALSE",36:"AND",37:"OR",38:"NOT",39:"MOD",40:"DCOUNT",41:"DSUM",42:"DAVERAGE",43:"DMIN",44:"DMAX",45:"DSTDEV",46:"VAR",47:"DVAR",48:"TEXT",49:"LINEST",50:"TREND",51:"LOGEST",52:"GROWTH",53:"GOTO",54:"HALT",55:"RETURN",56:"PV",57:"FV",58:"NPER",59:"PMT",60:"RATE",61:"MIRR",62:"IRR",63:"RAND",64:"MATCH",65:"DATE",66:"TIME",67:"DAY",68:"MONTH",69:"YEAR",70:"WEEKDAY",71:"HOUR",72:"MINUTE",73:"SECOND",74:"NOW",75:"AREAS",76:"ROWS",77:"COLUMNS",78:"OFFSET",79:"ABSREF",80:"RELREF",81:"ARGUMENT",82:"SEARCH",83:"TRANSPOSE",84:"ERROR",85:"STEP",86:"TYPE",87:"ECHO",88:"SET.NAME",89:"CALLER",90:"DEREF",91:"WINDOWS",92:"SERIES",93:"DOCUMENTS",94:"ACTIVE.CELL",95:"SELECTION",96:"RESULT",97:"ATAN2",98:"ASIN",99:"ACOS",100:"CHOOSE",101:"HLOOKUP",102:"VLOOKUP",103:"LINKS",104:"INPUT",105:"ISREF",106:"GET.FORMULA",107:"GET.NAME",108:"SET.VALUE",109:"LOG",110:"EXEC",111:"CHAR",112:"LOWER",113:"UPPER",114:"PROPER",115:"LEFT",116:"RIGHT",117:"EXACT",118:"TRIM",119:"REPLACE",120:"SUBSTITUTE",121:"CODE",122:"NAMES",123:"DIRECTORY",124:"FIND",125:"CELL",126:"ISERR",127:"ISTEXT",128:"ISNUMBER",129:"ISBLANK",130:"T",131:"N",132:"FOPEN",133:"FCLOSE",134:"FSIZE",135:"FREADLN",136:"FREAD",137:"FWRITELN",138:"FWRITE",139:"FPOS",140:"DATEVALUE",141:"TIMEVALUE",142:"SLN",143:"SYD",144:"DDB",145:"GET.DEF",146:"REFTEXT",147:"TEXTREF",148:"INDIRECT",149:"REGISTER",150:"CALL",151:"ADD.BAR",152:"ADD.MENU",153:"ADD.COMMAND",154:"ENABLE.COMMAND",155:"CHECK.COMMAND",156:"RENAME.COMMAND",157:"SHOW.BAR",158:"DELETE.MENU",159:"DELETE.COMMAND",160:"GET.CHART.ITEM",161:"DIALOG.BOX",162:"CLEAN",163:"MDETERM",164:"MINVERSE",165:"MMULT",166:"FILES",167:"IPMT",168:"PPMT",169:"COUNTA",170:"CANCEL.KEY",171:"FOR",172:"WHILE",173:"BREAK",174:"NEXT",175:"INITIATE",176:"REQUEST",177:"POKE",178:"EXECUTE",179:"TERMINATE",180:"RESTART",181:"HELP",182:"GET.BAR",183:"PRODUCT",184:"FACT",185:"GET.CELL",186:"GET.WORKSPACE",187:"GET.WINDOW",188:"GET.DOCUMENT",189:"DPRODUCT",190:"ISNONTEXT",191:"GET.NOTE",192:"NOTE",193:"STDEVP",194:"VARP",195:"DSTDEVP",196:"DVARP",197:"TRUNC",198:"ISLOGICAL",199:"DCOUNTA",200:"DELETE.BAR",201:"UNREGISTER",204:"USDOLLAR",205:"FINDB",206:"SEARCHB",207:"REPLACEB",208:"LEFTB",209:"RIGHTB",210:"MIDB",211:"LENB",212:"ROUNDUP",213:"ROUNDDOWN",214:"ASC",215:"DBCS",216:"RANK",219:"ADDRESS",220:"DAYS360",221:"TODAY",222:"VDB",223:"ELSE",224:"ELSE.IF",225:"END.IF",226:"FOR.CELL",227:"MEDIAN",228:"SUMPRODUCT",229:"SINH",230:"COSH",231:"TANH",232:"ASINH",233:"ACOSH",234:"ATANH",235:"DGET",236:"CREATE.OBJECT",237:"VOLATILE",238:"LAST.ERROR",239:"CUSTOM.UNDO",240:"CUSTOM.REPEAT",241:"FORMULA.CONVERT",242:"GET.LINK.INFO",243:"TEXT.BOX",244:"INFO",245:"GROUP",246:"GET.OBJECT",247:"DB",248:"PAUSE",251:"RESUME",252:"FREQUENCY",253:"ADD.TOOLBAR",254:"DELETE.TOOLBAR",255:"User",256:"RESET.TOOLBAR",257:"EVALUATE",258:"GET.TOOLBAR",259:"GET.TOOL",260:"SPELLING.CHECK",261:"ERROR.TYPE",262:"APP.TITLE",263:"WINDOW.TITLE",264:"SAVE.TOOLBAR",265:"ENABLE.TOOL",266:"PRESS.TOOL",267:"REGISTER.ID",268:"GET.WORKBOOK",269:"AVEDEV",270:"BETADIST",271:"GAMMALN",272:"BETAINV",273:"BINOMDIST",274:"CHIDIST",275:"CHIINV",276:"COMBIN",277:"CONFIDENCE",278:"CRITBINOM",279:"EVEN",280:"EXPONDIST",281:"FDIST",282:"FINV",283:"FISHER",284:"FISHERINV",285:"FLOOR",286:"GAMMADIST",287:"GAMMAINV",288:"CEILING",289:"HYPGEOMDIST",290:"LOGNORMDIST",291:"LOGINV",292:"NEGBINOMDIST",293:"NORMDIST",294:"NORMSDIST",295:"NORMINV",296:"NORMSINV",297:"STANDARDIZE",298:"ODD",299:"PERMUT",300:"POISSON",301:"TDIST",302:"WEIBULL",303:"SUMXMY2",304:"SUMX2MY2",305:"SUMX2PY2",306:"CHITEST",307:"CORREL",308:"COVAR",309:"FORECAST",310:"FTEST",311:"INTERCEPT",312:"PEARSON",313:"RSQ",314:"STEYX",315:"SLOPE",316:"TTEST",317:"PROB",318:"DEVSQ",319:"GEOMEAN",320:"HARMEAN",321:"SUMSQ",322:"KURT",323:"SKEW",324:"ZTEST",325:"LARGE",326:"SMALL",327:"QUARTILE",328:"PERCENTILE",329:"PERCENTRANK",330:"MODE",331:"TRIMMEAN",332:"TINV",334:"MOVIE.COMMAND",335:"GET.MOVIE",336:"CONCATENATE",337:"POWER",338:"PIVOT.ADD.DATA",339:"GET.PIVOT.TABLE",340:"GET.PIVOT.FIELD",341:"GET.PIVOT.ITEM",342:"RADIANS",343:"DEGREES",344:"SUBTOTAL",345:"SUMIF",346:"COUNTIF",347:"COUNTBLANK",348:"SCENARIO.GET",349:"OPTIONS.LISTS.GET",350:"ISPMT",351:"DATEDIF",352:"DATESTRING",353:"NUMBERSTRING",354:"ROMAN",355:"OPEN.DIALOG",356:"SAVE.DIALOG",357:"VIEW.GET",358:"GETPIVOTDATA",359:"HYPERLINK",360:"PHONETIC",361:"AVERAGEA",362:"MAXA",363:"MINA",364:"STDEVPA",365:"VARPA",366:"STDEVA",367:"VARA",368:"BAHTTEXT",369:"THAIDAYOFWEEK",370:"THAIDIGIT",371:"THAIMONTHOFYEAR",372:"THAINUMSOUND",373:"THAINUMSTRING",374:"THAISTRINGLENGTH",375:"ISTHAIDIGIT",376:"ROUNDBAHTDOWN",377:"ROUNDBAHTUP",378:"THAIYEAR",379:"RTD",380:"CUBEVALUE",381:"CUBEMEMBER",382:"CUBEMEMBERPROPERTY",383:"CUBERANKEDMEMBER",384:"HEX2BIN",385:"HEX2DEC",386:"HEX2OCT",387:"DEC2BIN",388:"DEC2HEX",389:"DEC2OCT",390:"OCT2BIN",391:"OCT2HEX",392:"OCT2DEC",393:"BIN2DEC",394:"BIN2OCT",395:"BIN2HEX",396:"IMSUB",397:"IMDIV",398:"IMPOWER",399:"IMABS",400:"IMSQRT",401:"IMLN",402:"IMLOG2",403:"IMLOG10",404:"IMSIN",405:"IMCOS",406:"IMEXP",407:"IMARGUMENT",408:"IMCONJUGATE",409:"IMAGINARY",410:"IMREAL",411:"COMPLEX",412:"IMSUM",413:"IMPRODUCT",414:"SERIESSUM",415:"FACTDOUBLE",416:"SQRTPI",417:"QUOTIENT",418:"DELTA",419:"GESTEP",420:"ISEVEN",421:"ISODD",422:"MROUND",423:"ERF",424:"ERFC",425:"BESSELJ",426:"BESSELK",427:"BESSELY",428:"BESSELI",429:"XIRR",430:"XNPV",431:"PRICEMAT",432:"YIELDMAT",433:"INTRATE",434:"RECEIVED",435:"DISC",436:"PRICEDISC",437:"YIELDDISC",438:"TBILLEQ",439:"TBILLPRICE",440:"TBILLYIELD",441:"PRICE",442:"YIELD",443:"DOLLARDE",444:"DOLLARFR",445:"NOMINAL",446:"EFFECT",447:"CUMPRINC",448:"CUMIPMT",449:"EDATE",450:"EOMONTH",451:"YEARFRAC",452:"COUPDAYBS",453:"COUPDAYS",454:"COUPDAYSNC",455:"COUPNCD",456:"COUPNUM",457:"COUPPCD",458:"DURATION",459:"MDURATION",460:"ODDLPRICE",461:"ODDLYIELD",462:"ODDFPRICE",463:"ODDFYIELD",464:"RANDBETWEEN",465:"WEEKNUM",466:"AMORDEGRC",467:"AMORLINC",468:"CONVERT",724:"SHEETJS",469:"ACCRINT",470:"ACCRINTM",471:"WORKDAY",472:"NETWORKDAYS",473:"GCD",474:"MULTINOMIAL",475:"LCM",476:"FVSCHEDULE",477:"CUBEKPIMEMBER",478:"CUBESET",479:"CUBESETCOUNT",480:"IFERROR",481:"COUNTIFS",482:"SUMIFS",483:"AVERAGEIF",484:"AVERAGEIFS"},zO={2:1,3:1,10:0,15:1,16:1,17:1,18:1,19:0,20:1,21:1,22:1,23:1,24:1,25:1,26:1,27:2,30:2,31:3,32:1,33:1,34:0,35:0,38:1,39:2,40:3,41:3,42:3,43:3,44:3,45:3,47:3,48:2,53:1,61:3,63:0,65:3,66:3,67:1,68:1,69:1,70:1,71:1,72:1,73:1,74:0,75:1,76:1,77:1,79:2,80:2,83:1,85:0,86:1,89:0,90:1,94:0,95:0,97:2,98:1,99:1,101:3,102:3,105:1,106:1,108:2,111:1,112:1,113:1,114:1,117:2,118:1,119:4,121:1,126:1,127:1,128:1,129:1,130:1,131:1,133:1,134:1,135:1,136:2,137:2,138:2,140:1,141:1,142:3,143:4,144:4,161:1,162:1,163:1,164:1,165:2,172:1,175:2,176:2,177:3,178:2,179:1,184:1,186:1,189:3,190:1,195:3,196:3,197:1,198:1,199:3,201:1,207:4,210:3,211:1,212:2,213:2,214:1,215:1,225:0,229:1,230:1,231:1,232:1,233:1,234:1,235:3,244:1,247:4,252:2,257:1,261:1,271:1,273:4,274:2,275:2,276:2,277:3,278:3,279:1,280:3,281:3,282:3,283:1,284:1,285:2,286:4,287:3,288:2,289:4,290:3,291:3,292:3,293:4,294:1,295:3,296:1,297:3,298:1,299:2,300:3,301:3,302:4,303:2,304:2,305:2,306:2,307:2,308:2,309:3,310:2,311:2,312:2,313:2,314:2,315:2,316:4,325:2,326:2,327:2,328:2,331:2,332:2,337:2,342:1,343:1,346:2,347:1,350:4,351:3,352:1,353:2,360:1,368:1,369:1,370:1,371:1,372:1,373:1,374:1,375:1,376:1,377:1,378:1,382:3,385:1,392:1,393:1,396:2,397:2,398:2,399:1,400:1,401:1,402:1,403:1,404:1,405:1,406:1,407:1,408:1,409:1,410:1,414:4,415:1,416:1,417:2,420:1,421:1,422:2,424:1,425:2,426:2,427:2,428:2,430:3,438:3,439:3,440:3,443:2,444:2,445:2,446:2,447:6,448:6,449:2,450:2,464:2,468:3,476:2,479:1,480:2,65535:0};function GO(e){var t="of:="+e.replace(jd,"$1[.$2$3$4$5]").replace(/\]:\[/g,":");return t.replace(/;/g,"|").replace(/,/g,";")}function jO(e){return e.replace(/\./,"!")}var Ta=typeof Map<"u";function Yd(e,t,r){var n=0,i=e.length;if(r){if(Ta?r.has(t):Object.prototype.hasOwnProperty.call(r,t)){for(var o=Ta?r.get(t):r[t];n-1?(r.width=e0(n),r.customWidth=1):t.width!=null&&(r.width=t.width),t.hidden&&(r.hidden=!0),t.level!=null&&(r.outlineLevel=r.level=t.level),r}function Uw(e,t){if(e){var r=[.7,.7,.75,.75,.3,.3];t=="xlml"&&(r=[1,1,1,1,.5,.5]),e.left==null&&(e.left=r[0]),e.right==null&&(e.right=r[1]),e.top==null&&(e.top=r[2]),e.bottom==null&&(e.bottom=r[3]),e.header==null&&(e.header=r[4]),e.footer==null&&(e.footer=r[5])}}function Wn(e,t,r){var n=r.revssf[t.z!=null?t.z:"General"],i=60,o=e.length;if(n==null&&r.ssf){for(;i<392;++i)if(r.ssf[i]==null){$x(t.z,i),r.ssf[i]=t.z,r.revssf[t.z]=n=i;break}}for(i=0;i!=o;++i)if(e[i].numFmtId===n)return i;return e[o]={numFmtId:n,fontId:0,fillId:0,borderId:0,xfId:0,applyNumberFormat:1},o}function XO(e,t,r){if(e&&e["!ref"]){var n=Xe(e["!ref"]);if(n.e.c',r=0;r!=e.length;++r)t+='';return t+""}function YO(e,t,r,n,i){var o=!1,a={},s=null;if(n.bookType!=="xlsx"&&t.vbaraw){var l=t.SheetNames[r];try{t.Workbook&&(l=t.Workbook.Sheets[r].CodeName||l)}catch{}o=!0,a.codeName=Xr(Be(l))}if(e&&e["!outline"]){var u={summaryBelow:1,summaryRight:1};e["!outline"].above&&(u.summaryBelow=0),e["!outline"].left&&(u.summaryRight=0),s=(s||"")+fe("outlinePr",null,u)}!o&&!s||(i[i.length]=fe("sheetPr",s,a))}var qO=["objects","scenarios","selectLockedCells","selectUnlockedCells"],QO=["formatColumns","formatRows","formatCells","insertColumns","insertRows","insertHyperlinks","deleteColumns","deleteRows","sort","autoFilter","pivotTables"];function ZO(e){var t={sheet:1};return qO.forEach(function(r){e[r]!=null&&e[r]&&(t[r]="1")}),QO.forEach(function(r){e[r]!=null&&!e[r]&&(t[r]="0")}),e.password&&(t.password=Sw(e.password).toString(16).toUpperCase()),fe("sheetProtection",null,t)}function JO(e){return Uw(e),fe("pageMargins",null,e)}function eF(e,t){for(var r=[""],n,i=0;i!=t.length;++i)(n=t[i])&&(r[r.length]=fe("col",null,Ou(i,n)));return r[r.length]="",r.join("")}function tF(e,t,r,n){var i=typeof e.ref=="string"?e.ref:ot(e.ref);r.Workbook||(r.Workbook={Sheets:[]}),r.Workbook.Names||(r.Workbook.Names=[]);var o=r.Workbook.Names,a=tr(i);a.s.r==a.e.r&&(a.e.r=tr(t["!ref"]).e.r,i=ot(a));for(var s=0;s"u"&&(e.z=rt[14]);break;default:i=e.v;break}var s=Et("v",Be(i)),l={r:t},u=Wn(n.cellXfs,e,n);switch(u!==0&&(l.s=u),e.t){case"n":break;case"d":l.t="d";break;case"b":l.t="b";break;case"e":l.t="e";break;case"z":break;default:if(e.v==null){delete e.t;break}if(e.v.length>32767)throw new Error("Text length must not exceed 32767 characters");if(n&&n.bookSST){s=Et("v",""+Yd(n.Strings,e.v,n.revStrings)),l.t="s";break}l.t="str";break}if(e.t!=o&&(e.t=o,e.v=a),typeof e.f=="string"&&e.f){var c=e.F&&e.F.slice(0,t.length)==t?{t:"array",ref:e.F}:null;s=fe("f",Be(e.f),c)+(e.v!=null?s:"")}return e.l&&r["!links"].push([t,e.l]),e.D&&(l.cm=1),fe("c",s,l)}function iF(e,t,r,n){var i=[],o=[],a=Xe(e["!ref"]),s="",l,u="",c=[],f=0,d=0,h=e["!rows"],m=Array.isArray(e),p={r:u},g,v=-1;for(d=a.s.c;d<=a.e.c;++d)c[d]=Ft(d);for(f=a.s.r;f<=a.e.r;++f){for(o=[],u=_t(f),d=a.s.c;d<=a.e.c;++d){l=c[d]+u;var w=m?(e[f]||[])[d]:e[l];w!==void 0&&(s=nF(w,l,e,t))!=null&&o.push(s)}(o.length>0||h&&h[f])&&(p={r:u},h&&h[f]&&(g=h[f],g.hidden&&(p.hidden=1),v=-1,g.hpx?v=jl(g.hpx):g.hpt&&(v=g.hpt),v>-1&&(p.ht=v,p.customHeight=1),g.level&&(p.outlineLevel=g.level)),i[i.length]=fe("row",o.join(""),p))}if(h)for(;f-1&&(p.ht=v,p.customHeight=1),g.level&&(p.outlineLevel=g.level),i[i.length]=fe("row","",p));return i.join("")}function Hw(e,t,r,n){var i=[at,fe("worksheet",null,{xmlns:Oo[0],"xmlns:r":ft.r})],o=r.SheetNames[e],a=0,s="",l=r.Sheets[o];l==null&&(l={});var u=l["!ref"]||"A1",c=Xe(u);if(c.e.c>16383||c.e.r>1048575){if(t.WTF)throw new Error("Range "+u+" exceeds format limit A1:XFD1048576");c.e.c=Math.min(c.e.c,16383),c.e.r=Math.min(c.e.c,1048575),u=ot(c)}n||(n={}),l["!comments"]=[];var f=[];YO(l,r,e,t,i),i[i.length]=fe("dimension",null,{ref:u}),i[i.length]=rF(l,t,e,r),t.sheetFormat&&(i[i.length]=fe("sheetFormatPr",null,{defaultRowHeight:t.sheetFormat.defaultRowHeight||"16",baseColWidth:t.sheetFormat.baseColWidth||"10",outlineLevelRow:t.sheetFormat.outlineLevelRow||"7"})),l["!cols"]!=null&&l["!cols"].length>0&&(i[i.length]=eF(l,l["!cols"])),i[a=i.length]="",l["!links"]=[],l["!ref"]!=null&&(s=iF(l,t),s.length>0&&(i[i.length]=s)),i.length>a+1&&(i[i.length]="",i[a]=i[a].replace("/>",">")),l["!protect"]&&(i[i.length]=ZO(l["!protect"])),l["!autofilter"]!=null&&(i[i.length]=tF(l["!autofilter"],l,r,e)),l["!merges"]!=null&&l["!merges"].length>0&&(i[i.length]=KO(l["!merges"]));var d=-1,h,m=-1;return l["!links"].length>0&&(i[i.length]="",l["!links"].forEach(function(p){p[1].Target&&(h={ref:p[0]},p[1].Target.charAt(0)!="#"&&(m=Le(n,-1,Be(p[1].Target).replace(/#.*$/,""),ke.HLINK),h["r:id"]="rId"+m),(d=p[1].Target.indexOf("#"))>-1&&(h.location=Be(p[1].Target.slice(d+1))),p[1].Tooltip&&(h.tooltip=Be(p[1].Tooltip)),i[i.length]=fe("hyperlink",null,h))}),i[i.length]=""),delete l["!links"],l["!margins"]!=null&&(i[i.length]=JO(l["!margins"])),(!t||t.ignoreEC||t.ignoreEC==null)&&(i[i.length]=Et("ignoredErrors",fe("ignoredError",null,{numberStoredAsText:1,sqref:u}))),f.length>0&&(m=Le(n,-1,"../drawings/drawing"+(e+1)+".xml",ke.DRAW),i[i.length]=fe("drawing",null,{"r:id":"rId"+m}),l["!drawing"]=f),l["!comments"].length>0&&(m=Le(n,-1,"../drawings/vmlDrawing"+(e+1)+".vml",ke.VML),i[i.length]=fe("legacyDrawing",null,{"r:id":"rId"+m}),l["!legacy"]=m),i.length>1&&(i[i.length]="",i[1]=i[1].replace("/>",">")),i.join("")}function oF(e,t){var r={},n=e.l+t;r.r=e.read_shift(4),e.l+=4;var i=e.read_shift(2);e.l+=1;var o=e.read_shift(1);return e.l=n,o&7&&(r.level=o&7),o&16&&(r.hidden=!0),o&32&&(r.hpt=i/20),r}function aF(e,t,r){var n=Z(145),i=(r["!rows"]||[])[e]||{};n.write_shift(4,e),n.write_shift(4,0);var o=320;i.hpx?o=jl(i.hpx)*20:i.hpt&&(o=i.hpt*20),n.write_shift(2,o),n.write_shift(1,0);var a=0;i.level&&(a|=i.level),i.hidden&&(a|=16),(i.hpx||i.hpt)&&(a|=32),n.write_shift(1,a),n.write_shift(1,0);var s=0,l=n.l;n.l+=4;for(var u={r:e,c:0},c=0;c<16;++c)if(!(t.s.c>c+1<<10||t.e.cn.l?n.slice(0,n.l):n}function sF(e,t,r,n){var i=aF(n,r,t);(i.length>17||(t["!rows"]||[])[n])&&ie(e,0,i)}var lF=Si,uF=Do;function cF(){}function fF(e,t){var r={},n=e[e.l];return++e.l,r.above=!(n&64),r.left=!(n&128),e.l+=18,r.name=E3(e),r}function dF(e,t,r){r==null&&(r=Z(84+4*e.length));var n=192;t&&(t.above&&(n&=-65),t.left&&(n&=-129)),r.write_shift(1,n);for(var i=1;i<3;++i)r.write_shift(1,0);return Vl({auto:1},r),r.write_shift(-4,-1),r.write_shift(-4,-1),rw(e,r),r.slice(0,r.l)}function hF(e){var t=gr(e);return[t]}function pF(e,t,r){return r==null&&(r=Z(8)),yi(t,r)}function gF(e){var t=Ei(e);return[t]}function mF(e,t,r){return r==null&&(r=Z(4)),_i(t,r)}function vF(e){var t=gr(e),r=e.read_shift(1);return[t,r,"b"]}function xF(e,t,r){return r==null&&(r=Z(9)),yi(t,r),r.write_shift(1,e.v?1:0),r}function wF(e){var t=Ei(e),r=e.read_shift(1);return[t,r,"b"]}function yF(e,t,r){return r==null&&(r=Z(5)),_i(t,r),r.write_shift(1,e.v?1:0),r}function EF(e){var t=gr(e),r=e.read_shift(1);return[t,r,"e"]}function _F(e,t,r){return r==null&&(r=Z(9)),yi(t,r),r.write_shift(1,e.v),r}function SF(e){var t=Ei(e),r=e.read_shift(1);return[t,r,"e"]}function TF(e,t,r){return r==null&&(r=Z(8)),_i(t,r),r.write_shift(1,e.v),r.write_shift(2,0),r.write_shift(1,0),r}function CF(e){var t=gr(e),r=e.read_shift(4);return[t,r,"s"]}function AF(e,t,r){return r==null&&(r=Z(12)),yi(t,r),r.write_shift(4,t.v),r}function RF(e){var t=Ei(e),r=e.read_shift(4);return[t,r,"s"]}function OF(e,t,r){return r==null&&(r=Z(8)),_i(t,r),r.write_shift(4,t.v),r}function FF(e){var t=gr(e),r=Po(e);return[t,r,"n"]}function DF(e,t,r){return r==null&&(r=Z(16)),yi(t,r),li(e.v,r),r}function PF(e){var t=Ei(e),r=Po(e);return[t,r,"n"]}function IF(e,t,r){return r==null&&(r=Z(12)),_i(t,r),li(e.v,r),r}function bF(e){var t=gr(e),r=nw(e);return[t,r,"n"]}function kF(e,t,r){return r==null&&(r=Z(12)),yi(t,r),iw(e.v,r),r}function $F(e){var t=Ei(e),r=nw(e);return[t,r,"n"]}function NF(e,t,r){return r==null&&(r=Z(8)),_i(t,r),iw(e.v,r),r}function MF(e){var t=gr(e),r=Hd(e);return[t,r,"is"]}function LF(e){var t=gr(e),r=Dt(e);return[t,r,"str"]}function BF(e,t,r){return r==null&&(r=Z(12+4*e.v.length)),yi(t,r),ht(e.v,r),r.length>r.l?r.slice(0,r.l):r}function UF(e){var t=Ei(e),r=Dt(e);return[t,r,"str"]}function HF(e,t,r){return r==null&&(r=Z(8+4*e.v.length)),_i(t,r),ht(e.v,r),r.length>r.l?r.slice(0,r.l):r}function VF(e,t,r){var n=e.l+t,i=gr(e);i.r=r["!row"];var o=e.read_shift(1),a=[i,o,"b"];if(r.cellFormula){e.l+=2;var s=Ru(e,n-e.l,r);a[3]=xo(s,null,i,r.supbooks,r)}else e.l=n;return a}function WF(e,t,r){var n=e.l+t,i=gr(e);i.r=r["!row"];var o=e.read_shift(1),a=[i,o,"e"];if(r.cellFormula){e.l+=2;var s=Ru(e,n-e.l,r);a[3]=xo(s,null,i,r.supbooks,r)}else e.l=n;return a}function zF(e,t,r){var n=e.l+t,i=gr(e);i.r=r["!row"];var o=Po(e),a=[i,o,"n"];if(r.cellFormula){e.l+=2;var s=Ru(e,n-e.l,r);a[3]=xo(s,null,i,r.supbooks,r)}else e.l=n;return a}function GF(e,t,r){var n=e.l+t,i=gr(e);i.r=r["!row"];var o=Dt(e),a=[i,o,"str"];if(r.cellFormula){e.l+=2;var s=Ru(e,n-e.l,r);a[3]=xo(s,null,i,r.supbooks,r)}else e.l=n;return a}var jF=Si,XF=Do;function KF(e,t){return t==null&&(t=Z(4)),t.write_shift(4,e),t}function YF(e,t){var r=e.l+t,n=Si(e),i=Vd(e),o=Dt(e),a=Dt(e),s=Dt(e);e.l=r;var l={rfx:n,relId:i,loc:o,display:s};return a&&(l.Tooltip=a),l}function qF(e,t){var r=Z(50+4*(e[1].Target.length+(e[1].Tooltip||"").length));Do({s:dt(e[0]),e:dt(e[0])},r),Wd("rId"+t,r);var n=e[1].Target.indexOf("#"),i=n==-1?"":e[1].Target.slice(n+1);return ht(i||"",r),ht(e[1].Tooltip||"",r),ht("",r),r.slice(0,r.l)}function QF(){}function ZF(e,t,r){var n=e.l+t,i=ow(e),o=e.read_shift(1),a=[i];if(a[2]=o,r.cellFormula){var s=UO(e,n-e.l,r);a[1]=s}else e.l=n;return a}function JF(e,t,r){var n=e.l+t,i=Si(e),o=[i];if(r.cellFormula){var a=VO(e,n-e.l,r);o[1]=a,e.l=n}else e.l=n;return o}function eD(e,t,r){r==null&&(r=Z(18));var n=Ou(e,t);r.write_shift(-4,e),r.write_shift(-4,e),r.write_shift(4,(n.width||10)*256),r.write_shift(4,0);var i=0;return t.hidden&&(i|=1),typeof n.width=="number"&&(i|=2),t.level&&(i|=t.level<<8),r.write_shift(2,i),r}var Vw=["left","right","top","bottom","header","footer"];function tD(e){var t={};return Vw.forEach(function(r){t[r]=Po(e)}),t}function rD(e,t){return t==null&&(t=Z(6*8)),Uw(e),Vw.forEach(function(r){li(e[r],t)}),t}function nD(e){var t=e.read_shift(2);return e.l+=28,{RTL:t&32}}function iD(e,t,r){r==null&&(r=Z(30));var n=924;return(((t||{}).Views||[])[0]||{}).RTL&&(n|=32),r.write_shift(2,n),r.write_shift(4,0),r.write_shift(4,0),r.write_shift(4,0),r.write_shift(1,0),r.write_shift(1,0),r.write_shift(2,0),r.write_shift(2,100),r.write_shift(2,0),r.write_shift(2,0),r.write_shift(2,0),r.write_shift(4,0),r}function oD(e){var t=Z(24);return t.write_shift(4,4),t.write_shift(4,1),Do(e,t),t}function aD(e,t){return t==null&&(t=Z(16*4+2)),t.write_shift(2,e.password?Sw(e.password):0),t.write_shift(4,1),[["objects",!1],["scenarios",!1],["formatCells",!0],["formatColumns",!0],["formatRows",!0],["insertColumns",!0],["insertRows",!0],["insertHyperlinks",!0],["deleteColumns",!0],["deleteRows",!0],["selectLockedCells",!1],["sort",!0],["autoFilter",!0],["pivotTables",!0],["selectUnlockedCells",!1]].forEach(function(r){r[1]?t.write_shift(4,e[r[0]]!=null&&!e[r[0]]?1:0):t.write_shift(4,e[r[0]]!=null&&e[r[0]]?0:1)}),t}function sD(){}function lD(){}function uD(e,t,r,n,i,o,a){if(t.v===void 0)return!1;var s="";switch(t.t){case"b":s=t.v?"1":"0";break;case"d":t=Kt(t),t.z=t.z||rt[14],t.v=Xt(Lt(t.v)),t.t="n";break;case"n":case"e":s=""+t.v;break;default:s=t.v;break}var l={r,c:n};switch(l.s=Wn(i.cellXfs,t,i),t.l&&o["!links"].push([Ue(l),t.l]),t.c&&o["!comments"].push([Ue(l),t.c]),t.t){case"s":case"str":return i.bookSST?(s=Yd(i.Strings,t.v,i.revStrings),l.t="s",l.v=s,a?ie(e,18,OF(t,l)):ie(e,7,AF(t,l))):(l.t="str",a?ie(e,17,HF(t,l)):ie(e,6,BF(t,l))),!0;case"n":return t.v==(t.v|0)&&t.v>-1e3&&t.v<1e3?a?ie(e,13,NF(t,l)):ie(e,2,kF(t,l)):a?ie(e,16,IF(t,l)):ie(e,5,DF(t,l)),!0;case"b":return l.t="b",a?ie(e,15,yF(t,l)):ie(e,4,xF(t,l)),!0;case"e":return l.t="e",a?ie(e,14,TF(t,l)):ie(e,3,_F(t,l)),!0}return a?ie(e,12,mF(t,l)):ie(e,1,pF(t,l)),!0}function cD(e,t,r,n){var i=Xe(t["!ref"]||"A1"),o,a="",s=[];ie(e,145);var l=Array.isArray(t),u=i.e.r;t["!rows"]&&(u=Math.max(i.e.r,t["!rows"].length-1));for(var c=i.s.r;c<=u;++c){a=_t(c),sF(e,t,i,c);var f=!1;if(c<=i.e.r)for(var d=i.s.c;d<=i.e.c;++d){c===i.s.r&&(s[d]=Ft(d)),o=s[d]+a;var h=l?(t[c]||[])[d]:t[o];if(!h){f=!1;continue}f=uD(e,h,c,d,n,t,f)}}ie(e,146)}function fD(e,t){!t||!t["!merges"]||(ie(e,177,KF(t["!merges"].length)),t["!merges"].forEach(function(r){ie(e,176,XF(r))}),ie(e,178))}function dD(e,t){!t||!t["!cols"]||(ie(e,390),t["!cols"].forEach(function(r,n){r&&ie(e,60,eD(n,r))}),ie(e,391))}function hD(e,t){!t||!t["!ref"]||(ie(e,648),ie(e,649,oD(Xe(t["!ref"]))),ie(e,650))}function pD(e,t,r){t["!links"].forEach(function(n){if(n[1].Target){var i=Le(r,-1,n[1].Target.replace(/#.*$/,""),ke.HLINK);ie(e,494,qF(n,i))}}),delete t["!links"]}function gD(e,t,r,n){if(t["!comments"].length>0){var i=Le(n,-1,"../drawings/vmlDrawing"+(r+1)+".vml",ke.VML);ie(e,551,Wd("rId"+i)),t["!legacy"]=i}}function mD(e,t,r,n){if(t["!autofilter"]){var i=t["!autofilter"],o=typeof i.ref=="string"?i.ref:ot(i.ref);r.Workbook||(r.Workbook={Sheets:[]}),r.Workbook.Names||(r.Workbook.Names=[]);var a=r.Workbook.Names,s=tr(o);s.s.r==s.e.r&&(s.e.r=tr(t["!ref"]).e.r,o=ot(s));for(var l=0;l16383||l.e.r>1048575){if(t.WTF)throw new Error("Range "+(a["!ref"]||"A1")+" exceeds format limit A1:XFD1048576");l.e.c=Math.min(l.e.c,16383),l.e.r=Math.min(l.e.c,1048575)}return a["!links"]=[],a["!comments"]=[],ie(i,129),(r.vbaraw||a["!outline"])&&ie(i,147,dF(s,a["!outline"])),ie(i,148,uF(l)),vD(i,a,r.Workbook),dD(i,a),cD(i,a,e,t),xD(i,a),mD(i,a,r,e),fD(i,a),pD(i,a,n),a["!margins"]&&ie(i,476,rD(a["!margins"])),(!t||t.ignoreEC||t.ignoreEC==null)&&hD(i,a),gD(i,a,e,n),ie(i,130),i.end()}function yD(e,t){e.l+=10;var r=Dt(e);return{name:r}}var ED=[["allowRefreshQuery",!1,"bool"],["autoCompressPictures",!0,"bool"],["backupFile",!1,"bool"],["checkCompatibility",!1,"bool"],["CodeName",""],["date1904",!1,"bool"],["defaultThemeVersion",0,"int"],["filterPrivacy",!1,"bool"],["hidePivotFieldList",!1,"bool"],["promptedSolutions",!1,"bool"],["publishItems",!1,"bool"],["refreshAllConnections",!1,"bool"],["saveExternalLinkValues",!0,"bool"],["showBorderUnselectedTables",!0,"bool"],["showInkAnnotation",!0,"bool"],["showObjects","all"],["showPivotChartFilter",!1,"bool"],["updateLinks","userSet"]];function _D(e){return!e.Workbook||!e.Workbook.WBProps?"false":J4(e.Workbook.WBProps.date1904)?"true":"false"}var SD="][*?/\\".split("");function Ww(e,t){if(e.length>31){if(t)return!1;throw new Error("Sheet names cannot exceed 31 chars")}var r=!0;return SD.forEach(function(n){if(e.indexOf(n)!=-1){if(!t)throw new Error("Sheet name cannot contain : \\ / ? * [ ]");r=!1}}),r}function TD(e,t,r){e.forEach(function(n,i){Ww(n);for(var o=0;o22)throw new Error("Bad Code Name: Worksheet"+a)}})}function CD(e){if(!e||!e.SheetNames||!e.Sheets)throw new Error("Invalid Workbook");if(!e.SheetNames.length)throw new Error("Workbook is empty");var t=e.Workbook&&e.Workbook.Sheets||[];TD(e.SheetNames,t,!!e.vbaraw);for(var r=0;r0,n={codeName:"ThisWorkbook"};e.Workbook&&e.Workbook.WBProps&&(ED.forEach(function(s){e.Workbook.WBProps[s[0]]!=null&&e.Workbook.WBProps[s[0]]!=s[1]&&(n[s[0]]=e.Workbook.WBProps[s[0]])}),e.Workbook.WBProps.CodeName&&(n.codeName=e.Workbook.WBProps.CodeName,delete n.CodeName)),t[t.length]=fe("workbookPr",null,n);var i=e.Workbook&&e.Workbook.Sheets||[],o=0;if(i&&i[0]&&i[0].Hidden){for(t[t.length]="",o=0;o!=e.SheetNames.length&&!(!i[o]||!i[o].Hidden);++o);o==e.SheetNames.length&&(o=0),t[t.length]='',t[t.length]=""}for(t[t.length]="",o=0;o!=e.SheetNames.length;++o){var a={name:Be(e.SheetNames[o].slice(0,31))};if(a.sheetId=""+(o+1),a["r:id"]="rId"+(o+1),i[o])switch(i[o].Hidden){case 1:a.state="hidden";break;case 2:a.state="veryHidden";break}t[t.length]=fe("sheet",null,a)}return t[t.length]="",r&&(t[t.length]="",e.Workbook&&e.Workbook.Names&&e.Workbook.Names.forEach(function(s){var l={name:s.Name};s.Comment&&(l.comment=s.Comment),s.Sheet!=null&&(l.localSheetId=""+s.Sheet),s.Hidden&&(l.hidden="1"),s.Ref&&(t[t.length]=fe("definedName",Be(s.Ref),l))}),t[t.length]=""),t.length>2&&(t[t.length]="",t[1]=t[1].replace("/>",">")),t.join("")}function AD(e,t){var r={};return r.Hidden=e.read_shift(4),r.iTabID=e.read_shift(4),r.strRelID=Jf(e),r.name=Dt(e),r}function RD(e,t){return t||(t=Z(127)),t.write_shift(4,e.Hidden),t.write_shift(4,e.iTabID),Wd(e.strRelID,t),ht(e.name.slice(0,31),t),t.length>t.l?t.slice(0,t.l):t}function OD(e,t){var r={},n=e.read_shift(4);r.defaultThemeVersion=e.read_shift(4);var i=t>8?Dt(e):"";return i.length>0&&(r.CodeName=i),r.autoCompressPictures=!!(n&65536),r.backupFile=!!(n&64),r.checkCompatibility=!!(n&4096),r.date1904=!!(n&1),r.filterPrivacy=!!(n&8),r.hidePivotFieldList=!!(n&1024),r.promptedSolutions=!!(n&16),r.publishItems=!!(n&2048),r.refreshAllConnections=!!(n&262144),r.saveExternalLinkValues=!!(n&128),r.showBorderUnselectedTables=!!(n&4),r.showInkAnnotation=!!(n&32),r.showObjects=["all","placeholders","none"][n>>13&3],r.showPivotChartFilter=!!(n&32768),r.updateLinks=["userSet","never","always"][n>>8&3],r}function FD(e,t){t||(t=Z(72));var r=0;return e&&e.filterPrivacy&&(r|=8),t.write_shift(4,r),t.write_shift(4,0),rw(e&&e.CodeName||"ThisWorkbook",t),t.slice(0,t.l)}function DD(e,t,r){var n=e.l+t;e.l+=4,e.l+=1;var i=e.read_shift(4),o=_3(e),a=HO(e,0,r),s=Vd(e);e.l=n;var l={Name:o,Ptg:a};return i<268435455&&(l.Sheet=i),s&&(l.Comment=s),l}function PD(e,t){ie(e,143);for(var r=0;r!=t.SheetNames.length;++r){var n=t.Workbook&&t.Workbook.Sheets&&t.Workbook.Sheets[r]&&t.Workbook.Sheets[r].Hidden||0,i={Hidden:n,iTabID:r+1,strRelID:"rId"+(r+1),name:t.SheetNames[r]};ie(e,156,RD(i))}ie(e,144)}function ID(e,t){t||(t=Z(127));for(var r=0;r!=4;++r)t.write_shift(4,0);return ht("SheetJS",t),ht($l.version,t),ht($l.version,t),ht("7262",t),t.length>t.l?t.slice(0,t.l):t}function bD(e,t){t||(t=Z(29)),t.write_shift(-4,0),t.write_shift(-4,460),t.write_shift(4,28800),t.write_shift(4,17600),t.write_shift(4,500),t.write_shift(4,e),t.write_shift(4,e);var r=120;return t.write_shift(1,r),t.length>t.l?t.slice(0,t.l):t}function kD(e,t){if(!(!t.Workbook||!t.Workbook.Sheets)){for(var r=t.Workbook.Sheets,n=0,i=-1,o=-1;ni||(ie(e,135),ie(e,158,bD(i)),ie(e,136))}}function $D(e,t){var r=jt();return ie(r,131),ie(r,128,ID()),ie(r,153,FD(e.Workbook&&e.Workbook.WBProps||null)),kD(r,e),PD(r,e),ie(r,132),r.end()}function ND(e,t,r){return(t.slice(-4)===".bin"?$D:zw)(e)}function MD(e,t,r,n,i){return(t.slice(-4)===".bin"?wD:Hw)(e,r,n,i)}function LD(e,t,r){return(t.slice(-4)===".bin"?rR:Aw)(e,r)}function BD(e,t,r){return(t.slice(-4)===".bin"?FA:_w)(e,r)}function UD(e,t,r){return(t.slice(-4)===".bin"?xR:Pw)(e)}function HD(e){return(e.slice(-4)===".bin"?cR:Fw)()}function VD(e,t){var r=[];return e.Props&&r.push(L3(e.Props,t)),e.Custprops&&r.push(B3(e.Props,e.Custprops)),r.join("")}function WD(){return""}function zD(e,t){var r=[''];return t.cellXfs.forEach(function(n,i){var o=[];o.push(fe("NumberFormat",null,{"ss:Format":Be(rt[n.numFmtId])}));var a={"ss:ID":"s"+(21+i)};r.push(fe("Style",o.join(""),a))}),fe("Styles",r.join(""))}function Gw(e){return fe("NamedRange",null,{"ss:Name":e.Name,"ss:RefersTo":"="+Xd(e.Ref,{r:0,c:0})})}function GD(e){if(!((e||{}).Workbook||{}).Names)return"";for(var t=e.Workbook.Names,r=[],n=0;n"),e["!margins"].header&&i.push(fe("Header",null,{"x:Margin":e["!margins"].header})),e["!margins"].footer&&i.push(fe("Footer",null,{"x:Margin":e["!margins"].footer})),i.push(fe("PageMargins",null,{"x:Bottom":e["!margins"].bottom||"0.75","x:Left":e["!margins"].left||"0.7","x:Right":e["!margins"].right||"0.7","x:Top":e["!margins"].top||"0.75"})),i.push("")),n&&n.Workbook&&n.Workbook.Sheets&&n.Workbook.Sheets[r])if(n.Workbook.Sheets[r].Hidden)i.push(fe("Visible",n.Workbook.Sheets[r].Hidden==1?"SheetHidden":"SheetVeryHidden",{}));else{for(var o=0;o")}return((((n||{}).Workbook||{}).Views||[])[0]||{}).RTL&&i.push(""),e["!protect"]&&(i.push(Et("ProtectContents","True")),e["!protect"].objects&&i.push(Et("ProtectObjects","True")),e["!protect"].scenarios&&i.push(Et("ProtectScenarios","True")),e["!protect"].selectLockedCells!=null&&!e["!protect"].selectLockedCells?i.push(Et("EnableSelection","NoSelection")):e["!protect"].selectUnlockedCells!=null&&!e["!protect"].selectUnlockedCells&&i.push(Et("EnableSelection","UnlockedCells")),[["formatCells","AllowFormatCells"],["formatColumns","AllowSizeCols"],["formatRows","AllowSizeRows"],["insertColumns","AllowInsertCols"],["insertRows","AllowInsertRows"],["insertHyperlinks","AllowInsertHyperlinks"],["deleteColumns","AllowDeleteCols"],["deleteRows","AllowDeleteRows"],["sort","AllowSort"],["autoFilter","AllowFilter"],["pivotTables","AllowUsePivotTables"]].forEach(function(a){e["!protect"][a[0]]&&i.push("<"+a[1]+"/>")})),i.length==0?"":fe("WorksheetOptions",i.join(""),{xmlns:Qt.x})}function KD(e){return e.map(function(t){var r=Z4(t.t||""),n=fe("ss:Data",r,{xmlns:"http://www.w3.org/TR/REC-html40"});return fe("Comment",n,{"ss:Author":t.a})}).join("")}function YD(e,t,r,n,i,o,a){if(!e||e.v==null&&e.f==null)return"";var s={};if(e.f&&(s["ss:Formula"]="="+Be(Xd(e.f,a))),e.F&&e.F.slice(0,t.length)==t){var l=dt(e.F.slice(t.length+1));s["ss:ArrayRange"]="RC:R"+(l.r==a.r?"":"["+(l.r-a.r)+"]")+"C"+(l.c==a.c?"":"["+(l.c-a.c)+"]")}if(e.l&&e.l.Target&&(s["ss:HRef"]=Be(e.l.Target),e.l.Tooltip&&(s["x:HRefScreenTip"]=Be(e.l.Tooltip))),r["!merges"])for(var u=r["!merges"],c=0;c!=u.length;++c)u[c].s.c!=a.c||u[c].s.r!=a.r||(u[c].e.c>u[c].s.c&&(s["ss:MergeAcross"]=u[c].e.c-u[c].s.c),u[c].e.r>u[c].s.r&&(s["ss:MergeDown"]=u[c].e.r-u[c].s.r));var f="",d="";switch(e.t){case"z":if(!n.sheetStubs)return"";break;case"n":f="Number",d=String(e.v);break;case"b":f="Boolean",d=e.v?"1":"0";break;case"e":f="Error",d=ss[e.v];break;case"d":f="DateTime",d=new Date(e.v).toISOString(),e.z==null&&(e.z=e.z||rt[14]);break;case"s":f="String",d=Q4(e.v||"");break}var h=Wn(n.cellXfs,e,n);s["ss:StyleID"]="s"+(21+h),s["ss:Index"]=a.c+1;var m=e.v!=null?d:"",p=e.t=="z"?"":''+m+"";return(e.c||[]).length>0&&(p+=KD(e.c)),fe("Cell",p,s)}function qD(e,t){var r='"}function QD(e,t,r,n){if(!e["!ref"])return"";var i=Xe(e["!ref"]),o=e["!merges"]||[],a=0,s=[];e["!cols"]&&e["!cols"].forEach(function(g,v){Gd(g);var w=!!g.width,y=Ou(v,g),E={"ss:Index":v+1};w&&(E["ss:Width"]=zl(y.width)),g.hidden&&(E["ss:Hidden"]="1"),s.push(fe("Column",null,E))});for(var l=Array.isArray(e),u=i.s.r;u<=i.e.r;++u){for(var c=[qD(u,(e["!rows"]||[])[u])],f=i.s.c;f<=i.e.c;++f){var d=!1;for(a=0;a!=o.length;++a)if(!(o[a].s.c>f)&&!(o[a].s.r>u)&&!(o[a].e.c"),c.length>2&&s.push(c.join(""))}return s.join("")}function ZD(e,t,r){var n=[],i=r.SheetNames[e],o=r.Sheets[i],a=o?jD(o,t,e,r):"";return a.length>0&&n.push(""+a+""),a=o?QD(o,t,e,r):"",a.length>0&&n.push(""+a+"
"),n.push(XD(o,t,e,r)),n.join("")}function JD(e,t){t||(t={}),e.SSF||(e.SSF=Kt(rt)),e.SSF&&(Su(),_u(e.SSF),t.revssf=Tu(e.SSF),t.revssf[e.SSF[65535]]=0,t.ssf=e.SSF,t.cellXfs=[],Wn(t.cellXfs,{},{revssf:{General:0}}));var r=[];r.push(VD(e,t)),r.push(WD()),r.push(""),r.push("");for(var n=0;n-1||dw.indexOf(i[o][0])>-1||i[o][1]!=null&&u.push(i[o]);n.length&&He.utils.cfb_add(t,"/SummaryInformation",Bg(n,Mc.SI,l,kg)),(r.length||u.length)&&He.utils.cfb_add(t,"/DocumentSummaryInformation",Bg(r,Mc.DSI,s,bg,u.length?u:null,Mc.UDI))}function t6(e,t){var r=t||{},n=He.utils.cfb_new({root:"R"}),i="/Workbook";switch(r.bookType||"xls"){case"xls":r.bookType="biff8";case"xla":r.bookType||(r.bookType="xla");case"biff8":i="/Workbook",r.biff=8;break;case"biff5":i="/Book",r.biff=5;break;default:throw new Error("invalid type "+r.bookType+" for XLS CFB")}return He.utils.cfb_add(n,i,jw(e,r)),r.biff==8&&(e.Props||e.Custprops)&&e6(e,n),r.biff==8&&e.vbaraw&&wR(n,He.read(e.vbaraw,{type:typeof e.vbaraw=="string"?"binary":"buffer"})),n}var r6={0:{f:oF},1:{f:hF},2:{f:bF},3:{f:EF},4:{f:vF},5:{f:FF},6:{f:LF},7:{f:CF},8:{f:GF},9:{f:zF},10:{f:VF},11:{f:WF},12:{f:gF},13:{f:$F},14:{f:SF},15:{f:wF},16:{f:PF},17:{f:UF},18:{f:RF},19:{f:Hd},20:{},21:{},22:{},23:{},24:{},25:{},26:{},27:{},28:{},29:{},30:{},31:{},32:{},33:{},34:{},35:{T:1},36:{T:-1},37:{T:1},38:{T:-1},39:{f:DD},40:{},42:{},43:{f:LA},44:{f:NA},45:{f:HA},46:{f:WA},47:{f:VA},48:{},49:{f:g3},50:{},51:{f:oR},52:{T:1},53:{T:-1},54:{T:1},55:{T:-1},56:{T:1},57:{T:-1},58:{},59:{},60:{f:mA},62:{f:MF},63:{f:fR},64:{f:sD},65:{},66:{},67:{},68:{},69:{},70:{},128:{},129:{T:1},130:{T:-1},131:{T:1,f:$r,p:0},132:{T:-1},133:{T:1},134:{T:-1},135:{T:1},136:{T:-1},137:{T:1,f:nD},138:{T:-1},139:{T:1},140:{T:-1},141:{T:1},142:{T:-1},143:{T:1},144:{T:-1},145:{T:1},146:{T:-1},147:{f:fF},148:{f:lF,p:16},151:{f:QF},152:{},153:{f:OD},154:{},155:{},156:{f:AD},157:{},158:{},159:{T:1,f:AA},160:{T:-1},161:{T:1,f:Si},162:{T:-1},163:{T:1},164:{T:-1},165:{T:1},166:{T:-1},167:{},168:{},169:{},170:{},171:{},172:{T:1},173:{T:-1},174:{},175:{},176:{f:jF},177:{T:1},178:{T:-1},179:{T:1},180:{T:-1},181:{T:1},182:{T:-1},183:{T:1},184:{T:-1},185:{T:1},186:{T:-1},187:{T:1},188:{T:-1},189:{T:1},190:{T:-1},191:{T:1},192:{T:-1},193:{T:1},194:{T:-1},195:{T:1},196:{T:-1},197:{T:1},198:{T:-1},199:{T:1},200:{T:-1},201:{T:1},202:{T:-1},203:{T:1},204:{T:-1},205:{T:1},206:{T:-1},207:{T:1},208:{T:-1},209:{T:1},210:{T:-1},211:{T:1},212:{T:-1},213:{T:1},214:{T:-1},215:{T:1},216:{T:-1},217:{T:1},218:{T:-1},219:{T:1},220:{T:-1},221:{T:1},222:{T:-1},223:{T:1},224:{T:-1},225:{T:1},226:{T:-1},227:{T:1},228:{T:-1},229:{T:1},230:{T:-1},231:{T:1},232:{T:-1},233:{T:1},234:{T:-1},235:{T:1},236:{T:-1},237:{T:1},238:{T:-1},239:{T:1},240:{T:-1},241:{T:1},242:{T:-1},243:{T:1},244:{T:-1},245:{T:1},246:{T:-1},247:{T:1},248:{T:-1},249:{T:1},250:{T:-1},251:{T:1},252:{T:-1},253:{T:1},254:{T:-1},255:{T:1},256:{T:-1},257:{T:1},258:{T:-1},259:{T:1},260:{T:-1},261:{T:1},262:{T:-1},263:{T:1},264:{T:-1},265:{T:1},266:{T:-1},267:{T:1},268:{T:-1},269:{T:1},270:{T:-1},271:{T:1},272:{T:-1},273:{T:1},274:{T:-1},275:{T:1},276:{T:-1},277:{},278:{T:1},279:{T:-1},280:{T:1},281:{T:-1},282:{T:1},283:{T:1},284:{T:-1},285:{T:1},286:{T:-1},287:{T:1},288:{T:-1},289:{T:1},290:{T:-1},291:{T:1},292:{T:-1},293:{T:1},294:{T:-1},295:{T:1},296:{T:-1},297:{T:1},298:{T:-1},299:{T:1},300:{T:-1},301:{T:1},302:{T:-1},303:{T:1},304:{T:-1},305:{T:1},306:{T:-1},307:{T:1},308:{T:-1},309:{T:1},310:{T:-1},311:{T:1},312:{T:-1},313:{T:-1},314:{T:1},315:{T:-1},316:{T:1},317:{T:-1},318:{T:1},319:{T:-1},320:{T:1},321:{T:-1},322:{T:1},323:{T:-1},324:{T:1},325:{T:-1},326:{T:1},327:{T:-1},328:{T:1},329:{T:-1},330:{T:1},331:{T:-1},332:{T:1},333:{T:-1},334:{T:1},335:{f:nR},336:{T:-1},337:{f:lR,T:1},338:{T:-1},339:{T:1},340:{T:-1},341:{T:1},342:{T:-1},343:{T:1},344:{T:-1},345:{T:1},346:{T:-1},347:{T:1},348:{T:-1},349:{T:1},350:{T:-1},351:{},352:{},353:{T:1},354:{T:-1},355:{f:Jf},357:{},358:{},359:{},360:{T:1},361:{},362:{f:cA},363:{},364:{},366:{},367:{},368:{},369:{},370:{},371:{},372:{T:1},373:{T:-1},374:{T:1},375:{T:-1},376:{T:1},377:{T:-1},378:{T:1},379:{T:-1},380:{T:1},381:{T:-1},382:{T:1},383:{T:-1},384:{T:1},385:{T:-1},386:{T:1},387:{T:-1},388:{T:1},389:{T:-1},390:{T:1},391:{T:-1},392:{T:1},393:{T:-1},394:{T:1},395:{T:-1},396:{},397:{},398:{},399:{},400:{},401:{T:1},403:{},404:{},405:{},406:{},407:{},408:{},409:{},410:{},411:{},412:{},413:{},414:{},415:{},416:{},417:{},418:{},419:{},420:{},421:{},422:{T:1},423:{T:1},424:{T:-1},425:{T:-1},426:{f:ZF},427:{f:JF},428:{},429:{T:1},430:{T:-1},431:{T:1},432:{T:-1},433:{T:1},434:{T:-1},435:{T:1},436:{T:-1},437:{T:1},438:{T:-1},439:{T:1},440:{T:-1},441:{T:1},442:{T:-1},443:{T:1},444:{T:-1},445:{T:1},446:{T:-1},447:{T:1},448:{T:-1},449:{T:1},450:{T:-1},451:{T:1},452:{T:-1},453:{T:1},454:{T:-1},455:{T:1},456:{T:-1},457:{T:1},458:{T:-1},459:{T:1},460:{T:-1},461:{T:1},462:{T:-1},463:{T:1},464:{T:-1},465:{T:1},466:{T:-1},467:{T:1},468:{T:-1},469:{T:1},470:{T:-1},471:{},472:{},473:{T:1},474:{T:-1},475:{},476:{f:tD},477:{},478:{},479:{T:1},480:{T:-1},481:{T:1},482:{T:-1},483:{T:1},484:{T:-1},485:{f:cF},486:{T:1},487:{T:-1},488:{T:1},489:{T:-1},490:{T:1},491:{T:-1},492:{T:1},493:{T:-1},494:{f:YF},495:{T:1},496:{T:-1},497:{T:1},498:{T:-1},499:{},500:{T:1},501:{T:-1},502:{T:1},503:{T:-1},504:{},505:{T:1},506:{T:-1},507:{},508:{T:1},509:{T:-1},510:{T:1},511:{T:-1},512:{},513:{},514:{T:1},515:{T:-1},516:{T:1},517:{T:-1},518:{T:1},519:{T:-1},520:{T:1},521:{T:-1},522:{},523:{},524:{},525:{},526:{},527:{},528:{T:1},529:{T:-1},530:{T:1},531:{T:-1},532:{T:1},533:{T:-1},534:{},535:{},536:{},537:{},538:{T:1},539:{T:-1},540:{T:1},541:{T:-1},542:{T:1},548:{},549:{},550:{f:Jf},551:{},552:{},553:{},554:{T:1},555:{T:-1},556:{T:1},557:{T:-1},558:{T:1},559:{T:-1},560:{T:1},561:{T:-1},562:{},564:{},565:{T:1},566:{T:-1},569:{T:1},570:{T:-1},572:{},573:{T:1},574:{T:-1},577:{},578:{},579:{},580:{},581:{},582:{},583:{},584:{},585:{},586:{},587:{},588:{T:-1},589:{},590:{T:1},591:{T:-1},592:{T:1},593:{T:-1},594:{T:1},595:{T:-1},596:{},597:{T:1},598:{T:-1},599:{T:1},600:{T:-1},601:{T:1},602:{T:-1},603:{T:1},604:{T:-1},605:{T:1},606:{T:-1},607:{},608:{T:1},609:{T:-1},610:{},611:{T:1},612:{T:-1},613:{T:1},614:{T:-1},615:{T:1},616:{T:-1},617:{T:1},618:{T:-1},619:{T:1},620:{T:-1},625:{},626:{T:1},627:{T:-1},628:{T:1},629:{T:-1},630:{T:1},631:{T:-1},632:{f:mR},633:{T:1},634:{T:-1},635:{T:1,f:pR},636:{T:-1},637:{f:w3},638:{T:1},639:{},640:{T:-1},641:{T:1},642:{T:-1},643:{T:1},644:{},645:{T:-1},646:{T:1},648:{T:1},649:{},650:{T:-1},651:{f:yD},652:{},653:{T:1},654:{T:-1},655:{T:1},656:{T:-1},657:{T:1},658:{T:-1},659:{},660:{T:1},661:{},662:{T:-1},663:{},664:{T:1},665:{},666:{T:-1},667:{},668:{},669:{},671:{T:1},672:{T:-1},673:{T:1},674:{T:-1},675:{},676:{},677:{},678:{},679:{},680:{},681:{},1024:{},1025:{},1026:{T:1},1027:{T:-1},1028:{T:1},1029:{T:-1},1030:{},1031:{T:1},1032:{T:-1},1033:{T:1},1034:{T:-1},1035:{},1036:{},1037:{},1038:{T:1},1039:{T:-1},1040:{},1041:{T:1},1042:{T:-1},1043:{},1044:{},1045:{},1046:{T:1},1047:{T:-1},1048:{T:1},1049:{T:-1},1050:{},1051:{T:1},1052:{T:1},1053:{f:lD},1054:{T:1},1055:{},1056:{T:1},1057:{T:-1},1058:{T:1},1059:{T:-1},1061:{},1062:{T:1},1063:{T:-1},1064:{T:1},1065:{T:-1},1066:{T:1},1067:{T:-1},1068:{T:1},1069:{T:-1},1070:{T:1},1071:{T:-1},1072:{T:1},1073:{T:-1},1075:{T:1},1076:{T:-1},1077:{T:1},1078:{T:-1},1079:{T:1},1080:{T:-1},1081:{T:1},1082:{T:-1},1083:{T:1},1084:{T:-1},1085:{},1086:{T:1},1087:{T:-1},1088:{T:1},1089:{T:-1},1090:{T:1},1091:{T:-1},1092:{T:1},1093:{T:-1},1094:{T:1},1095:{T:-1},1096:{},1097:{T:1},1098:{},1099:{T:-1},1100:{T:1},1101:{T:-1},1102:{},1103:{},1104:{},1105:{},1111:{},1112:{},1113:{T:1},1114:{T:-1},1115:{T:1},1116:{T:-1},1117:{},1118:{T:1},1119:{T:-1},1120:{T:1},1121:{T:-1},1122:{T:1},1123:{T:-1},1124:{T:1},1125:{T:-1},1126:{},1128:{T:1},1129:{T:-1},1130:{},1131:{T:1},1132:{T:-1},1133:{T:1},1134:{T:-1},1135:{T:1},1136:{T:-1},1137:{T:1},1138:{T:-1},1139:{T:1},1140:{T:-1},1141:{},1142:{T:1},1143:{T:-1},1144:{T:1},1145:{T:-1},1146:{},1147:{T:1},1148:{T:-1},1149:{T:1},1150:{T:-1},1152:{T:1},1153:{T:-1},1154:{T:-1},1155:{T:-1},1156:{T:-1},1157:{T:1},1158:{T:-1},1159:{T:1},1160:{T:-1},1161:{T:1},1162:{T:-1},1163:{T:1},1164:{T:-1},1165:{T:1},1166:{T:-1},1167:{T:1},1168:{T:-1},1169:{T:1},1170:{T:-1},1171:{},1172:{T:1},1173:{T:-1},1177:{},1178:{T:1},1180:{},1181:{},1182:{},2048:{T:1},2049:{T:-1},2050:{},2051:{T:1},2052:{T:-1},2053:{},2054:{},2055:{T:1},2056:{T:-1},2057:{T:1},2058:{T:-1},2060:{},2067:{},2068:{T:1},2069:{T:-1},2070:{},2071:{},2072:{T:1},2073:{T:-1},2075:{},2076:{},2077:{T:1},2078:{T:-1},2079:{},2080:{T:1},2081:{T:-1},2082:{},2083:{T:1},2084:{T:-1},2085:{T:1},2086:{T:-1},2087:{T:1},2088:{T:-1},2089:{T:1},2090:{T:-1},2091:{},2092:{},2093:{T:1},2094:{T:-1},2095:{},2096:{T:1},2097:{T:-1},2098:{T:1},2099:{T:-1},2100:{T:1},2101:{T:-1},2102:{},2103:{T:1},2104:{T:-1},2105:{},2106:{T:1},2107:{T:-1},2108:{},2109:{T:1},2110:{T:-1},2111:{T:1},2112:{T:-1},2113:{T:1},2114:{T:-1},2115:{},2116:{},2117:{},2118:{T:1},2119:{T:-1},2120:{},2121:{T:1},2122:{T:-1},2123:{T:1},2124:{T:-1},2125:{},2126:{T:1},2127:{T:-1},2128:{},2129:{T:1},2130:{T:-1},2131:{T:1},2132:{T:-1},2133:{T:1},2134:{},2135:{},2136:{},2137:{T:1},2138:{T:-1},2139:{T:1},2140:{T:-1},2141:{},3072:{},3073:{},4096:{T:1},4097:{T:-1},5002:{T:1},5003:{T:-1},5081:{T:1},5082:{T:-1},5083:{},5084:{T:1},5085:{T:-1},5086:{T:1},5087:{T:-1},5088:{},5089:{},5090:{},5092:{T:1},5093:{T:-1},5094:{},5095:{T:1},5096:{T:-1},5097:{},5099:{},65535:{n:""}};function de(e,t,r,n){var i=t;if(!isNaN(i)){var o=n||(r||[]).length||0,a=e.next(4);a.write_shift(2,i),a.write_shift(2,o),o>0&&Ld(r)&&e.push(r)}}function n6(e,t,r,n){var i=n||(r||[]).length||0;if(i<=8224)return de(e,t,r,i);var o=t;if(!isNaN(o)){for(var a=r.parts||[],s=0,l=0,u=0;u+(a[s]||8224)<=8224;)u+=a[s]||8224,s++;var c=e.next(4);for(c.write_shift(2,o),c.write_shift(2,u),e.push(r.slice(l,l+u)),l+=u;l=0&&i<65536?de(e,2,yA(r,n,i)):de(e,3,wA(r,n,i));return;case"b":case"e":de(e,5,i6(r,n,t.v,t.t));return;case"s":case"str":de(e,4,o6(r,n,(t.v||"").slice(0,255)));return}de(e,1,us(null,r,n))}function s6(e,t,r,n){var i=Array.isArray(t),o=Xe(t["!ref"]||"A1"),a,s="",l=[];if(o.e.c>255||o.e.r>16383){if(n.WTF)throw new Error("Range "+(t["!ref"]||"A1")+" exceeds format limit A1:IV16384");o.e.c=Math.min(o.e.c,255),o.e.r=Math.min(o.e.c,16383),a=ot(o)}for(var u=o.s.r;u<=o.e.r;++u){s=_t(u);for(var c=o.s.c;c<=o.e.c;++c){u===o.s.r&&(l[c]=Ft(c)),a=l[c]+s;var f=i?(t[u]||[])[c]:t[a];f&&a6(e,f,u,c)}}}function l6(e,t){for(var r=t||{},n=jt(),i=0,o=0;o255||h.e.r>=m){if(t.WTF)throw new Error("Range "+(o["!ref"]||"A1")+" exceeds format limit A1:IV16384");h.e.c=Math.min(h.e.c,255),h.e.r=Math.min(h.e.c,m-1)}de(n,2057,zd(r,16,t)),de(n,13,ar(1)),de(n,12,ar(100)),de(n,15,$t(!0)),de(n,17,$t(!1)),de(n,16,li(.001)),de(n,95,$t(!0)),de(n,42,$t(!1)),de(n,43,$t(!1)),de(n,130,ar(1)),de(n,128,sA([0,0])),de(n,131,$t(!1)),de(n,132,$t(!1)),u&&p6(n,o["!cols"]),de(n,512,aA(h,t)),u&&(o["!links"]=[]);for(var p=h.s.r;p<=h.e.r;++p){f=_t(p);for(var g=h.s.c;g<=h.e.c;++g){p===h.s.r&&(d[g]=Ft(g)),c=d[g]+f;var v=l?(o[p]||[])[g]:o[c];v&&(g6(n,v,p,g,t),u&&v.l&&o["!links"].push([c,v.l]))}}var w=s.CodeName||s.name||i;return u&&de(n,574,tA((a.Views||[])[0])),u&&(o["!merges"]||[]).length&&de(n,229,dA(o["!merges"])),u&&h6(n,o),de(n,442,ww(w)),u&&f6(n,o),de(n,10),n.end()}function v6(e,t,r){var n=jt(),i=(e||{}).Workbook||{},o=i.Sheets||[],a=i.WBProps||{},s=r.biff==8,l=r.biff==5;if(de(n,2057,zd(e,5,r)),r.bookType=="xla"&&de(n,135),de(n,225,s?ar(1200):null),de(n,193,V3(2)),l&&de(n,191),l&&de(n,192),de(n,226),de(n,92,Q3("SheetJS",r)),de(n,66,ar(s?1200:1252)),s&&de(n,353,ar(0)),s&&de(n,448),de(n,317,xA(e.SheetNames.length)),s&&e.vbaraw&&de(n,211),s&&e.vbaraw){var u=a.CodeName||"ThisWorkbook";de(n,442,ww(u))}de(n,156,ar(17)),de(n,25,$t(!1)),de(n,18,$t(!1)),de(n,19,ar(0)),s&&de(n,431,$t(!1)),s&&de(n,444,ar(0)),de(n,61,eA()),de(n,64,$t(!1)),de(n,141,ar(0)),de(n,34,$t(_D(e)=="true")),de(n,14,$t(!0)),s&&de(n,439,$t(!1)),de(n,218,ar(0)),u6(n,e,r),c6(n,e.SSF,r),d6(n,r),s&&de(n,352,$t(!1));var c=n.end(),f=jt();s&&de(f,140,gA()),s&&r.Strings&&n6(f,252,J3(r.Strings)),de(f,10);var d=f.end(),h=jt(),m=0,p=0;for(p=0;p255&&typeof console<"u"&&console.error&&console.error("Worksheet '"+e.SheetNames[r]+"' extends beyond column IV (255). Data may be lost.")}}var o=t||{};switch(o.biff||2){case 8:case 5:return x6(e,t);case 4:case 3:case 2:return l6(e,t)}throw new Error("invalid type "+o.bookType+" for BIFF")}function w6(e,t,r,n){for(var i=e["!merges"]||[],o=[],a=t.s.c;a<=t.e.c;++a){for(var s=0,l=0,u=0;ur||i[u].s.c>a)&&!(i[u].e.r1&&(h.rowspan=s),l>1&&(h.colspan=l),n.editable?d=''+d+"":f&&(h["data-t"]=f&&f.t||"z",f.v!=null&&(h["data-v"]=f.v),f.z!=null&&(h["data-z"]=f.z),f.l&&(f.l.Target||"#").charAt(0)!="#"&&(d=''+d+"")),h.id=(n.id||"sjs")+"-"+c,o.push(fe("td",d,h))}}var m="";return m+o.join("")+""}var y6='SheetJS Table Export',E6="";function _6(e,t,r){var n=[];return n.join("")+""}function Xw(e,t){var r=t||{},n=r.header!=null?r.header:y6,i=r.footer!=null?r.footer:E6,o=[n],a=tr(e["!ref"]);r.dense=Array.isArray(e),o.push(_6(e,a,r));for(var s=a.s.r;s<=a.e.r;++s)o.push(w6(e,a,s,r));return o.push(""+i),o.join("")}function Kw(e,t,r){var n=r||{},i=0,o=0;if(n.origin!=null)if(typeof n.origin=="number")i=n.origin;else{var a=typeof n.origin=="string"?dt(n.origin):n.origin;i=a.r,o=a.c}var s=t.getElementsByTagName("tr"),l=Math.min(n.sheetRows||1e7,s.length),u={s:{r:0,c:0},e:{r:i,c:o}};if(e["!ref"]){var c=tr(e["!ref"]);u.s.r=Math.min(u.s.r,c.s.r),u.s.c=Math.min(u.s.c,c.s.c),u.e.r=Math.max(u.e.r,c.e.r),u.e.c=Math.max(u.e.c,c.e.c),i==-1&&(u.e.r=i=c.e.r+1)}var f=[],d=0,h=e["!rows"]||(e["!rows"]=[]),m=0,p=0,g=0,v=0,w=0,y=0;for(e["!cols"]||(e["!cols"]=[]);m1||y>1)&&f.push({s:{r:p+i,c:v+o},e:{r:p+i+(w||1)-1,c:v+o+(y||1)-1}});var L={t:"s",v:S},B=k.getAttribute("data-t")||k.getAttribute("t")||"";S!=null&&(S.length==0?L.t=B||"z":n.raw||S.trim().length==0||B=="s"||(S==="TRUE"?L={t:"b",v:!0}:S==="FALSE"?L={t:"b",v:!1}:isNaN(Qr(S))?isNaN(Wa(S).getDate())||(L={t:"d",v:Lt(S)},n.cellDates||(L={t:"n",v:Xt(L.v)}),L.z=n.dateNF||rt[14]):L={t:"n",v:Qr(S)})),L.z===void 0&&C!=null&&(L.z=C);var U="",H=k.getElementsByTagName("A");if(H&&H.length)for(var G=0;G=l&&(e["!fullref"]=ot((u.e.r=s.length-m+p-1+i,u))),e}function Yw(e,t){var r=t||{},n=r.dense?[]:{};return Kw(n,e,t)}function S6(e,t){return wi(Yw(e,t),t)}function Kg(e){var t="",r=T6(e);return r&&(t=r(e).getPropertyValue("display")),t||(t=e.style&&e.style.display),t==="none"}function T6(e){return e.ownerDocument.defaultView&&typeof e.ownerDocument.defaultView.getComputedStyle=="function"?e.ownerDocument.defaultView.getComputedStyle:typeof getComputedStyle=="function"?getComputedStyle:null}var C6=function(){var e=["",'',"",'',"",'',"",""].join(""),t=""+e+"";return function(){return at+t}}(),Yg=function(){var e=function(o){return Be(o).replace(/ +/g,function(a){return''}).replace(/\t/g,"").replace(/\n/g,"").replace(/^ /,"").replace(/ $/,"")},t=` +`,r=` +`,n=function(o,a,s){var l=[];l.push(' +`);var u=0,c=0,f=tr(o["!ref"]||"A1"),d=o["!merges"]||[],h=0,m=Array.isArray(o);if(o["!cols"])for(c=0;c<=f.e.c;++c)l.push(" +`);var p="",g=o["!rows"]||[];for(u=0;u +`);for(;u<=f.e.r;++u){for(p=g[u]?' table:style-name="ro'+g[u].ods+'"':"",l.push(" +`),c=0;cc)&&!(d[h].s.r>u)&&!(d[h].e.c +`)}return l.push(` +`),l.join("")},i=function(o,a){o.push(` +`),o.push(` +`),o.push(` +`),o.push(` / +`),o.push(` +`),o.push(` / +`),o.push(` +`),o.push(` +`);var s=0;a.SheetNames.map(function(u){return a.Sheets[u]}).forEach(function(u){if(u&&u["!cols"]){for(var c=0;c +`),o.push(' +`),o.push(` +`),++s}}});var l=0;a.SheetNames.map(function(u){return a.Sheets[u]}).forEach(function(u){if(u&&u["!rows"]){for(var c=0;c +`),o.push(' +`),o.push(` +`),++l}}}),o.push(` +`),o.push(` +`),o.push(` +`),o.push(` +`),o.push(` +`)};return function(a,s){var l=[at],u=za({"xmlns:office":"urn:oasis:names:tc:opendocument:xmlns:office:1.0","xmlns:table":"urn:oasis:names:tc:opendocument:xmlns:table:1.0","xmlns:style":"urn:oasis:names:tc:opendocument:xmlns:style:1.0","xmlns:text":"urn:oasis:names:tc:opendocument:xmlns:text:1.0","xmlns:draw":"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0","xmlns:fo":"urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0","xmlns:xlink":"http://www.w3.org/1999/xlink","xmlns:dc":"http://purl.org/dc/elements/1.1/","xmlns:meta":"urn:oasis:names:tc:opendocument:xmlns:meta:1.0","xmlns:number":"urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0","xmlns:presentation":"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0","xmlns:svg":"urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0","xmlns:chart":"urn:oasis:names:tc:opendocument:xmlns:chart:1.0","xmlns:dr3d":"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0","xmlns:math":"http://www.w3.org/1998/Math/MathML","xmlns:form":"urn:oasis:names:tc:opendocument:xmlns:form:1.0","xmlns:script":"urn:oasis:names:tc:opendocument:xmlns:script:1.0","xmlns:ooo":"http://openoffice.org/2004/office","xmlns:ooow":"http://openoffice.org/2004/writer","xmlns:oooc":"http://openoffice.org/2004/calc","xmlns:dom":"http://www.w3.org/2001/xml-events","xmlns:xforms":"http://www.w3.org/2002/xforms","xmlns:xsd":"http://www.w3.org/2001/XMLSchema","xmlns:xsi":"http://www.w3.org/2001/XMLSchema-instance","xmlns:sheet":"urn:oasis:names:tc:opendocument:sh33tjs:1.0","xmlns:rpt":"http://openoffice.org/2005/report","xmlns:of":"urn:oasis:names:tc:opendocument:xmlns:of:1.2","xmlns:xhtml":"http://www.w3.org/1999/xhtml","xmlns:grddl":"http://www.w3.org/2003/g/data-view#","xmlns:tableooo":"http://openoffice.org/2009/table","xmlns:drawooo":"http://openoffice.org/2010/draw","xmlns:calcext":"urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0","xmlns:loext":"urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0","xmlns:field":"urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0","xmlns:formx":"urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0","xmlns:css3t":"http://www.w3.org/TR/css3-text/","office:version":"1.2"}),c=za({"xmlns:config":"urn:oasis:names:tc:opendocument:xmlns:config:1.0","office:mimetype":"application/vnd.oasis.opendocument.spreadsheet"});s.bookType=="fods"?(l.push(" +`),l.push(cw().replace(/office:document-meta/g,"office:meta"))):l.push(" +`),i(l,a),l.push(` +`),l.push(` +`);for(var f=0;f!=a.SheetNames.length;++f)l.push(n(a.Sheets[a.SheetNames[f]],a,f));return l.push(` +`),l.push(` +`),s.bookType=="fods"?l.push(""):l.push(""),l.join("")}}();function qw(e,t){if(t.bookType=="fods")return Yg(e,t);var r=kd(),n="",i=[],o=[];return n="mimetype",De(r,n,"application/vnd.oasis.opendocument.spreadsheet"),n="content.xml",De(r,n,Yg(e,t)),i.push([n,"text/xml"]),o.push([n,"ContentFile"]),n="styles.xml",De(r,n,C6(e,t)),i.push([n,"text/xml"]),o.push([n,"StylesFile"]),n="meta.xml",De(r,n,at+cw()),i.push([n,"text/xml"]),o.push([n,"MetadataFile"]),n="manifest.rdf",De(r,n,M3(o)),i.push([n,"application/rdf+xml"]),n="META-INF/manifest.xml",De(r,n,$3(i)),r}/*! sheetjs (C) 2013-present SheetJS -- http://sheetjs.com */function Xl(e){return new DataView(e.buffer,e.byteOffset,e.byteLength)}function A6(e){return typeof TextEncoder<"u"?new TextEncoder().encode(e):Er(Xr(e))}function R6(e,t){e:for(var r=0;r<=e.length-t.length;++r){for(var n=0;n>7,e[t+14]|=(n&127)<<1;for(var o=0;i>=1;++o,i/=256)e[t+o]=i&255;e[t+15]|=r>=0?0:128}function Ga(e,t){var r=t?t[0]:0,n=e[r]&127;e:if(e[r++]>=128&&(n|=(e[r]&127)<<7,e[r++]<128||(n|=(e[r]&127)<<14,e[r++]<128)||(n|=(e[r]&127)<<21,e[r++]<128)||(n+=(e[r]&127)*Math.pow(2,28),++r,e[r++]<128)||(n+=(e[r]&127)*Math.pow(2,35),++r,e[r++]<128)||(n+=(e[r]&127)*Math.pow(2,42),++r,e[r++]<128)))break e;return t&&(t[0]=r),n}function Me(e){var t=new Uint8Array(7);t[0]=e&127;var r=1;e:if(e>127){if(t[r-1]|=128,t[r]=e>>7&127,++r,e<=16383||(t[r-1]|=128,t[r]=e>>14&127,++r,e<=2097151)||(t[r-1]|=128,t[r]=e>>21&127,++r,e<=268435455)||(t[r-1]|=128,t[r]=e/256>>>21&127,++r,e<=34359738367)||(t[r-1]|=128,t[r]=e/65536>>>21&127,++r,e<=4398046511103))break e;t[r-1]|=128,t[r]=e/16777216>>>21&127,++r}return t.slice(0,r)}function uo(e){var t=0,r=e[t]&127;e:if(e[t++]>=128){if(r|=(e[t]&127)<<7,e[t++]<128||(r|=(e[t]&127)<<14,e[t++]<128)||(r|=(e[t]&127)<<21,e[t++]<128))break e;r|=(e[t]&127)<<28}return r}function st(e){for(var t=[],r=[0];r[0]=128;);s=e.slice(l,r[0])}break;case 5:a=4,s=e.slice(r[0],r[0]+a),r[0]+=a;break;case 1:a=8,s=e.slice(r[0],r[0]+a),r[0]+=a;break;case 2:a=Ga(e,r),s=e.slice(r[0],r[0]+a),r[0]+=a;break;case 3:case 4:default:throw new Error("PB Type ".concat(o," for Field ").concat(i," at offset ").concat(n))}var u={data:s,type:o};t[i]==null?t[i]=[u]:t[i].push(u)}return t}function mt(e){var t=[];return e.forEach(function(r,n){r.forEach(function(i){i.data&&(t.push(Me(n*8+i.type)),i.type==2&&t.push(Me(i.data.length)),t.push(i.data))})}),Ln(t)}function vr(e){for(var t,r=[],n=[0];n[0]>>0>0),r.push(a)}return r}function $i(e){var t=[];return e.forEach(function(r){var n=[];n[1]=[{data:Me(r.id),type:0}],n[2]=[],r.merge!=null&&(n[3]=[{data:Me(+!!r.merge),type:0}]);var i=[];r.messages.forEach(function(a){i.push(a.data),a.meta[3]=[{type:0,data:Me(a.data.length)}],n[2].push({data:mt(a.meta),type:2})});var o=mt(n);t.push(Me(o.length)),t.push(o),i.forEach(function(a){return t.push(a)})}),Ln(t)}function F6(e,t){if(e!=0)throw new Error("Unexpected Snappy chunk type ".concat(e));for(var r=[0],n=Ga(t,r),i=[];r[0]>2;if(a<60)++a;else{var s=a-59;a=t[r[0]],s>1&&(a|=t[r[0]+1]<<8),s>2&&(a|=t[r[0]+2]<<16),s>3&&(a|=t[r[0]+3]<<24),a>>>=0,a++,r[0]+=s}i.push(t.slice(r[0],r[0]+a)),r[0]+=a;continue}else{var l=0,u=0;if(o==1?(u=(t[r[0]]>>2&7)+4,l=(t[r[0]++]&224)<<3,l|=t[r[0]++]):(u=(t[r[0]++]>>2)+1,o==2?(l=t[r[0]]|t[r[0]+1]<<8,r[0]+=2):(l=(t[r[0]]|t[r[0]+1]<<8|t[r[0]+2]<<16|t[r[0]+3]<<24)>>>0,r[0]+=4)),i=[Ln(i)],l==0)throw new Error("Invalid offset 0");if(l>i[0].length)throw new Error("Invalid offset beyond length");if(u>=l)for(i.push(i[0].slice(-l)),u-=l;u>=i[i.length-1].length;)i.push(i[i.length-1]),u-=i[i.length-1].length;i.push(i[0].slice(-l,-l+u))}}var c=Ln(i);if(c.length!=n)throw new Error("Unexpected length: ".concat(c.length," != ").concat(n));return c}function xr(e){for(var t=[],r=0;r>8&255]))):n<=16777216?(a+=4,t.push(new Uint8Array([248,n-1&255,n-1>>8&255,n-1>>16&255]))):n<=4294967296&&(a+=5,t.push(new Uint8Array([252,n-1&255,n-1>>8&255,n-1>>16&255,n-1>>>24&255]))),t.push(e.slice(r,r+n)),a+=n,i[0]=0,i[1]=a&255,i[2]=a>>8&255,i[3]=a>>16&255,r+=n}return Ln(t)}function Lc(e,t){var r=new Uint8Array(32),n=Xl(r),i=12,o=0;switch(r[0]=5,e.t){case"n":r[1]=2,O6(r,i,e.v),o|=1,i+=16;break;case"b":r[1]=6,n.setFloat64(i,e.v?1:0,!0),o|=2,i+=8;break;case"s":if(t.indexOf(e.v)==-1)throw new Error("Value ".concat(e.v," missing from SST!"));r[1]=3,n.setUint32(i,t.indexOf(e.v),!0),o|=8,i+=4;break;default:throw"unsupported cell type "+e.t}return n.setUint32(8,o,!0),r.slice(0,i)}function Bc(e,t){var r=new Uint8Array(32),n=Xl(r),i=12,o=0;switch(r[0]=3,e.t){case"n":r[2]=2,n.setFloat64(i,e.v,!0),o|=32,i+=8;break;case"b":r[2]=6,n.setFloat64(i,e.v?1:0,!0),o|=32,i+=8;break;case"s":if(t.indexOf(e.v)==-1)throw new Error("Value ".concat(e.v," missing from SST!"));r[2]=3,n.setUint32(i,t.indexOf(e.v),!0),o|=16,i+=4;break;default:throw"unsupported cell type "+e.t}return n.setUint32(4,o,!0),r.slice(0,i)}function cn(e){var t=st(e);return Ga(t[1][0].data)}function D6(e,t,r){var n,i,o,a;if(!((n=e[6])!=null&&n[0])||!((i=e[7])!=null&&i[0]))throw"Mutation only works on post-BNC storages!";var s=((a=(o=e[8])==null?void 0:o[0])==null?void 0:a.data)&&uo(e[8][0].data)>0||!1;if(s)throw"Math only works with normal offsets";for(var l=0,u=Xl(e[7][0].data),c=0,f=[],d=Xl(e[4][0].data),h=0,m=[],p=0;p1&&console.error("The Numbers writer currently writes only the first table");var n=tr(r["!ref"]);n.s.r=n.s.c=0;var i=!1;n.e.c>9&&(i=!0,n.e.c=9),n.e.r>49&&(i=!0,n.e.r=49),i&&console.error("The Numbers writer is currently limited to ".concat(ot(n)));var o=Kl(r,{range:n,header:1}),a=["~Sh33tJ5~"];o.forEach(function(M){return M.forEach(function(N){typeof N=="string"&&a.push(N)})});var s={},l=[],u=He.read(t.numbers,{type:"base64"});u.FileIndex.map(function(M,N){return[M,u.FullPaths[N]]}).forEach(function(M){var N=M[0],F=M[1];if(N.type==2&&N.name.match(/\.iwa/)){var V=N.content,Y=xr(V),J=vr(Y);J.forEach(function(W){l.push(W.id),s[W.id]={deps:[],location:F,type:uo(W.messages[0].meta[1][0].data)}})}}),l.sort(function(M,N){return M-N});var c=l.filter(function(M){return M>1}).map(function(M){return[M,Me(M)]});u.FileIndex.map(function(M,N){return[M,u.FullPaths[N]]}).forEach(function(M){var N=M[0];if(M[1],!!N.name.match(/\.iwa/)){var F=vr(xr(N.content));F.forEach(function(V){V.messages.forEach(function(Y){c.forEach(function(J){V.messages.some(function(W){return uo(W.meta[1][0].data)!=11006&&R6(W.data,J[1])})&&s[J[0]].deps.push(V.id)})})})}});for(var f=He.find(u,s[1].location),d=vr(xr(f.content)),h,m=0;m-1,i=sw();qd(t=t||{});var o=kd(),a="",s=0;if(t.cellXfs=[],Wn(t.cellXfs,{},{revssf:{General:0}}),e.Props||(e.Props={}),a="docProps/core.xml",De(o,a,fw(e.Props,t)),i.coreprops.push(a),Le(t.rels,2,a,ke.CORE_PROPS),a="docProps/app.xml",!(e.Props&&e.Props.SheetNames))if(!e.Workbook||!e.Workbook.Sheets)e.Props.SheetNames=e.SheetNames;else{for(var l=[],u=0;u0&&(a="docProps/custom.xml",De(o,a,pw(e.Custprops)),i.custprops.push(a),Le(t.rels,4,a,ke.CUST_PROPS)),s=1;s<=e.SheetNames.length;++s){var c={"!id":{}},f=e.Sheets[e.SheetNames[s-1]],d=(f||{})["!type"]||"sheet";switch(d){case"chart":default:a="xl/worksheets/sheet"+s+"."+r,De(o,a,MD(s-1,a,t,e,c)),i.sheets.push(a),Le(t.wbrels,-1,"worksheets/sheet"+s+"."+r,ke.WS[0])}if(f){var h=f["!comments"],m=!1,p="";h&&h.length>0&&(p="xl/comments"+s+"."+r,De(o,p,UD(h,p)),i.comments.push(p),Le(c,-1,"../comments"+s+"."+r,ke.CMNT),m=!0),f["!legacy"]&&m&&De(o,"xl/drawings/vmlDrawing"+s+".vml",Dw(s,f["!comments"])),delete f["!comments"],delete f["!legacy"]}c["!id"].rId1&&De(o,uw(a),so(c))}return t.Strings!=null&&t.Strings.length>0&&(a="xl/sharedStrings."+r,De(o,a,BD(t.Strings,a,t)),i.strs.push(a),Le(t.wbrels,-1,"sharedStrings."+r,ke.SST)),a="xl/workbook."+r,De(o,a,ND(e,a)),i.workbooks.push(a),Le(t.rels,1,a,ke.WB),a="xl/theme/theme1.xml",De(o,a,Ow(e.Themes,t)),i.themes.push(a),Le(t.wbrels,-1,"theme/theme1.xml",ke.THEME),a="xl/styles."+r,De(o,a,LD(e,a,t)),i.styles.push(a),Le(t.wbrels,-1,"styles."+r,ke.STY),e.vbaraw&&n&&(a="xl/vbaProject.bin",De(o,a,e.vbaraw),i.vba.push(a),Le(t.wbrels,-1,"vbaProject.bin",ke.VBA)),a="xl/metadata."+r,De(o,a,HD(a)),i.metadata.push(a),Le(t.wbrels,-1,"metadata."+r,ke.XLMETA),De(o,"[Content_Types].xml",lw(i,t)),De(o,"_rels/.rels",so(t.rels)),De(o,"xl/_rels/workbook."+r+".rels",so(t.wbrels)),delete t.revssf,delete t.ssf,o}function $6(e,t){Xi=1024,e&&!e.SSF&&(e.SSF=Kt(rt)),e&&e.SSF&&(Su(),_u(e.SSF),t.revssf=Tu(e.SSF),t.revssf[e.SSF[65535]]=0,t.ssf=e.SSF),t.rels={},t.wbrels={},t.Strings=[],t.Strings.Count=0,t.Strings.Unique=0,Ta?t.revStrings=new Map:(t.revStrings={},t.revStrings.foo=[],delete t.revStrings.foo);var r="xml",n=Iw.indexOf(t.bookType)>-1,i=sw();qd(t=t||{});var o=kd(),a="",s=0;if(t.cellXfs=[],Wn(t.cellXfs,{},{revssf:{General:0}}),e.Props||(e.Props={}),a="docProps/core.xml",De(o,a,fw(e.Props,t)),i.coreprops.push(a),Le(t.rels,2,a,ke.CORE_PROPS),a="docProps/app.xml",!(e.Props&&e.Props.SheetNames))if(!e.Workbook||!e.Workbook.Sheets)e.Props.SheetNames=e.SheetNames;else{for(var l=[],u=0;u0&&(a="docProps/custom.xml",De(o,a,pw(e.Custprops)),i.custprops.push(a),Le(t.rels,4,a,ke.CUST_PROPS));var c=["SheetJ5"];for(t.tcid=0,s=1;s<=e.SheetNames.length;++s){var f={"!id":{}},d=e.Sheets[e.SheetNames[s-1]],h=(d||{})["!type"]||"sheet";switch(h){case"chart":default:a="xl/worksheets/sheet"+s+"."+r,De(o,a,Hw(s-1,t,e,f)),i.sheets.push(a),Le(t.wbrels,-1,"worksheets/sheet"+s+"."+r,ke.WS[0])}if(d){var m=d["!comments"],p=!1,g="";if(m&&m.length>0){var v=!1;m.forEach(function(w){w[1].forEach(function(y){y.T==!0&&(v=!0)})}),v&&(g="xl/threadedComments/threadedComment"+s+"."+r,De(o,g,dR(m,c,t)),i.threadedcomments.push(g),Le(f,-1,"../threadedComments/threadedComment"+s+"."+r,ke.TCMNT)),g="xl/comments"+s+"."+r,De(o,g,Pw(m)),i.comments.push(g),Le(f,-1,"../comments"+s+"."+r,ke.CMNT),p=!0}d["!legacy"]&&p&&De(o,"xl/drawings/vmlDrawing"+s+".vml",Dw(s,d["!comments"])),delete d["!comments"],delete d["!legacy"]}f["!id"].rId1&&De(o,uw(a),so(f))}return t.Strings!=null&&t.Strings.length>0&&(a="xl/sharedStrings."+r,De(o,a,_w(t.Strings,t)),i.strs.push(a),Le(t.wbrels,-1,"sharedStrings."+r,ke.SST)),a="xl/workbook."+r,De(o,a,zw(e)),i.workbooks.push(a),Le(t.rels,1,a,ke.WB),a="xl/theme/theme1.xml",De(o,a,Ow(e.Themes,t)),i.themes.push(a),Le(t.wbrels,-1,"theme/theme1.xml",ke.THEME),a="xl/styles."+r,De(o,a,Aw(e,t)),i.styles.push(a),Le(t.wbrels,-1,"styles."+r,ke.STY),e.vbaraw&&n&&(a="xl/vbaProject.bin",De(o,a,e.vbaraw),i.vba.push(a),Le(t.wbrels,-1,"vbaProject.bin",ke.VBA)),a="xl/metadata."+r,De(o,a,Fw()),i.metadata.push(a),Le(t.wbrels,-1,"metadata."+r,ke.XLMETA),c.length>1&&(a="xl/persons/person.xml",De(o,a,hR(c)),i.people.push(a),Le(t.wbrels,-1,"persons/person.xml",ke.PEOPLE)),De(o,"[Content_Types].xml",lw(i,t)),De(o,"_rels/.rels",so(t.rels)),De(o,"xl/_rels/workbook."+r+".rels",so(t.wbrels)),delete t.revssf,delete t.ssf,o}function N6(e,t){var r="";switch((t||{}).type||"base64"){case"buffer":return[e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7]];case"base64":r=nn(e.slice(0,12));break;case"binary":r=e;break;case"array":return[e[0],e[1],e[2],e[3],e[4],e[5],e[6],e[7]];default:throw new Error("Unrecognized type "+(t&&t.type||"undefined"))}return[r.charCodeAt(0),r.charCodeAt(1),r.charCodeAt(2),r.charCodeAt(3),r.charCodeAt(4),r.charCodeAt(5),r.charCodeAt(6),r.charCodeAt(7)]}function Qw(e,t){switch(t.type){case"base64":case"binary":break;case"buffer":case"array":t.type="";break;case"file":return os(t.file,He.write(e,{type:Ne?"buffer":""}));case"string":throw new Error("'string' output type invalid for '"+t.bookType+"' files");default:throw new Error("Unrecognized type "+t.type)}return He.write(e,t)}function M6(e,t){var r=Kt(t||{}),n=b6(e,r);return L6(n,r)}function L6(e,t){var r={},n=Ne?"nodebuffer":typeof Uint8Array<"u"?"array":"string";if(t.compression&&(r.compression="DEFLATE"),t.password)r.type=n;else switch(t.type){case"base64":r.type="base64";break;case"binary":r.type="string";break;case"string":throw new Error("'string' output type invalid for '"+t.bookType+"' files");case"buffer":case"file":r.type=n;break;default:throw new Error("Unrecognized type "+t.type)}var i=e.FullPaths?He.write(e,{fileType:"zip",type:{nodebuffer:"buffer",string:"binary"}[r.type]||r.type,compression:!!t.compression}):e.generate(r);if(typeof Deno<"u"&&typeof i=="string"){if(t.type=="binary"||t.type=="base64")return i;i=new Uint8Array(Eu(i))}return t.password&&typeof encrypt_agile<"u"?Qw(encrypt_agile(i,t.password),t):t.type==="file"?os(t.file,i):t.type=="string"?ya(i):i}function B6(e,t){var r=t||{},n=t6(e,r);return Qw(n,r)}function Or(e,t,r){r||(r="");var n=r+e;switch(t.type){case"base64":return Va(Xr(n));case"binary":return Xr(n);case"string":return e;case"file":return os(t.file,n,"utf8");case"buffer":return Ne?un(n,"utf8"):typeof TextEncoder<"u"?new TextEncoder().encode(n):Or(n,{type:"binary"}).split("").map(function(i){return i.charCodeAt(0)})}throw new Error("Unrecognized type "+t.type)}function U6(e,t){switch(t.type){case"base64":return Va(e);case"binary":return e;case"string":return e;case"file":return os(t.file,e,"binary");case"buffer":return Ne?un(e,"binary"):e.split("").map(function(r){return r.charCodeAt(0)})}throw new Error("Unrecognized type "+t.type)}function Vs(e,t){switch(t.type){case"string":case"base64":case"binary":for(var r="",n=0;n0&&(i=0);var f=_t(l.s.r),d=[],h=[],m=0,p=0,g=Array.isArray(e),v=l.s.r,w=0,y={};g&&!e[v]&&(e[v]=[]);var E=u.skipHidden&&e["!cols"]||[],b=u.skipHidden&&e["!rows"]||[];for(w=l.s.c;w<=l.e.c;++w)if(!(E[w]||{}).hidden)switch(d[w]=Ft(w),r=g?e[v][w]:e[d[w]+f],n){case 1:o[w]=w-l.s.c;break;case 2:o[w]=d[w];break;case 3:o[w]=u.header[w-l.s.c];break;default:if(r==null&&(r={w:"__EMPTY",t:"s"}),s=a=on(r,null,u),p=y[a]||0,!p)y[a]=1;else{do s=a+"_"+p++;while(y[s]);y[a]=p,y[s]=1}o[w]=s}for(v=l.s.r+i;v<=l.e.r;++v)if(!(b[v]||{}).hidden){var k=W6(e,l,v,d,n,o,g,u);(k.isempty===!1||(n===1?u.blankrows!==!1:u.blankrows))&&(h[m++]=k.row)}return h.length=m,h}var qg=/"/g;function z6(e,t,r,n,i,o,a,s){for(var l=!0,u=[],c="",f=_t(r),d=t.s.c;d<=t.e.c;++d)if(n[d]){var h=s.dense?(e[r]||[])[d]:e[n[d]+f];if(h==null)c="";else if(h.v!=null){l=!1,c=""+(s.rawNumbers&&h.t=="n"?h.v:on(h,null,s));for(var m=0,p=0;m!==c.length;++m)if((p=c.charCodeAt(m))===i||p===o||p===34||s.forceQuotes){c='"'+c.replace(qg,'""')+'"';break}c=="ID"&&(c='"ID"')}else h.f!=null&&!h.F?(l=!1,c="="+h.f,c.indexOf(",")>=0&&(c='"'+c.replace(qg,'""')+'"')):c="";u.push(c)}return s.blankrows===!1&&l?null:u.join(a)}function Qd(e,t){var r=[],n=t??{};if(e==null||e["!ref"]==null)return"";var i=Xe(e["!ref"]),o=n.FS!==void 0?n.FS:",",a=o.charCodeAt(0),s=n.RS!==void 0?n.RS:` +`,l=s.charCodeAt(0),u=new RegExp((o=="|"?"\\|":o)+"+$"),c="",f=[];n.dense=Array.isArray(e);for(var d=n.skipHidden&&e["!cols"]||[],h=n.skipHidden&&e["!rows"]||[],m=i.s.c;m<=i.e.c;++m)(d[m]||{}).hidden||(f[m]=Ft(m));for(var p=0,g=i.s.r;g<=i.e.r;++g)(h[g]||{}).hidden||(c=z6(e,i,g,f,a,l,o,n),c!=null&&(n.strip&&(c=c.replace(u,"")),(c||n.blankrows!==!1)&&r.push((p++?s:"")+c)));return delete n.dense,r.join("")}function Jw(e,t){t||(t={}),t.FS=" ",t.RS=` +`;var r=Qd(e,t);return r}function G6(e){var t="",r,n="";if(e==null||e["!ref"]==null)return[];var i=Xe(e["!ref"]),o="",a=[],s,l=[],u=Array.isArray(e);for(s=i.s.c;s<=i.e.c;++s)a[s]=Ft(s);for(var c=i.s.r;c<=i.e.r;++c)for(o=_t(c),s=i.s.c;s<=i.e.c;++s)if(t=a[s]+o,r=u?(e[c]||[])[s]:e[t],n="",r!==void 0){if(r.F!=null){if(t=r.F,!r.f)continue;n=r.f,t.indexOf(":")==-1&&(t=t+":"+t)}if(r.f!=null)n=r.f;else{if(r.t=="z")continue;if(r.t=="n"&&r.v!=null)n=""+r.v;else if(r.t=="b")n=r.v?"TRUE":"FALSE";else if(r.w!==void 0)n="'"+r.w;else{if(r.v===void 0)continue;r.t=="s"?n="'"+r.v:n=""+r.v}}l[l.length]=t+"="+n}return l}function e2(e,t,r){var n=r||{},i=+!n.skipHeader,o=e||{},a=0,s=0;if(o&&n.origin!=null)if(typeof n.origin=="number")a=n.origin;else{var l=typeof n.origin=="string"?dt(n.origin):n.origin;a=l.r,s=l.c}var u,c={s:{c:0,r:0},e:{c:s,r:a+t.length-1+i}};if(o["!ref"]){var f=Xe(o["!ref"]);c.e.c=Math.max(c.e.c,f.e.c),c.e.r=Math.max(c.e.r,f.e.r),a==-1&&(a=f.e.r+1,c.e.r=a+t.length-1+i)}else a==-1&&(a=0,c.e.r=t.length-1+i);var d=n.header||[],h=0;t.forEach(function(p,g){Tt(p).forEach(function(v){(h=d.indexOf(v))==-1&&(d[h=d.length]=v);var w=p[v],y="z",E="",b=Ue({c:s+h,r:a+g+i});u=ja(o,b),w&&typeof w=="object"&&!(w instanceof Date)?o[b]=w:(typeof w=="number"?y="n":typeof w=="boolean"?y="b":typeof w=="string"?y="s":w instanceof Date?(y="d",n.cellDates||(y="n",w=Xt(w)),E=n.dateNF||rt[14]):w===null&&n.nullError&&(y="e",w=0),u?(u.t=y,u.v=w,delete u.w,delete u.R,E&&(u.z=E)):o[b]=u={t:y,v:w},E&&(u.z=E))})}),c.e.c=Math.max(c.e.c,s+d.length-1);var m=_t(a);if(i)for(h=0;h=0&&e.SheetNames.length>t)return t;throw new Error("Cannot find sheet # "+t)}else if(typeof t=="string"){var r=e.SheetNames.indexOf(t);if(r>-1)return r;throw new Error("Cannot find sheet name |"+t+"|")}else throw new Error("Cannot find sheet |"+t+"|")}function K6(){return{SheetNames:[],Sheets:{}}}function Y6(e,t,r,n){var i=1;if(!r)for(;i<=65535&&e.SheetNames.indexOf(r="Sheet"+i)!=-1;++i,r=void 0);if(!r||e.SheetNames.length>=65535)throw new Error("Too many worksheets");if(n&&e.SheetNames.indexOf(r)>=0){var o=r.match(/(^.*?)(\d+)$/);i=o&&+o[2]||0;var a=o&&o[1]||r;for(++i;i<=65535&&e.SheetNames.indexOf(r=a+i)!=-1;++i);}if(Ww(r),e.SheetNames.indexOf(r)>=0)throw new Error("Worksheet with name |"+r+"| already exists!");return e.SheetNames.push(r),e.Sheets[r]=t,r}function q6(e,t,r){e.Workbook||(e.Workbook={}),e.Workbook.Sheets||(e.Workbook.Sheets=[]);var n=X6(e,t);switch(e.Workbook.Sheets[n]||(e.Workbook.Sheets[n]={}),r){case 0:case 1:case 2:break;default:throw new Error("Bad sheet visibility setting "+r)}e.Workbook.Sheets[n].Hidden=r}function Q6(e,t){return e.z=t,e}function t2(e,t,r){return t?(e.l={Target:t},r&&(e.l.Tooltip=r)):delete e.l,e}function Z6(e,t,r){return t2(e,"#"+t,r)}function J6(e,t,r){e.c||(e.c=[]),e.c.push({t,a:r||"SheetJS"})}function eP(e,t,r,n){for(var i=typeof t!="string"?t:Xe(t),o=typeof t=="string"?t:ot(t),a=i.s.r;a<=i.e.r;++a)for(var s=i.s.c;s<=i.e.c;++s){var l=ja(e,a,s);l.t="n",l.F=o,delete l.v,a==i.s.r&&s==i.s.c&&(l.f=r,n&&(l.D=!0))}return e}var Uc={encode_col:Ft,encode_row:_t,encode_cell:Ue,encode_range:ot,decode_col:Ud,decode_row:Bd,split_cell:p3,decode_cell:dt,decode_range:tr,format_cell:on,sheet_add_aoa:tw,sheet_add_json:e2,sheet_add_dom:Kw,aoa_to_sheet:Fo,json_to_sheet:j6,table_to_sheet:Yw,table_to_book:S6,sheet_to_csv:Qd,sheet_to_txt:Jw,sheet_to_json:Kl,sheet_to_html:Xw,sheet_to_formulae:G6,sheet_to_row_object_array:Kl,sheet_get_cell:ja,book_new:K6,book_append_sheet:Y6,book_set_sheet_visibility:q6,cell_set_number_format:Q6,cell_set_hyperlink:t2,cell_set_internal_link:Z6,cell_add_comment:J6,sheet_set_array_formula:eP,consts:{SHEET_VISIBLE:0,SHEET_HIDDEN:1,SHEET_VERY_HIDDEN:2}};function t0(e){if(typeof e=="string"){const t=e.replace(/[^a-zA-Z]/g,"").trim(),r=["","K","M","B","T"].indexOf(t.replace(/\s/g,""));e=Number(e.replace(/[^0-9.]/g,"").trim())*Math.pow(10,r*3)}return e}function tP(e,t){var r;if(typeof e=="string"&&(e=Number(t0(e))),e%1!==0){const n=Math.max(2,((r=e.toString().split(".")[1])==null?void 0:r.length)||0),i=Math.min(4,n);if(e<5)return e.toFixed(i)||0;e=Number(e.toFixed(2))}if((e>1e5||e<-1e5)&&!n2(t||"")){const n=Math.min(4,Math.floor(Math.log10(Math.abs(e))/3)),i=["","K","M","B","T"][n];return`${(e/10**(n*3)).toFixed(3).replace(/\.?0+$/,"")} ${i}`}return e>1e3||e<-1e3?r2(e):e}function r2(e){if(e>1e3||e<-1e3){const t=e.toString().split("."),r=t[0].replace(/\B(?=(\d{3})+(?!\d))/g,","),n=t[1]?`.${t[1]}`:"";return`${r}${n}`}return e}function Yl(e){return["date","time","timestamp"].some(t=>e==null?void 0:e.toLowerCase().includes(t))}function n2(e){return["price","open","close"].some(t=>e==null?void 0:e.toLowerCase().includes(t))}function Ki(e,t){const r=window.document.getElementById("loading"),n=window.document.getElementById("loading_text");return new Promise(i=>{t?r.classList.remove("show"):(n.innerHTML=e,r.classList.add("show"));const o=setInterval(function(){(t?!r.classList.contains("show"):r.classList.contains("show"))&&(clearInterval(o),i(!0))},.01)})}function rP(e,t){if(e===t)return!0;if(e==null||t==null||(e==null?void 0:e.length)!==(t==null?void 0:t.length))return!1;for(let r=0;r<(e==null?void 0:e.length);++r)if(e[r]!==t[r])return!1;return!0}const nP=(e,t,r,n)=>{const i=n4(e.getValue(t),r);return n(i),i},iP=async({fileHandle:e,blob:t})=>{e&&await oP({fileHandle:e,blob:t})},oP=async({fileHandle:e,blob:t})=>{const r=await e.createWritable();await r.write(t),await r.close()},aP=[{description:"PNG Image",accept:{"image/png":[".png"]}},{description:"JPEG Image",accept:{"image/jpeg":[".jpeg"]}}],i2=({filename:e,is_image:t})=>{try{if("showSaveFilePicker"in window){const r={suggestedName:e,types:t?aP:[{description:"CSV File",accept:{"image/csv":[".csv"]}}],excludeAcceptAllOption:!0};return showSaveFilePicker(r)}}catch(r){console.error(r)}return new Promise(r=>{r(null)})},o2=(e,t,r)=>{try{if(r===null)throw new Error("Cannot access filesystem");iP({fileHandle:r,blob:e})}catch(n){console.error("oops, something went wrong!",n);const i=URL.createObjectURL(e),o=document.createElement("a");o.setAttribute("href",i),o.setAttribute("download",t),o.style.visibility="hidden",document.body.appendChild(o),o.click(),document.body.removeChild(o)}return new Promise(n=>{n(!0)})};async function Qg(e,t,r,n){const i=t,o=r.map(u=>i.map(c=>u[c])),a=[i,...o];if(e==="csv"){const u=a.map(d=>d.join(",")).join(` +`),c=new Blob([u],{type:"text/csv;charset=utf-8;"}),f=`${window.title}.csv`;try{const d=await i2({filename:f});let h="csv";d!==null&&(h=d.name.split(".").pop()),await Ki(`Saving ${h.toUpperCase()}`),r0(async function(){o2(c,f,d).then(async function(){await new Promise(m=>setTimeout(m,1500)),await Ki("",!0),d||n(!0)})},2)()}catch(d){console.error(d)}return}const s=Uc.book_new(),l=Uc.aoa_to_sheet(a);Uc.book_append_sheet(s,l,"Sheet1"),await Ki("Saving XLSX"),r0(async function(){await new Promise(u=>setTimeout(u,1500)),V6(s,`${window.title}.xlsx`),await Ki("",!0),n==null||n(!0)},2)()}async function sP(e,t){const r=document.getElementById(e),n=`${window.title}.png`;try{const i=await i2({filename:n,is_image:!0});let o="png";i!==null&&(o=i.name.split(".").pop()),await Ki(`Saving ${o.toUpperCase()}`),r0(async function(){c4.toBlob(r).then(function(a){o2(a,n,i).then(async function(){await new Promise(s=>setTimeout(s,1500)),await Ki("",!0),i||t(!0)})})},2)()}catch(i){console.error(i)}}const r0=(e,t)=>{let r;return function(){const n=this,i=arguments;clearTimeout(r),r=setTimeout(()=>e.apply(n,i),t)}},ql=({title:e,titleId:t,...r})=>X("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor",strokeWidth:1.5,...r,children:X("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M6 18L18 6M6 6l12 12"})});function Zg(e,[t,r]){return Math.min(r,Math.max(t,e))}function Fu(e){const t=e+"CollectionProvider",[r,n]=ln(t),[i,o]=r(t,{collectionRef:{current:null},itemMap:new Map}),a=h=>{const{scope:m,children:p}=h,g=or.useRef(null),v=or.useRef(new Map).current;return or.createElement(i,{scope:m,itemMap:v,collectionRef:g},p)},s=e+"CollectionSlot",l=or.forwardRef((h,m)=>{const{scope:p,children:g}=h,v=o(s,p),w=Ve(m,v.collectionRef);return or.createElement(ai,{ref:w},g)}),u=e+"CollectionItemSlot",c="data-radix-collection-item",f=or.forwardRef((h,m)=>{const{scope:p,children:g,...v}=h,w=or.useRef(null),y=Ve(m,w),E=o(u,p);return or.useEffect(()=>(E.itemMap.set(w,{ref:w,...v}),()=>void E.itemMap.delete(w))),or.createElement(ai,{[c]:"",ref:y},g)});function d(h){const m=o(e+"CollectionConsumer",h);return or.useCallback(()=>{const g=m.collectionRef.current;if(!g)return[];const v=Array.from(g.querySelectorAll(`[${c}]`));return Array.from(m.itemMap.values()).sort((E,b)=>v.indexOf(E.ref.current)-v.indexOf(b.ref.current))},[m.collectionRef,m.itemMap])}return[{Provider:a,Slot:l,ItemSlot:f},d,n]}const lP=x.createContext(void 0);function Zd(e){const t=x.useContext(lP);return e||t||"ltr"}function Io(e){return e.split("-")[1]}function Jd(e){return e==="y"?"height":"width"}function Jr(e){return e.split("-")[0]}function Ti(e){return["top","bottom"].includes(Jr(e))?"x":"y"}function Jg(e,t,r){let{reference:n,floating:i}=e;const o=n.x+n.width/2-i.width/2,a=n.y+n.height/2-i.height/2,s=Ti(t),l=Jd(s),u=n[l]/2-i[l]/2,c=s==="x";let f;switch(Jr(t)){case"top":f={x:o,y:n.y-i.height};break;case"bottom":f={x:o,y:n.y+n.height};break;case"right":f={x:n.x+n.width,y:a};break;case"left":f={x:n.x-i.width,y:a};break;default:f={x:n.x,y:n.y}}switch(Io(t)){case"start":f[s]-=u*(r&&c?-1:1);break;case"end":f[s]+=u*(r&&c?-1:1)}return f}const uP=async(e,t,r)=>{const{placement:n="bottom",strategy:i="absolute",middleware:o=[],platform:a}=r,s=o.filter(Boolean),l=await(a.isRTL==null?void 0:a.isRTL(t));let u=await a.getElementRects({reference:e,floating:t,strategy:i}),{x:c,y:f}=Jg(u,n,l),d=n,h={},m=0;for(let p=0;p({name:"arrow",options:e,async fn(t){const{x:r,y:n,placement:i,rects:o,platform:a,elements:s}=t,{element:l,padding:u=0}=an(e,t)||{};if(l==null)return{};const c=a2(u),f={x:r,y:n},d=Ti(i),h=Jd(d),m=await a.getDimensions(l),p=d==="y",g=p?"top":"left",v=p?"bottom":"right",w=p?"clientHeight":"clientWidth",y=o.reference[h]+o.reference[d]-f[d]-o.floating[h],E=f[d]-o.reference[d],b=await(a.getOffsetParent==null?void 0:a.getOffsetParent(l));let k=b?b[w]:0;k&&await(a.isElement==null?void 0:a.isElement(b))||(k=s.floating[w]||o.floating[h]);const S=y/2-E/2,C=k/2-m[h]/2-1,A=Ka(c[g],C),L=Ka(c[v],C),B=A,U=k-m[h]-L,H=k/2-m[h]/2+S,G=n0(B,H,U),ee=Io(i)!=null&&H!=G&&o.reference[h]/2-(He.concat(t,t+"-start",t+"-end"),[]);const cP={left:"right",right:"left",bottom:"top",top:"bottom"};function Zl(e){return e.replace(/left|right|bottom|top/g,t=>cP[t])}function fP(e,t,r){r===void 0&&(r=!1);const n=Io(e),i=Ti(e),o=Jd(i);let a=i==="x"?n===(r?"end":"start")?"right":"left":n==="start"?"bottom":"top";return t.reference[o]>t.floating[o]&&(a=Zl(a)),{main:a,cross:Zl(a)}}const dP={start:"end",end:"start"};function Hc(e){return e.replace(/start|end/g,t=>dP[t])}const hP=function(e){return e===void 0&&(e={}),{name:"flip",options:e,async fn(t){var r;const{placement:n,middlewareData:i,rects:o,initialPlacement:a,platform:s,elements:l}=t,{mainAxis:u=!0,crossAxis:c=!0,fallbackPlacements:f,fallbackStrategy:d="bestFit",fallbackAxisSideDirection:h="none",flipAlignment:m=!0,...p}=an(e,t),g=Jr(n),v=Jr(a)===a,w=await(s.isRTL==null?void 0:s.isRTL(l.floating)),y=f||(v||!m?[Zl(a)]:function(B){const U=Zl(B);return[Hc(B),U,Hc(U)]}(a));f||h==="none"||y.push(...function(B,U,H,G){const ee=Io(B);let ae=function(he,Te,oe){const ye=["left","right"],te=["right","left"],O=["top","bottom"],M=["bottom","top"];switch(he){case"top":case"bottom":return oe?Te?te:ye:Te?ye:te;case"left":case"right":return Te?O:M;default:return[]}}(Jr(B),H==="start",G);return ee&&(ae=ae.map(he=>he+"-"+ee),U&&(ae=ae.concat(ae.map(Hc)))),ae}(a,m,h,w));const E=[a,...y],b=await Xa(t,p),k=[];let S=((r=i.flip)==null?void 0:r.overflows)||[];if(u&&k.push(b[g]),c){const{main:B,cross:U}=fP(n,o,w);k.push(b[B],b[U])}if(S=[...S,{placement:n,overflows:k}],!k.every(B=>B<=0)){var C,A;const B=(((C=i.flip)==null?void 0:C.index)||0)+1,U=E[B];if(U)return{data:{index:B,overflows:S},reset:{placement:U}};let H=(A=S.filter(G=>G.overflows[0]<=0).sort((G,ee)=>G.overflows[1]-ee.overflows[1])[0])==null?void 0:A.placement;if(!H)switch(d){case"bestFit":{var L;const G=(L=S.map(ee=>[ee.placement,ee.overflows.filter(ae=>ae>0).reduce((ae,he)=>ae+he,0)]).sort((ee,ae)=>ee[1]-ae[1])[0])==null?void 0:L[0];G&&(H=G);break}case"initialPlacement":H=a}if(n!==H)return{reset:{placement:H}}}return{}}}};function t1(e,t){return{top:e.top-t.height,right:e.right-t.width,bottom:e.bottom-t.height,left:e.left-t.width}}function r1(e){return s2.some(t=>e[t]>=0)}const pP=function(e){return e===void 0&&(e={}),{name:"hide",options:e,async fn(t){const{rects:r}=t,{strategy:n="referenceHidden",...i}=an(e,t);switch(n){case"referenceHidden":{const o=t1(await Xa(t,{...i,elementContext:"reference"}),r.reference);return{data:{referenceHiddenOffsets:o,referenceHidden:r1(o)}}}case"escaped":{const o=t1(await Xa(t,{...i,altBoundary:!0}),r.floating);return{data:{escapedOffsets:o,escaped:r1(o)}}}default:return{}}}}},gP=function(e){return e===void 0&&(e=0),{name:"offset",options:e,async fn(t){const{x:r,y:n}=t,i=await async function(o,a){const{placement:s,platform:l,elements:u}=o,c=await(l.isRTL==null?void 0:l.isRTL(u.floating)),f=Jr(s),d=Io(s),h=Ti(s)==="x",m=["left","top"].includes(f)?-1:1,p=c&&h?-1:1,g=an(a,o);let{mainAxis:v,crossAxis:w,alignmentAxis:y}=typeof g=="number"?{mainAxis:g,crossAxis:0,alignmentAxis:null}:{mainAxis:0,crossAxis:0,alignmentAxis:null,...g};return d&&typeof y=="number"&&(w=d==="end"?-1*y:y),h?{x:w*p,y:v*m}:{x:v*m,y:w*p}}(t,e);return{x:r+i.x,y:n+i.y,data:i}}}};function l2(e){return e==="x"?"y":"x"}const mP=function(e){return e===void 0&&(e={}),{name:"shift",options:e,async fn(t){const{x:r,y:n,placement:i}=t,{mainAxis:o=!0,crossAxis:a=!1,limiter:s={fn:g=>{let{x:v,y:w}=g;return{x:v,y:w}}},...l}=an(e,t),u={x:r,y:n},c=await Xa(t,l),f=Ti(Jr(i)),d=l2(f);let h=u[f],m=u[d];if(o){const g=f==="y"?"bottom":"right";h=n0(h+c[f==="y"?"top":"left"],h,h-c[g])}if(a){const g=d==="y"?"bottom":"right";m=n0(m+c[d==="y"?"top":"left"],m,m-c[g])}const p=s.fn({...t,[f]:h,[d]:m});return{...p,data:{x:p.x-r,y:p.y-n}}}}},vP=function(e){return e===void 0&&(e={}),{options:e,fn(t){const{x:r,y:n,placement:i,rects:o,middlewareData:a}=t,{offset:s=0,mainAxis:l=!0,crossAxis:u=!0}=an(e,t),c={x:r,y:n},f=Ti(i),d=l2(f);let h=c[f],m=c[d];const p=an(s,t),g=typeof p=="number"?{mainAxis:p,crossAxis:0}:{mainAxis:0,crossAxis:0,...p};if(l){const y=f==="y"?"height":"width",E=o.reference[f]-o.floating[y]+g.mainAxis,b=o.reference[f]+o.reference[y]-g.mainAxis;hb&&(h=b)}if(u){var v,w;const y=f==="y"?"width":"height",E=["top","left"].includes(Jr(i)),b=o.reference[d]-o.floating[y]+(E&&((v=a.offset)==null?void 0:v[d])||0)+(E?0:g.crossAxis),k=o.reference[d]+o.reference[y]+(E?0:((w=a.offset)==null?void 0:w[d])||0)-(E?g.crossAxis:0);mk&&(m=k)}return{[f]:h,[d]:m}}}},xP=function(e){return e===void 0&&(e={}),{name:"size",options:e,async fn(t){const{placement:r,rects:n,platform:i,elements:o}=t,{apply:a=()=>{},...s}=an(e,t),l=await Xa(t,s),u=Jr(r),c=Io(r),f=Ti(r)==="x",{width:d,height:h}=n.floating;let m,p;u==="top"||u==="bottom"?(m=u,p=c===(await(i.isRTL==null?void 0:i.isRTL(o.floating))?"start":"end")?"left":"right"):(p=u,m=c==="end"?"top":"bottom");const g=h-l[m],v=d-l[p],w=!t.middlewareData.shift;let y=g,E=v;if(f){const k=d-l.left-l.right;E=c||w?Ka(v,k):k}else{const k=h-l.top-l.bottom;y=c||w?Ka(g,k):k}if(w&&!c){const k=Xn(l.left,0),S=Xn(l.right,0),C=Xn(l.top,0),A=Xn(l.bottom,0);f?E=d-2*(k!==0||S!==0?k+S:Xn(l.left,l.right)):y=h-2*(C!==0||A!==0?C+A:Xn(l.top,l.bottom))}await a({...t,availableWidth:E,availableHeight:y});const b=await i.getDimensions(o.floating);return d!==b.width||h!==b.height?{reset:{rects:!0}}:{}}}};function Jt(e){var t;return(e==null||(t=e.ownerDocument)==null?void 0:t.defaultView)||window}function Nr(e){return Jt(e).getComputedStyle(e)}function u2(e){return e instanceof Jt(e).Node}function Bn(e){return u2(e)?(e.nodeName||"").toLowerCase():"#document"}function Ar(e){return e instanceof HTMLElement||e instanceof Jt(e).HTMLElement}function n1(e){return typeof ShadowRoot<"u"&&(e instanceof Jt(e).ShadowRoot||e instanceof ShadowRoot)}function Ya(e){const{overflow:t,overflowX:r,overflowY:n,display:i}=Nr(e);return/auto|scroll|overlay|hidden|clip/.test(t+n+r)&&!["inline","contents"].includes(i)}function wP(e){return["table","td","th"].includes(Bn(e))}function i0(e){const t=eh(),r=Nr(e);return r.transform!=="none"||r.perspective!=="none"||!!r.containerType&&r.containerType!=="normal"||!t&&!!r.backdropFilter&&r.backdropFilter!=="none"||!t&&!!r.filter&&r.filter!=="none"||["transform","perspective","filter"].some(n=>(r.willChange||"").includes(n))||["paint","layout","strict","content"].some(n=>(r.contain||"").includes(n))}function eh(){return!(typeof CSS>"u"||!CSS.supports)&&CSS.supports("-webkit-backdrop-filter","none")}function Du(e){return["html","body","#document"].includes(Bn(e))}const o0=Math.min,co=Math.max,Jl=Math.round,Ws=Math.floor,Un=e=>({x:e,y:e});function c2(e){const t=Nr(e);let r=parseFloat(t.width)||0,n=parseFloat(t.height)||0;const i=Ar(e),o=i?e.offsetWidth:r,a=i?e.offsetHeight:n,s=Jl(r)!==o||Jl(n)!==a;return s&&(r=o,n=a),{width:r,height:n,$:s}}function en(e){return e instanceof Element||e instanceof Jt(e).Element}function th(e){return en(e)?e:e.contextElement}function fo(e){const t=th(e);if(!Ar(t))return Un(1);const r=t.getBoundingClientRect(),{width:n,height:i,$:o}=c2(t);let a=(o?Jl(r.width):r.width)/n,s=(o?Jl(r.height):r.height)/i;return a&&Number.isFinite(a)||(a=1),s&&Number.isFinite(s)||(s=1),{x:a,y:s}}const yP=Un(0);function f2(e){const t=Jt(e);return eh()&&t.visualViewport?{x:t.visualViewport.offsetLeft,y:t.visualViewport.offsetTop}:yP}function ci(e,t,r,n){t===void 0&&(t=!1),r===void 0&&(r=!1);const i=e.getBoundingClientRect(),o=th(e);let a=Un(1);t&&(n?en(n)&&(a=fo(n)):a=fo(e));const s=function(d,h,m){return h===void 0&&(h=!1),!(!m||h&&m!==Jt(d))&&h}(o,r,n)?f2(o):Un(0);let l=(i.left+s.x)/a.x,u=(i.top+s.y)/a.y,c=i.width/a.x,f=i.height/a.y;if(o){const d=Jt(o),h=n&&en(n)?Jt(n):n;let m=d.frameElement;for(;m&&n&&h!==d;){const p=fo(m),g=m.getBoundingClientRect(),v=getComputedStyle(m),w=g.left+(m.clientLeft+parseFloat(v.paddingLeft))*p.x,y=g.top+(m.clientTop+parseFloat(v.paddingTop))*p.y;l*=p.x,u*=p.y,c*=p.x,f*=p.y,l+=w,u+=y,m=Jt(m).frameElement}}return Ql({width:c,height:f,x:l,y:u})}function Pu(e){return en(e)?{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}:{scrollLeft:e.pageXOffset,scrollTop:e.pageYOffset}}function tn(e){var t;return(t=(u2(e)?e.ownerDocument:e.document)||window.document)==null?void 0:t.documentElement}function d2(e){return ci(tn(e)).left+Pu(e).scrollLeft}function wo(e){if(Bn(e)==="html")return e;const t=e.assignedSlot||e.parentNode||n1(e)&&e.host||tn(e);return n1(t)?t.host:t}function h2(e){const t=wo(e);return Du(t)?e.ownerDocument?e.ownerDocument.body:e.body:Ar(t)&&Ya(t)?t:h2(t)}function eu(e,t){var r;t===void 0&&(t=[]);const n=h2(e),i=n===((r=e.ownerDocument)==null?void 0:r.body),o=Jt(n);return i?t.concat(o,o.visualViewport||[],Ya(n)?n:[]):t.concat(n,eu(n))}function i1(e,t,r){let n;if(t==="viewport")n=function(i,o){const a=Jt(i),s=tn(i),l=a.visualViewport;let u=s.clientWidth,c=s.clientHeight,f=0,d=0;if(l){u=l.width,c=l.height;const h=eh();(!h||h&&o==="fixed")&&(f=l.offsetLeft,d=l.offsetTop)}return{width:u,height:c,x:f,y:d}}(e,r);else if(t==="document")n=function(i){const o=tn(i),a=Pu(i),s=i.ownerDocument.body,l=co(o.scrollWidth,o.clientWidth,s.scrollWidth,s.clientWidth),u=co(o.scrollHeight,o.clientHeight,s.scrollHeight,s.clientHeight);let c=-a.scrollLeft+d2(i);const f=-a.scrollTop;return Nr(s).direction==="rtl"&&(c+=co(o.clientWidth,s.clientWidth)-l),{width:l,height:u,x:c,y:f}}(tn(e));else if(en(t))n=function(i,o){const a=ci(i,!0,o==="fixed"),s=a.top+i.clientTop,l=a.left+i.clientLeft,u=Ar(i)?fo(i):Un(1);return{width:i.clientWidth*u.x,height:i.clientHeight*u.y,x:l*u.x,y:s*u.y}}(t,r);else{const i=f2(e);n={...t,x:t.x-i.x,y:t.y-i.y}}return Ql(n)}function p2(e,t){const r=wo(e);return!(r===t||!en(r)||Du(r))&&(Nr(r).position==="fixed"||p2(r,t))}function EP(e,t,r){const n=Ar(t),i=tn(t),o=r==="fixed",a=ci(e,!0,o,t);let s={scrollLeft:0,scrollTop:0};const l=Un(0);if(n||!n&&!o)if((Bn(t)!=="body"||Ya(i))&&(s=Pu(t)),Ar(t)){const u=ci(t,!0,o,t);l.x=u.x+t.clientLeft,l.y=u.y+t.clientTop}else i&&(l.x=d2(i));return{x:a.left+s.scrollLeft-l.x,y:a.top+s.scrollTop-l.y,width:a.width,height:a.height}}function o1(e,t){return Ar(e)&&Nr(e).position!=="fixed"?t?t(e):e.offsetParent:null}function a1(e,t){const r=Jt(e);if(!Ar(e))return r;let n=o1(e,t);for(;n&&wP(n)&&Nr(n).position==="static";)n=o1(n,t);return n&&(Bn(n)==="html"||Bn(n)==="body"&&Nr(n).position==="static"&&!i0(n))?r:n||function(i){let o=wo(i);for(;Ar(o)&&!Du(o);){if(i0(o))return o;o=wo(o)}return null}(e)||r}const _P={convertOffsetParentRelativeRectToViewportRelativeRect:function(e){let{rect:t,offsetParent:r,strategy:n}=e;const i=Ar(r),o=tn(r);if(r===o)return t;let a={scrollLeft:0,scrollTop:0},s=Un(1);const l=Un(0);if((i||!i&&n!=="fixed")&&((Bn(r)!=="body"||Ya(o))&&(a=Pu(r)),Ar(r))){const u=ci(r);s=fo(r),l.x=u.x+r.clientLeft,l.y=u.y+r.clientTop}return{width:t.width*s.x,height:t.height*s.y,x:t.x*s.x-a.scrollLeft*s.x+l.x,y:t.y*s.y-a.scrollTop*s.y+l.y}},getDocumentElement:tn,getClippingRect:function(e){let{element:t,boundary:r,rootBoundary:n,strategy:i}=e;const o=[...r==="clippingAncestors"?function(l,u){const c=u.get(l);if(c)return c;let f=eu(l).filter(p=>en(p)&&Bn(p)!=="body"),d=null;const h=Nr(l).position==="fixed";let m=h?wo(l):l;for(;en(m)&&!Du(m);){const p=Nr(m),g=i0(m);g||p.position!=="fixed"||(d=null),(h?!g&&!d:!g&&p.position==="static"&&d&&["absolute","fixed"].includes(d.position)||Ya(m)&&!g&&p2(l,m))?f=f.filter(v=>v!==m):d=p,m=wo(m)}return u.set(l,f),f}(t,this._c):[].concat(r),n],a=o[0],s=o.reduce((l,u)=>{const c=i1(t,u,i);return l.top=co(c.top,l.top),l.right=o0(c.right,l.right),l.bottom=o0(c.bottom,l.bottom),l.left=co(c.left,l.left),l},i1(t,a,i));return{width:s.right-s.left,height:s.bottom-s.top,x:s.left,y:s.top}},getOffsetParent:a1,getElementRects:async function(e){let{reference:t,floating:r,strategy:n}=e;const i=this.getOffsetParent||a1,o=this.getDimensions;return{reference:EP(t,await i(r),n),floating:{x:0,y:0,...await o(r)}}},getClientRects:function(e){return Array.from(e.getClientRects())},getDimensions:function(e){return c2(e)},getScale:fo,isElement:en,isRTL:function(e){return getComputedStyle(e).direction==="rtl"}};function SP(e,t,r,n){n===void 0&&(n={});const{ancestorScroll:i=!0,ancestorResize:o=!0,elementResize:a=typeof ResizeObserver=="function",layoutShift:s=typeof IntersectionObserver=="function",animationFrame:l=!1}=n,u=th(e),c=i||o?[...u?eu(u):[],...eu(t)]:[];c.forEach(g=>{i&&g.addEventListener("scroll",r,{passive:!0}),o&&g.addEventListener("resize",r)});const f=u&&s?function(g,v){let w,y=null;const E=tn(g);function b(){clearTimeout(w),y&&y.disconnect(),y=null}return function k(S,C){S===void 0&&(S=!1),C===void 0&&(C=1),b();const{left:A,top:L,width:B,height:U}=g.getBoundingClientRect();if(S||v(),!B||!U)return;const H={rootMargin:-Ws(L)+"px "+-Ws(E.clientWidth-(A+B))+"px "+-Ws(E.clientHeight-(L+U))+"px "+-Ws(A)+"px",threshold:co(0,o0(1,C))||1};let G=!0;function ee(ae){const he=ae[0].intersectionRatio;if(he!==C){if(!G)return k();he?k(!1,he):w=setTimeout(()=>{k(!1,1e-7)},100)}G=!1}try{y=new IntersectionObserver(ee,{...H,root:E.ownerDocument})}catch{y=new IntersectionObserver(ee,H)}y.observe(g)}(!0),b}(u,r):null;let d,h=-1,m=null;a&&(m=new ResizeObserver(g=>{let[v]=g;v&&v.target===u&&m&&(m.unobserve(t),cancelAnimationFrame(h),h=requestAnimationFrame(()=>{m&&m.observe(t)})),r()}),u&&!l&&m.observe(u),m.observe(t));let p=l?ci(e):null;return l&&function g(){const v=ci(e);!p||v.x===p.x&&v.y===p.y&&v.width===p.width&&v.height===p.height||r(),p=v,d=requestAnimationFrame(g)}(),r(),()=>{c.forEach(g=>{i&&g.removeEventListener("scroll",r),o&&g.removeEventListener("resize",r)}),f&&f(),m&&m.disconnect(),m=null,l&&cancelAnimationFrame(d)}}const TP=(e,t,r)=>{const n=new Map,i={platform:_P,...r},o={...i.platform,_c:n};return uP(e,t,{...i,platform:o})},CP=e=>{function t(r){return{}.hasOwnProperty.call(r,"current")}return{name:"arrow",options:e,fn(r){const{element:n,padding:i}=typeof e=="function"?e(r):e;return n&&t(n)?n.current!=null?e1({element:n.current,padding:i}).fn(r):{}:n?e1({element:n,padding:i}).fn(r):{}}}};var ll=typeof document<"u"?x.useLayoutEffect:x.useEffect;function tu(e,t){if(e===t)return!0;if(typeof e!=typeof t)return!1;if(typeof e=="function"&&e.toString()===t.toString())return!0;let r,n,i;if(e&&t&&typeof e=="object"){if(Array.isArray(e)){if(r=e.length,r!=t.length)return!1;for(n=r;n--!==0;)if(!tu(e[n],t[n]))return!1;return!0}if(i=Object.keys(e),r=i.length,r!==Object.keys(t).length)return!1;for(n=r;n--!==0;)if(!{}.hasOwnProperty.call(t,i[n]))return!1;for(n=r;n--!==0;){const o=i[n];if(!(o==="_owner"&&e.$$typeof)&&!tu(e[o],t[o]))return!1}return!0}return e!==e&&t!==t}function g2(e){return typeof window>"u"?1:(e.ownerDocument.defaultView||window).devicePixelRatio||1}function s1(e,t){const r=g2(e);return Math.round(t*r)/r}function l1(e){const t=x.useRef(e);return ll(()=>{t.current=e}),t}function AP(e){e===void 0&&(e={});const{placement:t="bottom",strategy:r="absolute",middleware:n=[],platform:i,elements:{reference:o,floating:a}={},transform:s=!0,whileElementsMounted:l,open:u}=e,[c,f]=x.useState({x:0,y:0,strategy:r,placement:t,middlewareData:{},isPositioned:!1}),[d,h]=x.useState(n);tu(d,n)||h(n);const[m,p]=x.useState(null),[g,v]=x.useState(null),w=x.useCallback(ae=>{ae!=k.current&&(k.current=ae,p(ae))},[p]),y=x.useCallback(ae=>{ae!==S.current&&(S.current=ae,v(ae))},[v]),E=o||m,b=a||g,k=x.useRef(null),S=x.useRef(null),C=x.useRef(c),A=l1(l),L=l1(i),B=x.useCallback(()=>{if(!k.current||!S.current)return;const ae={placement:t,strategy:r,middleware:d};L.current&&(ae.platform=L.current),TP(k.current,S.current,ae).then(he=>{const Te={...he,isPositioned:!0};U.current&&!tu(C.current,Te)&&(C.current=Te,mi.flushSync(()=>{f(Te)}))})},[d,t,r,L]);ll(()=>{u===!1&&C.current.isPositioned&&(C.current.isPositioned=!1,f(ae=>({...ae,isPositioned:!1})))},[u]);const U=x.useRef(!1);ll(()=>(U.current=!0,()=>{U.current=!1}),[]),ll(()=>{if(E&&(k.current=E),b&&(S.current=b),E&&b){if(A.current)return A.current(E,b,B);B()}},[E,b,B,A]);const H=x.useMemo(()=>({reference:k,floating:S,setReference:w,setFloating:y}),[w,y]),G=x.useMemo(()=>({reference:E,floating:b}),[E,b]),ee=x.useMemo(()=>{const ae={position:r,left:0,top:0};if(!G.floating)return ae;const he=s1(G.floating,c.x),Te=s1(G.floating,c.y);return s?{...ae,transform:"translate("+he+"px, "+Te+"px)",...g2(G.floating)>=1.5&&{willChange:"transform"}}:{position:r,left:he,top:Te}},[r,s,G.floating,c.x,c.y]);return x.useMemo(()=>({...c,update:B,refs:H,elements:G,floatingStyles:ee}),[c,B,H,G,ee])}function RP(e){const[t,r]=x.useState(void 0);return Bt(()=>{if(e){r({width:e.offsetWidth,height:e.offsetHeight});const n=new ResizeObserver(i=>{if(!Array.isArray(i)||!i.length)return;const o=i[0];let a,s;if("borderBoxSize"in o){const l=o.borderBoxSize,u=Array.isArray(l)?l[0]:l;a=u.inlineSize,s=u.blockSize}else a=e.offsetWidth,s=e.offsetHeight;r({width:a,height:s})});return n.observe(e,{box:"border-box"}),()=>n.unobserve(e)}else r(void 0)},[e]),t}const m2="Popper",[v2,Iu]=ln(m2),[OP,x2]=v2(m2),FP=e=>{const{__scopePopper:t,children:r}=e,[n,i]=x.useState(null);return x.createElement(OP,{scope:t,anchor:n,onAnchorChange:i},r)},DP="PopperAnchor",PP=x.forwardRef((e,t)=>{const{__scopePopper:r,virtualRef:n,...i}=e,o=x2(DP,r),a=x.useRef(null),s=Ve(t,a);return x.useEffect(()=>{o.onAnchorChange((n==null?void 0:n.current)||a.current)}),n?null:x.createElement(Ie.div,ge({},i,{ref:s}))}),w2="PopperContent",[IP,r$]=v2(w2),bP=x.forwardRef((e,t)=>{var r,n,i,o,a,s,l,u;const{__scopePopper:c,side:f="bottom",sideOffset:d=0,align:h="center",alignOffset:m=0,arrowPadding:p=0,collisionBoundary:g=[],collisionPadding:v=0,sticky:w="partial",hideWhenDetached:y=!1,avoidCollisions:E=!0,onPlaced:b,...k}=e,S=x2(w2,c),[C,A]=x.useState(null),L=Ve(t,ne=>A(ne)),[B,U]=x.useState(null),H=RP(B),G=(r=H==null?void 0:H.width)!==null&&r!==void 0?r:0,ee=(n=H==null?void 0:H.height)!==null&&n!==void 0?n:0,ae=f+(h!=="center"?"-"+h:""),he=typeof v=="number"?v:{top:0,right:0,bottom:0,left:0,...v},Te=Array.isArray(g)?g:[g],oe=Te.length>0,ye={padding:he,boundary:Te.filter(kP),altBoundary:oe},{refs:te,floatingStyles:O,placement:M,isPositioned:N,middlewareData:F}=AP({strategy:"fixed",placement:ae,whileElementsMounted:SP,elements:{reference:S.anchor},middleware:[gP({mainAxis:d+ee,alignmentAxis:m}),E&&mP({mainAxis:!0,crossAxis:!1,limiter:w==="partial"?vP():void 0,...ye}),E&&hP({...ye}),xP({...ye,apply:({elements:ne,rects:$e,availableWidth:Pe,availableHeight:ve})=>{const{width:ut,height:gt}=$e.reference,bt=ne.floating.style;bt.setProperty("--radix-popper-available-width",`${Pe}px`),bt.setProperty("--radix-popper-available-height",`${ve}px`),bt.setProperty("--radix-popper-anchor-width",`${ut}px`),bt.setProperty("--radix-popper-anchor-height",`${gt}px`)}}),B&&CP({element:B,padding:p}),$P({arrowWidth:G,arrowHeight:ee}),y&&pP({strategy:"referenceHidden"})]}),[V,Y]=y2(M),J=It(b);Bt(()=>{N&&(J==null||J())},[N,J]);const W=(i=F.arrow)===null||i===void 0?void 0:i.x,Q=(o=F.arrow)===null||o===void 0?void 0:o.y,le=((a=F.arrow)===null||a===void 0?void 0:a.centerOffset)!==0,[me,Se]=x.useState();return Bt(()=>{C&&Se(window.getComputedStyle(C).zIndex)},[C]),x.createElement("div",{ref:te.setFloating,"data-radix-popper-content-wrapper":"",style:{...O,transform:N?O.transform:"translate(0, -200%)",minWidth:"max-content",zIndex:me,"--radix-popper-transform-origin":[(s=F.transformOrigin)===null||s===void 0?void 0:s.x,(l=F.transformOrigin)===null||l===void 0?void 0:l.y].join(" ")},dir:e.dir},x.createElement(IP,{scope:c,placedSide:V,onArrowChange:U,arrowX:W,arrowY:Q,shouldHideArrow:le},x.createElement(Ie.div,ge({"data-side":V,"data-align":Y},k,{ref:L,style:{...k.style,animation:N?void 0:"none",opacity:(u=F.hide)!==null&&u!==void 0&&u.referenceHidden?0:void 0}}))))});function kP(e){return e!==null}const $P=e=>({name:"transformOrigin",options:e,fn(t){var r,n,i,o,a;const{placement:s,rects:l,middlewareData:u}=t,f=((r=u.arrow)===null||r===void 0?void 0:r.centerOffset)!==0,d=f?0:e.arrowWidth,h=f?0:e.arrowHeight,[m,p]=y2(s),g={start:"0%",center:"50%",end:"100%"}[p],v=((n=(i=u.arrow)===null||i===void 0?void 0:i.x)!==null&&n!==void 0?n:0)+d/2,w=((o=(a=u.arrow)===null||a===void 0?void 0:a.y)!==null&&o!==void 0?o:0)+h/2;let y="",E="";return m==="bottom"?(y=f?g:`${v}px`,E=`${-h}px`):m==="top"?(y=f?g:`${v}px`,E=`${l.floating.height+h}px`):m==="right"?(y=`${-h}px`,E=f?g:`${w}px`):m==="left"&&(y=`${l.floating.width+h}px`,E=f?g:`${w}px`),{data:{x:y,y:E}}}});function y2(e){const[t,r="center"]=e.split("-");return[t,r]}const E2=FP,_2=PP,S2=bP;function NP(e){const t=x.useRef({value:e,previous:e});return x.useMemo(()=>(t.current.value!==e&&(t.current.previous=t.current.value,t.current.value=e),t.current.previous),[e])}const rh=x.forwardRef((e,t)=>x.createElement(Ie.span,ge({},e,{ref:t,style:{position:"absolute",border:0,width:1,height:1,padding:0,margin:-1,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",wordWrap:"normal",...e.style}}))),MP=[" ","Enter","ArrowUp","ArrowDown"],LP=[" ","Enter"],bu="Select",[ku,$u,BP]=Fu(bu),[bo,n$]=ln(bu,[BP,Iu]),nh=Iu(),[UP,Ci]=bo(bu),[HP,VP]=bo(bu),WP=e=>{const{__scopeSelect:t,children:r,open:n,defaultOpen:i,onOpenChange:o,value:a,defaultValue:s,onValueChange:l,dir:u,name:c,autoComplete:f,disabled:d,required:h}=e,m=nh(t),[p,g]=x.useState(null),[v,w]=x.useState(null),[y,E]=x.useState(!1),b=Zd(u),[k=!1,S]=vo({prop:n,defaultProp:i,onChange:o}),[C,A]=vo({prop:a,defaultProp:s,onChange:l}),L=x.useRef(null),B=p?!!p.closest("form"):!0,[U,H]=x.useState(new Set),G=Array.from(U).map(ee=>ee.props.value).join(";");return x.createElement(E2,m,x.createElement(UP,{required:h,scope:t,trigger:p,onTriggerChange:g,valueNode:v,onValueNodeChange:w,valueNodeHasChildren:y,onValueNodeHasChildrenChange:E,contentId:Yr(),value:C,onValueChange:A,open:k,onOpenChange:S,dir:b,triggerPointerDownPosRef:L,disabled:d},x.createElement(ku.Provider,{scope:t},x.createElement(HP,{scope:e.__scopeSelect,onNativeOptionAdd:x.useCallback(ee=>{H(ae=>new Set(ae).add(ee))},[]),onNativeOptionRemove:x.useCallback(ee=>{H(ae=>{const he=new Set(ae);return he.delete(ee),he})},[])},r)),B?x.createElement(R2,{key:G,"aria-hidden":!0,required:h,tabIndex:-1,name:c,autoComplete:f,value:C,onChange:ee=>A(ee.target.value),disabled:d},C===void 0?x.createElement("option",{value:""}):null,Array.from(U)):null))},zP="SelectTrigger",GP=x.forwardRef((e,t)=>{const{__scopeSelect:r,disabled:n=!1,...i}=e,o=nh(r),a=Ci(zP,r),s=a.disabled||n,l=Ve(t,a.onTriggerChange),u=$u(r),[c,f,d]=O2(m=>{const p=u().filter(w=>!w.disabled),g=p.find(w=>w.value===a.value),v=F2(p,m,g);v!==void 0&&a.onValueChange(v.value)}),h=()=>{s||(a.onOpenChange(!0),d())};return x.createElement(_2,ge({asChild:!0},o),x.createElement(Ie.button,ge({type:"button",role:"combobox","aria-controls":a.contentId,"aria-expanded":a.open,"aria-required":a.required,"aria-autocomplete":"none",dir:a.dir,"data-state":a.open?"open":"closed",disabled:s,"data-disabled":s?"":void 0,"data-placeholder":a.value===void 0?"":void 0},i,{ref:l,onClick:_e(i.onClick,m=>{m.currentTarget.focus()}),onPointerDown:_e(i.onPointerDown,m=>{const p=m.target;p.hasPointerCapture(m.pointerId)&&p.releasePointerCapture(m.pointerId),m.button===0&&m.ctrlKey===!1&&(h(),a.triggerPointerDownPosRef.current={x:Math.round(m.pageX),y:Math.round(m.pageY)},m.preventDefault())}),onKeyDown:_e(i.onKeyDown,m=>{const p=c.current!=="";!(m.ctrlKey||m.altKey||m.metaKey)&&m.key.length===1&&f(m.key),!(p&&m.key===" ")&&MP.includes(m.key)&&(h(),m.preventDefault())})})))}),jP="SelectValue",XP=x.forwardRef((e,t)=>{const{__scopeSelect:r,className:n,style:i,children:o,placeholder:a,...s}=e,l=Ci(jP,r),{onValueNodeHasChildrenChange:u}=l,c=o!==void 0,f=Ve(t,l.onValueNodeChange);return Bt(()=>{u(c)},[u,c]),x.createElement(Ie.span,ge({},s,{ref:f,style:{pointerEvents:"none"}}),l.value===void 0&&a!==void 0?a:o)}),KP=x.forwardRef((e,t)=>{const{__scopeSelect:r,children:n,...i}=e;return x.createElement(Ie.span,ge({"aria-hidden":!0},i,{ref:t}),n||"▼")}),YP=e=>x.createElement(xu,ge({asChild:!0},e)),yo="SelectContent",qP=x.forwardRef((e,t)=>{const r=Ci(yo,e.__scopeSelect),[n,i]=x.useState();if(Bt(()=>{i(new DocumentFragment)},[]),!r.open){const o=n;return o?mi.createPortal(x.createElement(T2,{scope:e.__scopeSelect},x.createElement(ku.Slot,{scope:e.__scopeSelect},x.createElement("div",null,e.children))),o):null}return x.createElement(QP,ge({},e,{ref:t}))}),Vr=10,[T2,Ai]=bo(yo),QP=x.forwardRef((e,t)=>{const{__scopeSelect:r,position:n="item-aligned",onCloseAutoFocus:i,onEscapeKeyDown:o,onPointerDownOutside:a,side:s,sideOffset:l,align:u,alignOffset:c,arrowPadding:f,collisionBoundary:d,collisionPadding:h,sticky:m,hideWhenDetached:p,avoidCollisions:g,...v}=e,w=Ci(yo,r),[y,E]=x.useState(null),[b,k]=x.useState(null),S=Ve(t,Y=>E(Y)),[C,A]=x.useState(null),[L,B]=x.useState(null),U=$u(r),[H,G]=x.useState(!1),ee=x.useRef(!1);x.useEffect(()=>{if(y)return Sd(y)},[y]),Ed();const ae=x.useCallback(Y=>{const[J,...W]=U().map(me=>me.ref.current),[Q]=W.slice(-1),le=document.activeElement;for(const me of Y)if(me===le||(me==null||me.scrollIntoView({block:"nearest"}),me===J&&b&&(b.scrollTop=0),me===Q&&b&&(b.scrollTop=b.scrollHeight),me==null||me.focus(),document.activeElement!==le))return},[U,b]),he=x.useCallback(()=>ae([C,y]),[ae,C,y]);x.useEffect(()=>{H&&he()},[H,he]);const{onOpenChange:Te,triggerPointerDownPosRef:oe}=w;x.useEffect(()=>{if(y){let Y={x:0,y:0};const J=Q=>{var le,me,Se,ne;Y={x:Math.abs(Math.round(Q.pageX)-((le=(me=oe.current)===null||me===void 0?void 0:me.x)!==null&&le!==void 0?le:0)),y:Math.abs(Math.round(Q.pageY)-((Se=(ne=oe.current)===null||ne===void 0?void 0:ne.y)!==null&&Se!==void 0?Se:0))}},W=Q=>{Y.x<=10&&Y.y<=10?Q.preventDefault():y.contains(Q.target)||Te(!1),document.removeEventListener("pointermove",J),oe.current=null};return oe.current!==null&&(document.addEventListener("pointermove",J),document.addEventListener("pointerup",W,{capture:!0,once:!0})),()=>{document.removeEventListener("pointermove",J),document.removeEventListener("pointerup",W,{capture:!0})}}},[y,Te,oe]),x.useEffect(()=>{const Y=()=>Te(!1);return window.addEventListener("blur",Y),window.addEventListener("resize",Y),()=>{window.removeEventListener("blur",Y),window.removeEventListener("resize",Y)}},[Te]);const[ye,te]=O2(Y=>{const J=U().filter(le=>!le.disabled),W=J.find(le=>le.ref.current===document.activeElement),Q=F2(J,Y,W);Q&&setTimeout(()=>Q.ref.current.focus())}),O=x.useCallback((Y,J,W)=>{const Q=!ee.current&&!W;(w.value!==void 0&&w.value===J||Q)&&(A(Y),Q&&(ee.current=!0))},[w.value]),M=x.useCallback(()=>y==null?void 0:y.focus(),[y]),N=x.useCallback((Y,J,W)=>{const Q=!ee.current&&!W;(w.value!==void 0&&w.value===J||Q)&&B(Y)},[w.value]),F=n==="popper"?u1:ZP,V=F===u1?{side:s,sideOffset:l,align:u,alignOffset:c,arrowPadding:f,collisionBoundary:d,collisionPadding:h,sticky:m,hideWhenDetached:p,avoidCollisions:g}:{};return x.createElement(T2,{scope:r,content:y,viewport:b,onViewportChange:k,itemRefCallback:O,selectedItem:C,onItemLeave:M,itemTextRefCallback:N,focusSelectedItem:he,selectedItemText:L,position:n,isPositioned:H,searchRef:ye},x.createElement(_d,{as:ai,allowPinchZoom:!0},x.createElement(yd,{asChild:!0,trapped:w.open,onMountAutoFocus:Y=>{Y.preventDefault()},onUnmountAutoFocus:_e(i,Y=>{var J;(J=w.trigger)===null||J===void 0||J.focus({preventScroll:!0}),Y.preventDefault()})},x.createElement(vu,{asChild:!0,disableOutsidePointerEvents:!0,onEscapeKeyDown:o,onPointerDownOutside:a,onFocusOutside:Y=>Y.preventDefault(),onDismiss:()=>w.onOpenChange(!1)},x.createElement(F,ge({role:"listbox",id:w.contentId,"data-state":w.open?"open":"closed",dir:w.dir,onContextMenu:Y=>Y.preventDefault()},v,V,{onPlaced:()=>G(!0),ref:S,style:{display:"flex",flexDirection:"column",outline:"none",...v.style},onKeyDown:_e(v.onKeyDown,Y=>{const J=Y.ctrlKey||Y.altKey||Y.metaKey;if(Y.key==="Tab"&&Y.preventDefault(),!J&&Y.key.length===1&&te(Y.key),["ArrowUp","ArrowDown","Home","End"].includes(Y.key)){let Q=U().filter(le=>!le.disabled).map(le=>le.ref.current);if(["ArrowUp","End"].includes(Y.key)&&(Q=Q.slice().reverse()),["ArrowUp","ArrowDown"].includes(Y.key)){const le=Y.target,me=Q.indexOf(le);Q=Q.slice(me+1)}setTimeout(()=>ae(Q)),Y.preventDefault()}})}))))))}),ZP=x.forwardRef((e,t)=>{const{__scopeSelect:r,onPlaced:n,...i}=e,o=Ci(yo,r),a=Ai(yo,r),[s,l]=x.useState(null),[u,c]=x.useState(null),f=Ve(t,S=>c(S)),d=$u(r),h=x.useRef(!1),m=x.useRef(!0),{viewport:p,selectedItem:g,selectedItemText:v,focusSelectedItem:w}=a,y=x.useCallback(()=>{if(o.trigger&&o.valueNode&&s&&u&&p&&g&&v){const S=o.trigger.getBoundingClientRect(),C=u.getBoundingClientRect(),A=o.valueNode.getBoundingClientRect(),L=v.getBoundingClientRect();if(o.dir!=="rtl"){const le=L.left-C.left,me=A.left-le,Se=S.left-me,ne=S.width+Se,$e=Math.max(ne,C.width),Pe=window.innerWidth-Vr,ve=Zg(me,[Vr,Pe-$e]);s.style.minWidth=ne+"px",s.style.left=ve+"px"}else{const le=C.right-L.right,me=window.innerWidth-A.right-le,Se=window.innerWidth-S.right-me,ne=S.width+Se,$e=Math.max(ne,C.width),Pe=window.innerWidth-Vr,ve=Zg(me,[Vr,Pe-$e]);s.style.minWidth=ne+"px",s.style.right=ve+"px"}const B=d(),U=window.innerHeight-Vr*2,H=p.scrollHeight,G=window.getComputedStyle(u),ee=parseInt(G.borderTopWidth,10),ae=parseInt(G.paddingTop,10),he=parseInt(G.borderBottomWidth,10),Te=parseInt(G.paddingBottom,10),oe=ee+ae+H+Te+he,ye=Math.min(g.offsetHeight*5,oe),te=window.getComputedStyle(p),O=parseInt(te.paddingTop,10),M=parseInt(te.paddingBottom,10),N=S.top+S.height/2-Vr,F=U-N,V=g.offsetHeight/2,Y=g.offsetTop+V,J=ee+ae+Y,W=oe-J;if(J<=N){const le=g===B[B.length-1].ref.current;s.style.bottom="0px";const me=u.clientHeight-p.offsetTop-p.offsetHeight,Se=Math.max(F,V+(le?M:0)+me+he),ne=J+Se;s.style.height=ne+"px"}else{const le=g===B[0].ref.current;s.style.top="0px";const Se=Math.max(N,ee+p.offsetTop+(le?O:0)+V)+W;s.style.height=Se+"px",p.scrollTop=J-N+p.offsetTop}s.style.margin=`${Vr}px 0`,s.style.minHeight=ye+"px",s.style.maxHeight=U+"px",n==null||n(),requestAnimationFrame(()=>h.current=!0)}},[d,o.trigger,o.valueNode,s,u,p,g,v,o.dir,n]);Bt(()=>y(),[y]);const[E,b]=x.useState();Bt(()=>{u&&b(window.getComputedStyle(u).zIndex)},[u]);const k=x.useCallback(S=>{S&&m.current===!0&&(y(),w==null||w(),m.current=!1)},[y,w]);return x.createElement(JP,{scope:r,contentWrapper:s,shouldExpandOnScrollRef:h,onScrollButtonChange:k},x.createElement("div",{ref:l,style:{display:"flex",flexDirection:"column",position:"fixed",zIndex:E}},x.createElement(Ie.div,ge({},i,{ref:f,style:{boxSizing:"border-box",maxHeight:"100%",...i.style}}))))}),u1=x.forwardRef((e,t)=>{const{__scopeSelect:r,align:n="start",collisionPadding:i=Vr,...o}=e,a=nh(r);return x.createElement(S2,ge({},a,o,{ref:t,align:n,collisionPadding:i,style:{boxSizing:"border-box",...o.style,"--radix-select-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-select-content-available-width":"var(--radix-popper-available-width)","--radix-select-content-available-height":"var(--radix-popper-available-height)","--radix-select-trigger-width":"var(--radix-popper-anchor-width)","--radix-select-trigger-height":"var(--radix-popper-anchor-height)"}}))}),[JP,ih]=bo(yo,{}),c1="SelectViewport",eI=x.forwardRef((e,t)=>{const{__scopeSelect:r,...n}=e,i=Ai(c1,r),o=ih(c1,r),a=Ve(t,i.onViewportChange),s=x.useRef(0);return x.createElement(x.Fragment,null,x.createElement("style",{dangerouslySetInnerHTML:{__html:"[data-radix-select-viewport]{scrollbar-width:none;-ms-overflow-style:none;-webkit-overflow-scrolling:touch;}[data-radix-select-viewport]::-webkit-scrollbar{display:none}"}}),x.createElement(ku.Slot,{scope:r},x.createElement(Ie.div,ge({"data-radix-select-viewport":"",role:"presentation"},n,{ref:a,style:{position:"relative",flex:1,overflow:"auto",...n.style},onScroll:_e(n.onScroll,l=>{const u=l.currentTarget,{contentWrapper:c,shouldExpandOnScrollRef:f}=o;if(f!=null&&f.current&&c){const d=Math.abs(s.current-u.scrollTop);if(d>0){const h=window.innerHeight-Vr*2,m=parseFloat(c.style.minHeight),p=parseFloat(c.style.height),g=Math.max(m,p);if(g0?y:0,c.style.justifyContent="flex-end")}}}s.current=u.scrollTop})}))))}),tI="SelectGroup",[rI,nI]=bo(tI),iI=x.forwardRef((e,t)=>{const{__scopeSelect:r,...n}=e,i=Yr();return x.createElement(rI,{scope:r,id:i},x.createElement(Ie.div,ge({role:"group","aria-labelledby":i},n,{ref:t})))}),oI="SelectLabel",aI=x.forwardRef((e,t)=>{const{__scopeSelect:r,...n}=e,i=nI(oI,r);return x.createElement(Ie.div,ge({id:i.id},n,{ref:t}))}),a0="SelectItem",[sI,C2]=bo(a0),lI=x.forwardRef((e,t)=>{const{__scopeSelect:r,value:n,disabled:i=!1,textValue:o,...a}=e,s=Ci(a0,r),l=Ai(a0,r),u=s.value===n,[c,f]=x.useState(o??""),[d,h]=x.useState(!1),m=Ve(t,v=>{var w;return(w=l.itemRefCallback)===null||w===void 0?void 0:w.call(l,v,n,i)}),p=Yr(),g=()=>{i||(s.onValueChange(n),s.onOpenChange(!1))};return x.createElement(sI,{scope:r,value:n,disabled:i,textId:p,isSelected:u,onItemTextChange:x.useCallback(v=>{f(w=>{var y;return w||((y=v==null?void 0:v.textContent)!==null&&y!==void 0?y:"").trim()})},[])},x.createElement(ku.ItemSlot,{scope:r,value:n,disabled:i,textValue:c},x.createElement(Ie.div,ge({role:"option","aria-labelledby":p,"data-highlighted":d?"":void 0,"aria-selected":u&&d,"data-state":u?"checked":"unchecked","aria-disabled":i||void 0,"data-disabled":i?"":void 0,tabIndex:i?void 0:-1},a,{ref:m,onFocus:_e(a.onFocus,()=>h(!0)),onBlur:_e(a.onBlur,()=>h(!1)),onPointerUp:_e(a.onPointerUp,g),onPointerMove:_e(a.onPointerMove,v=>{if(i){var w;(w=l.onItemLeave)===null||w===void 0||w.call(l)}else v.currentTarget.focus({preventScroll:!0})}),onPointerLeave:_e(a.onPointerLeave,v=>{if(v.currentTarget===document.activeElement){var w;(w=l.onItemLeave)===null||w===void 0||w.call(l)}}),onKeyDown:_e(a.onKeyDown,v=>{var w;((w=l.searchRef)===null||w===void 0?void 0:w.current)!==""&&v.key===" "||(LP.includes(v.key)&&g(),v.key===" "&&v.preventDefault())})}))))}),zs="SelectItemText",uI=x.forwardRef((e,t)=>{const{__scopeSelect:r,className:n,style:i,...o}=e,a=Ci(zs,r),s=Ai(zs,r),l=C2(zs,r),u=VP(zs,r),[c,f]=x.useState(null),d=Ve(t,v=>f(v),l.onItemTextChange,v=>{var w;return(w=s.itemTextRefCallback)===null||w===void 0?void 0:w.call(s,v,l.value,l.disabled)}),h=c==null?void 0:c.textContent,m=x.useMemo(()=>x.createElement("option",{key:l.value,value:l.value,disabled:l.disabled},h),[l.disabled,l.value,h]),{onNativeOptionAdd:p,onNativeOptionRemove:g}=u;return Bt(()=>(p(m),()=>g(m)),[p,g,m]),x.createElement(x.Fragment,null,x.createElement(Ie.span,ge({id:l.textId},o,{ref:d})),l.isSelected&&a.valueNode&&!a.valueNodeHasChildren?mi.createPortal(o.children,a.valueNode):null)}),cI="SelectItemIndicator",fI=x.forwardRef((e,t)=>{const{__scopeSelect:r,...n}=e;return C2(cI,r).isSelected?x.createElement(Ie.span,ge({"aria-hidden":!0},n,{ref:t})):null}),f1="SelectScrollUpButton",dI=x.forwardRef((e,t)=>{const r=Ai(f1,e.__scopeSelect),n=ih(f1,e.__scopeSelect),[i,o]=x.useState(!1),a=Ve(t,n.onScrollButtonChange);return Bt(()=>{if(r.viewport&&r.isPositioned){let u=function(){const c=l.scrollTop>0;o(c)};var s=u;const l=r.viewport;return u(),l.addEventListener("scroll",u),()=>l.removeEventListener("scroll",u)}},[r.viewport,r.isPositioned]),i?x.createElement(A2,ge({},e,{ref:a,onAutoScroll:()=>{const{viewport:s,selectedItem:l}=r;s&&l&&(s.scrollTop=s.scrollTop-l.offsetHeight)}})):null}),d1="SelectScrollDownButton",hI=x.forwardRef((e,t)=>{const r=Ai(d1,e.__scopeSelect),n=ih(d1,e.__scopeSelect),[i,o]=x.useState(!1),a=Ve(t,n.onScrollButtonChange);return Bt(()=>{if(r.viewport&&r.isPositioned){let u=function(){const c=l.scrollHeight-l.clientHeight,f=Math.ceil(l.scrollTop)l.removeEventListener("scroll",u)}},[r.viewport,r.isPositioned]),i?x.createElement(A2,ge({},e,{ref:a,onAutoScroll:()=>{const{viewport:s,selectedItem:l}=r;s&&l&&(s.scrollTop=s.scrollTop+l.offsetHeight)}})):null}),A2=x.forwardRef((e,t)=>{const{__scopeSelect:r,onAutoScroll:n,...i}=e,o=Ai("SelectScrollButton",r),a=x.useRef(null),s=$u(r),l=x.useCallback(()=>{a.current!==null&&(window.clearInterval(a.current),a.current=null)},[]);return x.useEffect(()=>()=>l(),[l]),Bt(()=>{var u;const c=s().find(f=>f.ref.current===document.activeElement);c==null||(u=c.ref.current)===null||u===void 0||u.scrollIntoView({block:"nearest"})},[s]),x.createElement(Ie.div,ge({"aria-hidden":!0},i,{ref:t,style:{flexShrink:0,...i.style},onPointerDown:_e(i.onPointerDown,()=>{a.current===null&&(a.current=window.setInterval(n,50))}),onPointerMove:_e(i.onPointerMove,()=>{var u;(u=o.onItemLeave)===null||u===void 0||u.call(o),a.current===null&&(a.current=window.setInterval(n,50))}),onPointerLeave:_e(i.onPointerLeave,()=>{l()})}))}),R2=x.forwardRef((e,t)=>{const{value:r,...n}=e,i=x.useRef(null),o=Ve(t,i),a=NP(r);return x.useEffect(()=>{const s=i.current,l=window.HTMLSelectElement.prototype,c=Object.getOwnPropertyDescriptor(l,"value").set;if(a!==r&&c){const f=new Event("change",{bubbles:!0});c.call(s,r),s.dispatchEvent(f)}},[a,r]),x.createElement(rh,{asChild:!0},x.createElement("select",ge({},n,{ref:o,defaultValue:r})))});R2.displayName="BubbleSelect";function O2(e){const t=It(e),r=x.useRef(""),n=x.useRef(0),i=x.useCallback(a=>{const s=r.current+a;t(s),function l(u){r.current=u,window.clearTimeout(n.current),u!==""&&(n.current=window.setTimeout(()=>l(""),1e3))}(s)},[t]),o=x.useCallback(()=>{r.current="",window.clearTimeout(n.current)},[]);return x.useEffect(()=>()=>window.clearTimeout(n.current),[]),[r,i,o]}function F2(e,t,r){const i=t.length>1&&Array.from(t).every(u=>u===t[0])?t[0]:t,o=r?e.indexOf(r):-1;let a=pI(e,Math.max(o,0));i.length===1&&(a=a.filter(u=>u!==r));const l=a.find(u=>u.textValue.toLowerCase().startsWith(i.toLowerCase()));return l!==r?l:void 0}function pI(e,t){return e.map((r,n)=>e[(t+n)%e.length])}const gI=WP,mI=GP,vI=XP,xI=KP,wI=YP,yI=qP,EI=eI,Vc=iI,h1=aI,_I=lI,SI=uI,TI=fI,CI=dI,AI=hI;function oh(e,t){if(e==null)return{};var r={},n=Object.keys(e),i,o;for(o=0;o=0)&&(r[i]=e[i]);return r}var RI=["color"],OI=x.forwardRef(function(e,t){var r=e.color,n=r===void 0?"currentColor":r,i=oh(e,RI);return x.createElement("svg",Object.assign({width:"15",height:"15",viewBox:"0 0 15 15",fill:"none",xmlns:"http://www.w3.org/2000/svg"},i,{ref:t}),x.createElement("path",{d:"M11.4669 3.72684C11.7558 3.91574 11.8369 4.30308 11.648 4.59198L7.39799 11.092C7.29783 11.2452 7.13556 11.3467 6.95402 11.3699C6.77247 11.3931 6.58989 11.3355 6.45446 11.2124L3.70446 8.71241C3.44905 8.48022 3.43023 8.08494 3.66242 7.82953C3.89461 7.57412 4.28989 7.55529 4.5453 7.78749L6.75292 9.79441L10.6018 3.90792C10.7907 3.61902 11.178 3.53795 11.4669 3.72684Z",fill:n,fillRule:"evenodd",clipRule:"evenodd"}))}),FI=["color"],s0=x.forwardRef(function(e,t){var r=e.color,n=r===void 0?"currentColor":r,i=oh(e,FI);return x.createElement("svg",Object.assign({width:"15",height:"15",viewBox:"0 0 15 15",fill:"none",xmlns:"http://www.w3.org/2000/svg"},i,{ref:t}),x.createElement("path",{d:"M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z",fill:n,fillRule:"evenodd",clipRule:"evenodd"}))}),DI=["color"],PI=x.forwardRef(function(e,t){var r=e.color,n=r===void 0?"currentColor":r,i=oh(e,DI);return x.createElement("svg",Object.assign({width:"15",height:"15",viewBox:"0 0 15 15",fill:"none",xmlns:"http://www.w3.org/2000/svg"},i,{ref:t}),x.createElement("path",{d:"M3.13523 8.84197C3.3241 9.04343 3.64052 9.05363 3.84197 8.86477L7.5 5.43536L11.158 8.86477C11.3595 9.05363 11.6759 9.04343 11.8648 8.84197C12.0536 8.64051 12.0434 8.32409 11.842 8.13523L7.84197 4.38523C7.64964 4.20492 7.35036 4.20492 7.15803 4.38523L3.15803 8.13523C2.95657 8.32409 2.94637 8.64051 3.13523 8.84197Z",fill:n,fillRule:"evenodd",clipRule:"evenodd"}))});const Yi=({value:e,onChange:t,label:r="Select",placeholder:n="Select a fruit…",groups:i,labelType:o="col"})=>{const a=(i==null?void 0:i.length)===1;return Ce(gI,{value:e,onValueChange:t,children:[Ce(Vc,{className:Nt("flex gap-1",{"flex-row items-center gap-2":o==="row","flex-col":o==="col"}),children:[X(h1,{className:"whitespace-nowrap",children:r}),Ce(mI,{className:"justify-between bg-white text-black dark:text-white dark:bg-grey-900 whitespace-nowrap h-[36px] border-[1.5px] border-grey-700 rounded p-3 inline-flex items-center leading-none gap-[5px] shadow-[0_2px_10px] shadow-black/10 focus:shadow-[0_0_0_2px] focus:shadow-black data-[placeholder]:text-white outline-none","aria-label":r,children:[X(vI,{placeholder:n}),X(xI,{children:X(s0,{})})]})]}),X(wI,{children:Ce(yI,{className:"z-50 bg-white/80 dark:bg-grey-900/80 backdrop-filter backdrop-blur overflow-hidden border-[1.5px] border-grey-700 rounded p-3 shadow-[0px_10px_38px_-10px_rgba(22,_23,_24,_0.35),0px_10px_20px_-15px_rgba(22,_23,_24,_0.2)]",children:[X(CI,{className:"flex items-center justify-center h-[25px] cursor-default dark:text-white text-black",children:X(PI,{})}),X(EI,{className:"p-[5px]",children:a?X(Vc,{children:i[0].items.map(s=>X(p1,{value:s.value,disabled:s.disabled,children:s.label}))}):i.map((s,l)=>Ce(Vc,{children:[X(h1,{className:"text-xs leading-[25px]",children:s.label}),s.items.map(u=>X(p1,{value:u.value,disabled:u.disabled,children:u.label},u.value))]},s.label))}),X(AI,{className:"flex items-center justify-center h-[25px] cursor-default dark:text-white text-black",children:X(s0,{})})]})})]})},p1=x.forwardRef(({children:e,className:t,...r},n)=>Ce(_I,{className:Nt("text-[13px] leading-none rounded-[3px] flex items-center h-[25px] pr-[35px] pl-[25px] relative select-none data-[disabled]:text-grey-400 data-[disabled]:pointer-events-none data-[highlighted]:outline-none data-[highlighted]:bg-grey-600 data-[highlighted]:text-white text-black dark:text-white",t),...r,ref:n,children:[X(SI,{children:e}),X(TI,{className:"absolute left-0 w-[25px] inline-flex items-center justify-center",children:X(OI,{})})]})),D2="ToastProvider",[ah,II,bI]=Fu("Toast"),[P2,i$]=ln("Toast",[bI]),[kI,Nu]=P2(D2),I2=e=>{const{__scopeToast:t,label:r="Notification",duration:n=5e3,swipeDirection:i="right",swipeThreshold:o=50,children:a}=e,[s,l]=x.useState(null),[u,c]=x.useState(0),f=x.useRef(!1),d=x.useRef(!1);return x.createElement(ah.Provider,{scope:t},x.createElement(kI,{scope:t,label:r,duration:n,swipeDirection:i,swipeThreshold:o,toastCount:u,viewport:s,onViewportChange:l,onToastAdd:x.useCallback(()=>c(h=>h+1),[]),onToastRemove:x.useCallback(()=>c(h=>h-1),[]),isFocusedToastEscapeKeyDownRef:f,isClosePausedRef:d},a))};I2.propTypes={label(e){if(e.label&&typeof e.label=="string"&&!e.label.trim()){const t=`Invalid prop \`label\` supplied to \`${D2}\`. Expected non-empty \`string\`.`;return new Error(t)}return null}};const $I="ToastViewport",NI=["F8"],l0="toast.viewportPause",u0="toast.viewportResume",MI=x.forwardRef((e,t)=>{const{__scopeToast:r,hotkey:n=NI,label:i="Notifications ({hotkey})",...o}=e,a=Nu($I,r),s=II(r),l=x.useRef(null),u=x.useRef(null),c=x.useRef(null),f=x.useRef(null),d=Ve(t,f,a.onViewportChange),h=n.join("+").replace(/Key/g,"").replace(/Digit/g,""),m=a.toastCount>0;x.useEffect(()=>{const g=v=>{var w;n.every(E=>v[E]||v.code===E)&&((w=f.current)===null||w===void 0||w.focus())};return document.addEventListener("keydown",g),()=>document.removeEventListener("keydown",g)},[n]),x.useEffect(()=>{const g=l.current,v=f.current;if(m&&g&&v){const w=()=>{if(!a.isClosePausedRef.current){const k=new CustomEvent(l0);v.dispatchEvent(k),a.isClosePausedRef.current=!0}},y=()=>{if(a.isClosePausedRef.current){const k=new CustomEvent(u0);v.dispatchEvent(k),a.isClosePausedRef.current=!1}},E=k=>{!g.contains(k.relatedTarget)&&y()},b=()=>{g.contains(document.activeElement)||y()};return g.addEventListener("focusin",w),g.addEventListener("focusout",E),g.addEventListener("pointermove",w),g.addEventListener("pointerleave",b),window.addEventListener("blur",w),window.addEventListener("focus",y),()=>{g.removeEventListener("focusin",w),g.removeEventListener("focusout",E),g.removeEventListener("pointermove",w),g.removeEventListener("pointerleave",b),window.removeEventListener("blur",w),window.removeEventListener("focus",y)}}},[m,a.isClosePausedRef]);const p=x.useCallback(({tabbingDirection:g})=>{const w=s().map(y=>{const E=y.ref.current,b=[E,...e5(E)];return g==="forwards"?b:b.reverse()});return(g==="forwards"?w.reverse():w).flat()},[s]);return x.useEffect(()=>{const g=f.current;if(g){const v=w=>{const y=w.altKey||w.ctrlKey||w.metaKey;if(w.key==="Tab"&&!y){const C=document.activeElement,A=w.shiftKey;if(w.target===g&&A){var b;(b=u.current)===null||b===void 0||b.focus();return}const U=p({tabbingDirection:A?"backwards":"forwards"}),H=U.findIndex(G=>G===C);if(Wc(U.slice(H+1)))w.preventDefault();else{var k,S;A?(k=u.current)===null||k===void 0||k.focus():(S=c.current)===null||S===void 0||S.focus()}}};return g.addEventListener("keydown",v),()=>g.removeEventListener("keydown",v)}},[s,p]),x.createElement(sS,{ref:l,role:"region","aria-label":i.replace("{hotkey}",h),tabIndex:-1,style:{pointerEvents:m?void 0:"none"}},m&&x.createElement(g1,{ref:u,onFocusFromOutsideViewport:()=>{const g=p({tabbingDirection:"forwards"});Wc(g)}}),x.createElement(ah.Slot,{scope:r},x.createElement(Ie.ol,ge({tabIndex:-1},o,{ref:d}))),m&&x.createElement(g1,{ref:c,onFocusFromOutsideViewport:()=>{const g=p({tabbingDirection:"backwards"});Wc(g)}}))}),LI="ToastFocusProxy",g1=x.forwardRef((e,t)=>{const{__scopeToast:r,onFocusFromOutsideViewport:n,...i}=e,o=Nu(LI,r);return x.createElement(rh,ge({"aria-hidden":!0,tabIndex:0},i,{ref:t,style:{position:"fixed"},onFocus:a=>{var s;const l=a.relatedTarget;!((s=o.viewport)!==null&&s!==void 0&&s.contains(l))&&n()}}))}),Mu="Toast",BI="toast.swipeStart",UI="toast.swipeMove",HI="toast.swipeCancel",VI="toast.swipeEnd",WI=x.forwardRef((e,t)=>{const{forceMount:r,open:n,defaultOpen:i,onOpenChange:o,...a}=e,[s=!0,l]=vo({prop:n,defaultProp:i,onChange:o});return x.createElement(vi,{present:r||s},x.createElement(b2,ge({open:s},a,{ref:t,onClose:()=>l(!1),onPause:It(e.onPause),onResume:It(e.onResume),onSwipeStart:_e(e.onSwipeStart,u=>{u.currentTarget.setAttribute("data-swipe","start")}),onSwipeMove:_e(e.onSwipeMove,u=>{const{x:c,y:f}=u.detail.delta;u.currentTarget.setAttribute("data-swipe","move"),u.currentTarget.style.setProperty("--radix-toast-swipe-move-x",`${c}px`),u.currentTarget.style.setProperty("--radix-toast-swipe-move-y",`${f}px`)}),onSwipeCancel:_e(e.onSwipeCancel,u=>{u.currentTarget.setAttribute("data-swipe","cancel"),u.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),u.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),u.currentTarget.style.removeProperty("--radix-toast-swipe-end-x"),u.currentTarget.style.removeProperty("--radix-toast-swipe-end-y")}),onSwipeEnd:_e(e.onSwipeEnd,u=>{const{x:c,y:f}=u.detail.delta;u.currentTarget.setAttribute("data-swipe","end"),u.currentTarget.style.removeProperty("--radix-toast-swipe-move-x"),u.currentTarget.style.removeProperty("--radix-toast-swipe-move-y"),u.currentTarget.style.setProperty("--radix-toast-swipe-end-x",`${c}px`),u.currentTarget.style.setProperty("--radix-toast-swipe-end-y",`${f}px`),l(!1)})})))}),[zI,GI]=P2(Mu,{onClose(){}}),b2=x.forwardRef((e,t)=>{const{__scopeToast:r,type:n="foreground",duration:i,open:o,onClose:a,onEscapeKeyDown:s,onPause:l,onResume:u,onSwipeStart:c,onSwipeMove:f,onSwipeCancel:d,onSwipeEnd:h,...m}=e,p=Nu(Mu,r),[g,v]=x.useState(null),w=Ve(t,G=>v(G)),y=x.useRef(null),E=x.useRef(null),b=i||p.duration,k=x.useRef(0),S=x.useRef(b),C=x.useRef(0),{onToastAdd:A,onToastRemove:L}=p,B=It(()=>{var G;(g==null?void 0:g.contains(document.activeElement))&&((G=p.viewport)===null||G===void 0||G.focus()),a()}),U=x.useCallback(G=>{!G||G===1/0||(window.clearTimeout(C.current),k.current=new Date().getTime(),C.current=window.setTimeout(B,G))},[B]);x.useEffect(()=>{const G=p.viewport;if(G){const ee=()=>{U(S.current),u==null||u()},ae=()=>{const he=new Date().getTime()-k.current;S.current=S.current-he,window.clearTimeout(C.current),l==null||l()};return G.addEventListener(l0,ae),G.addEventListener(u0,ee),()=>{G.removeEventListener(l0,ae),G.removeEventListener(u0,ee)}}},[p.viewport,b,l,u,U]),x.useEffect(()=>{o&&!p.isClosePausedRef.current&&U(b)},[o,b,p.isClosePausedRef,U]),x.useEffect(()=>(A(),()=>L()),[A,L]);const H=x.useMemo(()=>g?N2(g):null,[g]);return p.viewport?x.createElement(x.Fragment,null,H&&x.createElement(jI,{__scopeToast:r,role:"status","aria-live":n==="foreground"?"assertive":"polite","aria-atomic":!0},H),x.createElement(zI,{scope:r,onClose:B},mi.createPortal(x.createElement(ah.ItemSlot,{scope:r},x.createElement(aS,{asChild:!0,onEscapeKeyDown:_e(s,()=>{p.isFocusedToastEscapeKeyDownRef.current||B(),p.isFocusedToastEscapeKeyDownRef.current=!1})},x.createElement(Ie.li,ge({role:"status","aria-live":"off","aria-atomic":!0,tabIndex:0,"data-state":o?"open":"closed","data-swipe-direction":p.swipeDirection},m,{ref:w,style:{userSelect:"none",touchAction:"none",...e.style},onKeyDown:_e(e.onKeyDown,G=>{G.key==="Escape"&&(s==null||s(G.nativeEvent),G.nativeEvent.defaultPrevented||(p.isFocusedToastEscapeKeyDownRef.current=!0,B()))}),onPointerDown:_e(e.onPointerDown,G=>{G.button===0&&(y.current={x:G.clientX,y:G.clientY})}),onPointerMove:_e(e.onPointerMove,G=>{if(!y.current)return;const ee=G.clientX-y.current.x,ae=G.clientY-y.current.y,he=!!E.current,Te=["left","right"].includes(p.swipeDirection),oe=["left","up"].includes(p.swipeDirection)?Math.min:Math.max,ye=Te?oe(0,ee):0,te=Te?0:oe(0,ae),O=G.pointerType==="touch"?10:2,M={x:ye,y:te},N={originalEvent:G,delta:M};he?(E.current=M,Gs(UI,f,N,{discrete:!1})):m1(M,p.swipeDirection,O)?(E.current=M,Gs(BI,c,N,{discrete:!1}),G.target.setPointerCapture(G.pointerId)):(Math.abs(ee)>O||Math.abs(ae)>O)&&(y.current=null)}),onPointerUp:_e(e.onPointerUp,G=>{const ee=E.current,ae=G.target;if(ae.hasPointerCapture(G.pointerId)&&ae.releasePointerCapture(G.pointerId),E.current=null,y.current=null,ee){const he=G.currentTarget,Te={originalEvent:G,delta:ee};m1(ee,p.swipeDirection,p.swipeThreshold)?Gs(VI,h,Te,{discrete:!0}):Gs(HI,d,Te,{discrete:!0}),he.addEventListener("click",oe=>oe.preventDefault(),{once:!0})}})})))),p.viewport))):null});b2.propTypes={type(e){if(e.type&&!["foreground","background"].includes(e.type)){const t=`Invalid prop \`type\` supplied to \`${Mu}\`. Expected \`foreground | background\`.`;return new Error(t)}return null}};const jI=e=>{const{__scopeToast:t,children:r,...n}=e,i=Nu(Mu,t),[o,a]=x.useState(!1),[s,l]=x.useState(!1);return ZI(()=>a(!0)),x.useEffect(()=>{const u=window.setTimeout(()=>l(!0),1e3);return()=>window.clearTimeout(u)},[]),s?null:x.createElement(xu,{asChild:!0},x.createElement(rh,n,o&&x.createElement(x.Fragment,null,i.label," ",r)))},XI=x.forwardRef((e,t)=>{const{__scopeToast:r,...n}=e;return x.createElement(Ie.div,ge({},n,{ref:t}))}),KI=x.forwardRef((e,t)=>{const{__scopeToast:r,...n}=e;return x.createElement(Ie.div,ge({},n,{ref:t}))}),YI="ToastAction",qI=x.forwardRef((e,t)=>{const{altText:r,...n}=e;return r?x.createElement($2,{altText:r,asChild:!0},x.createElement(k2,ge({},n,{ref:t}))):null});qI.propTypes={altText(e){return e.altText?null:new Error(`Missing prop \`altText\` expected on \`${YI}\``)}};const QI="ToastClose",k2=x.forwardRef((e,t)=>{const{__scopeToast:r,...n}=e,i=GI(QI,r);return x.createElement($2,{asChild:!0},x.createElement(Ie.button,ge({type:"button"},n,{ref:t,onClick:_e(e.onClick,i.onClose)})))}),$2=x.forwardRef((e,t)=>{const{__scopeToast:r,altText:n,...i}=e;return x.createElement(Ie.div,ge({"data-radix-toast-announce-exclude":"","data-radix-toast-announce-alt":n||void 0},i,{ref:t}))});function N2(e){const t=[];return Array.from(e.childNodes).forEach(n=>{if(n.nodeType===n.TEXT_NODE&&n.textContent&&t.push(n.textContent),JI(n)){const i=n.ariaHidden||n.hidden||n.style.display==="none",o=n.dataset.radixToastAnnounceExclude==="";if(!i)if(o){const a=n.dataset.radixToastAnnounceAlt;a&&t.push(a)}else t.push(...N2(n))}}),t}function Gs(e,t,r,{discrete:n}){const i=r.originalEvent.currentTarget,o=new CustomEvent(e,{bubbles:!0,cancelable:!0,detail:r});t&&i.addEventListener(e,t,{once:!0}),n?wd(i,o):i.dispatchEvent(o)}const m1=(e,t,r=0)=>{const n=Math.abs(e.x),i=Math.abs(e.y),o=n>i;return t==="left"||t==="right"?o&&n>r:!o&&i>r};function ZI(e=()=>{}){const t=It(e);Bt(()=>{let r=0,n=0;return r=window.requestAnimationFrame(()=>n=window.requestAnimationFrame(t)),()=>{window.cancelAnimationFrame(r),window.cancelAnimationFrame(n)}},[t])}function JI(e){return e.nodeType===e.ELEMENT_NODE}function e5(e){const t=[],r=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:n=>{const i=n.tagName==="INPUT"&&n.type==="hidden";return n.disabled||n.hidden||i?NodeFilter.FILTER_SKIP:n.tabIndex>=0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;r.nextNode();)t.push(r.currentNode);return t}function Wc(e){const t=document.activeElement;return e.some(r=>r===t?!0:(r.focus(),document.activeElement!==t))}const t5=I2,r5=MI,n5=WI,i5=XI,o5=KI,a5=k2,s5=({title:e,titleId:t,...r})=>Ce("svg",{viewBox:"0 0 18 18",width:18,height:18,fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-labelledby":t,...r,children:[e?X("title",{id:t,children:e}):null,X("path",{d:"M9 16.5a7.5 7.5 0 1 0 0-15 7.5 7.5 0 0 0 0 15ZM11.25 6.75l-4.5 4.5M6.75 6.75l4.5 4.5",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"})]}),l5=({title:e,titleId:t,...r})=>Ce("svg",{viewBox:"0 0 24 24",width:24,height:24,fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-labelledby":t,...r,children:[e?X("title",{id:t,children:e}):null,X("path",{d:"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10ZM12 16v-4M12 8h.01",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"})]}),u5=({title:e,titleId:t,...r})=>Ce("svg",{width:18,height:18,viewBox:"0 0 18 18",fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-labelledby":t,...r,children:[e?X("title",{id:t,children:e}):null,X("path",{d:"M16.5 8.31V9a7.5 7.5 0 1 1-4.447-6.855",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"}),X("path",{d:"M16.5 3 9 10.508l-2.25-2.25",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"})]}),c5=({title:e,titleId:t,...r})=>Ce("svg",{viewBox:"0 0 18 18",width:18,height:18,fill:"none",xmlns:"http://www.w3.org/2000/svg","aria-labelledby":t,...r,children:[e?X("title",{id:t,children:e}):null,X("path",{d:"M7.718 2.895 1.366 13.5a1.5 1.5 0 0 0 1.282 2.25h12.705a1.5 1.5 0 0 0 1.283-2.25L10.283 2.895a1.5 1.5 0 0 0-2.565 0v0ZM9 6.75v3M9 12.75h.008",stroke:"currentColor",strokeWidth:1.5,strokeLinecap:"round",strokeLinejoin:"round"})]}),f5=({toast:e,open:t,setOpen:r})=>Ce(t5,{children:[Ce(n5,{open:t,onOpenChange:n=>{e.preventClose||r(n)},className:Nt("z-50 fixed bottom-4 md:left-1/2 md:-translate-x-[50%] inset-x-4 w-auto shadow-lg md:max-w-[658px] duration-300","radix-state-open:animate-fade-in","radix-state-closed:animate-toast-hide","radix-swipe-end:animate-toast-swipe-out","translate-x-radix-toast-swipe-move-x","radix-swipe-cancel:translate-x-0 radix-swipe-cancel:duration-200 radix-swipe-cancel:ease-[ease]","px-[40px] md:px-[58px] py-6 flex flex-col border rounded-[4px]",{"bg-green-100 text-green-600 border-green-600":e.status==="success","bg-red-200 text-red-600 border-red-600":e.status==="error","bg-blue-100 text-blue-700 border-blue-600":e.status==="info","bg-orange-200 text-orange-600 border-orange-600":e.status==="warning"},{"h-[72px]":!e.description}),children:[e.status==="success"?X(u5,{className:"absolute left-[8px] md:left-[25px] top-[25px]"}):e.status==="warning"?X(c5,{className:"absolute left-[8px] md:left-[25px] top-[25px]"}):e.status==="error"?X(s5,{className:"absolute left-[8px] md:left-[25px] top-[25px]"}):X(l5,{className:"absolute left-[8px] md:left-[25px] top-[25px]"}),X(i5,{className:"text-grey-900 font-bold text-sm",children:e.title}),e.description&&X(o5,{className:"mt-2 text-[10px] md:text-xs text-grey-800",children:e.description}),X(a5,{className:"absolute top-7 right-5 md:right-7",children:X(ql,{className:"w-4 h-4 text-grey-900"})})]}),X(r5,{})]}),zc="rovingFocusGroup.onEntryFocus",d5={bubbles:!1,cancelable:!0},sh="RovingFocusGroup",[c0,M2,h5]=Fu(sh),[p5,L2]=ln(sh,[h5]),[g5,m5]=p5(sh),v5=x.forwardRef((e,t)=>x.createElement(c0.Provider,{scope:e.__scopeRovingFocusGroup},x.createElement(c0.Slot,{scope:e.__scopeRovingFocusGroup},x.createElement(x5,ge({},e,{ref:t}))))),x5=x.forwardRef((e,t)=>{const{__scopeRovingFocusGroup:r,orientation:n,loop:i=!1,dir:o,currentTabStopId:a,defaultCurrentTabStopId:s,onCurrentTabStopIdChange:l,onEntryFocus:u,...c}=e,f=x.useRef(null),d=Ve(t,f),h=Zd(o),[m=null,p]=vo({prop:a,defaultProp:s,onChange:l}),[g,v]=x.useState(!1),w=It(u),y=M2(r),E=x.useRef(!1),[b,k]=x.useState(0);return x.useEffect(()=>{const S=f.current;if(S)return S.addEventListener(zc,w),()=>S.removeEventListener(zc,w)},[w]),x.createElement(g5,{scope:r,orientation:n,dir:h,loop:i,currentTabStopId:m,onItemFocus:x.useCallback(S=>p(S),[p]),onItemShiftTab:x.useCallback(()=>v(!0),[]),onFocusableItemAdd:x.useCallback(()=>k(S=>S+1),[]),onFocusableItemRemove:x.useCallback(()=>k(S=>S-1),[])},x.createElement(Ie.div,ge({tabIndex:g||b===0?-1:0,"data-orientation":n},c,{ref:d,style:{outline:"none",...e.style},onMouseDown:_e(e.onMouseDown,()=>{E.current=!0}),onFocus:_e(e.onFocus,S=>{const C=!E.current;if(S.target===S.currentTarget&&C&&!g){const A=new CustomEvent(zc,d5);if(S.currentTarget.dispatchEvent(A),!A.defaultPrevented){const L=y().filter(ee=>ee.focusable),B=L.find(ee=>ee.active),U=L.find(ee=>ee.id===m),G=[B,U,...L].filter(Boolean).map(ee=>ee.ref.current);B2(G)}}E.current=!1}),onBlur:_e(e.onBlur,()=>v(!1))})))}),w5="RovingFocusGroupItem",y5=x.forwardRef((e,t)=>{const{__scopeRovingFocusGroup:r,focusable:n=!0,active:i=!1,tabStopId:o,...a}=e,s=Yr(),l=o||s,u=m5(w5,r),c=u.currentTabStopId===l,f=M2(r),{onFocusableItemAdd:d,onFocusableItemRemove:h}=u;return x.useEffect(()=>{if(n)return d(),()=>h()},[n,d,h]),x.createElement(c0.ItemSlot,{scope:r,id:l,focusable:n,active:i},x.createElement(Ie.span,ge({tabIndex:c?0:-1,"data-orientation":u.orientation},a,{ref:t,onMouseDown:_e(e.onMouseDown,m=>{n?u.onItemFocus(l):m.preventDefault()}),onFocus:_e(e.onFocus,()=>u.onItemFocus(l)),onKeyDown:_e(e.onKeyDown,m=>{if(m.key==="Tab"&&m.shiftKey){u.onItemShiftTab();return}if(m.target!==m.currentTarget)return;const p=S5(m,u.orientation,u.dir);if(p!==void 0){m.preventDefault();let v=f().filter(w=>w.focusable).map(w=>w.ref.current);if(p==="last")v.reverse();else if(p==="prev"||p==="next"){p==="prev"&&v.reverse();const w=v.indexOf(m.currentTarget);v=u.loop?T5(v,w+1):v.slice(w+1)}setTimeout(()=>B2(v))}})})))}),E5={ArrowLeft:"prev",ArrowUp:"prev",ArrowRight:"next",ArrowDown:"next",PageUp:"first",Home:"first",PageDown:"last",End:"last"};function _5(e,t){return t!=="rtl"?e:e==="ArrowLeft"?"ArrowRight":e==="ArrowRight"?"ArrowLeft":e}function S5(e,t,r){const n=_5(e.key,r);if(!(t==="vertical"&&["ArrowLeft","ArrowRight"].includes(n))&&!(t==="horizontal"&&["ArrowUp","ArrowDown"].includes(n)))return E5[n]}function B2(e){const t=document.activeElement;for(const r of e)if(r===t||(r.focus(),document.activeElement!==t))return}function T5(e,t){return e.map((r,n)=>e[(t+n)%e.length])}const C5=v5,A5=y5,R5=["Enter"," "],O5=["ArrowDown","PageUp","Home"],U2=["ArrowUp","PageDown","End"],F5=[...O5,...U2],Lu="Menu",[f0,D5,P5]=Fu(Lu),[Ri,Bu]=ln(Lu,[P5,Iu,L2]),lh=Iu(),H2=L2(),[I5,cs]=Ri(Lu),[b5,uh]=Ri(Lu),k5=e=>{const{__scopeMenu:t,open:r=!1,children:n,dir:i,onOpenChange:o,modal:a=!0}=e,s=lh(t),[l,u]=x.useState(null),c=x.useRef(!1),f=It(o),d=Zd(i);return x.useEffect(()=>{const h=()=>{c.current=!0,document.addEventListener("pointerdown",m,{capture:!0,once:!0}),document.addEventListener("pointermove",m,{capture:!0,once:!0})},m=()=>c.current=!1;return document.addEventListener("keydown",h,{capture:!0}),()=>{document.removeEventListener("keydown",h,{capture:!0}),document.removeEventListener("pointerdown",m,{capture:!0}),document.removeEventListener("pointermove",m,{capture:!0})}},[]),x.createElement(E2,s,x.createElement(I5,{scope:t,open:r,onOpenChange:f,content:l,onContentChange:u},x.createElement(b5,{scope:t,onClose:x.useCallback(()=>f(!1),[f]),isUsingKeyboardRef:c,dir:d,modal:a},n)))},$5=x.forwardRef((e,t)=>{const{__scopeMenu:r,...n}=e,i=lh(r);return x.createElement(_2,ge({},i,n,{ref:t}))}),V2="MenuPortal",[N5,M5]=Ri(V2,{forceMount:void 0}),L5=e=>{const{__scopeMenu:t,forceMount:r,children:n,container:i}=e,o=cs(V2,t);return x.createElement(N5,{scope:t,forceMount:r},x.createElement(vi,{present:r||o.open},x.createElement(xu,{asChild:!0,container:i},n)))},Fn="MenuContent",[B5,W2]=Ri(Fn),U5=x.forwardRef((e,t)=>{const r=M5(Fn,e.__scopeMenu),{forceMount:n=r.forceMount,...i}=e,o=cs(Fn,e.__scopeMenu),a=uh(Fn,e.__scopeMenu);return x.createElement(f0.Provider,{scope:e.__scopeMenu},x.createElement(vi,{present:n||o.open},x.createElement(f0.Slot,{scope:e.__scopeMenu},a.modal?x.createElement(H5,ge({},i,{ref:t})):x.createElement(V5,ge({},i,{ref:t})))))}),H5=x.forwardRef((e,t)=>{const r=cs(Fn,e.__scopeMenu),n=x.useRef(null),i=Ve(t,n);return x.useEffect(()=>{const o=n.current;if(o)return Sd(o)},[]),x.createElement(z2,ge({},e,{ref:i,trapFocus:r.open,disableOutsidePointerEvents:r.open,disableOutsideScroll:!0,onFocusOutside:_e(e.onFocusOutside,o=>o.preventDefault(),{checkForDefaultPrevented:!1}),onDismiss:()=>r.onOpenChange(!1)}))}),V5=x.forwardRef((e,t)=>{const r=cs(Fn,e.__scopeMenu);return x.createElement(z2,ge({},e,{ref:t,trapFocus:!1,disableOutsidePointerEvents:!1,disableOutsideScroll:!1,onDismiss:()=>r.onOpenChange(!1)}))}),z2=x.forwardRef((e,t)=>{const{__scopeMenu:r,loop:n=!1,trapFocus:i,onOpenAutoFocus:o,onCloseAutoFocus:a,disableOutsidePointerEvents:s,onEntryFocus:l,onEscapeKeyDown:u,onPointerDownOutside:c,onFocusOutside:f,onInteractOutside:d,onDismiss:h,disableOutsideScroll:m,...p}=e,g=cs(Fn,r),v=uh(Fn,r),w=lh(r),y=H2(r),E=D5(r),[b,k]=x.useState(null),S=x.useRef(null),C=Ve(t,S,g.onContentChange),A=x.useRef(0),L=x.useRef(""),B=x.useRef(0),U=x.useRef(null),H=x.useRef("right"),G=x.useRef(0),ee=m?_d:x.Fragment,ae=m?{as:ai,allowPinchZoom:!0}:void 0,he=oe=>{var ye,te;const O=L.current+oe,M=E().filter(W=>!W.disabled),N=document.activeElement,F=(ye=M.find(W=>W.ref.current===N))===null||ye===void 0?void 0:ye.textValue,V=M.map(W=>W.textValue),Y=J5(V,O,F),J=(te=M.find(W=>W.textValue===Y))===null||te===void 0?void 0:te.ref.current;(function W(Q){L.current=Q,window.clearTimeout(A.current),Q!==""&&(A.current=window.setTimeout(()=>W(""),1e3))})(O),J&&setTimeout(()=>J.focus())};x.useEffect(()=>()=>window.clearTimeout(A.current),[]),Ed();const Te=x.useCallback(oe=>{var ye,te;return H.current===((ye=U.current)===null||ye===void 0?void 0:ye.side)&&tb(oe,(te=U.current)===null||te===void 0?void 0:te.area)},[]);return x.createElement(B5,{scope:r,searchRef:L,onItemEnter:x.useCallback(oe=>{Te(oe)&&oe.preventDefault()},[Te]),onItemLeave:x.useCallback(oe=>{var ye;Te(oe)||((ye=S.current)===null||ye===void 0||ye.focus(),k(null))},[Te]),onTriggerLeave:x.useCallback(oe=>{Te(oe)&&oe.preventDefault()},[Te]),pointerGraceTimerRef:B,onPointerGraceIntentChange:x.useCallback(oe=>{U.current=oe},[])},x.createElement(ee,ae,x.createElement(yd,{asChild:!0,trapped:i,onMountAutoFocus:_e(o,oe=>{var ye;oe.preventDefault(),(ye=S.current)===null||ye===void 0||ye.focus()}),onUnmountAutoFocus:a},x.createElement(vu,{asChild:!0,disableOutsidePointerEvents:s,onEscapeKeyDown:u,onPointerDownOutside:c,onFocusOutside:f,onInteractOutside:d,onDismiss:h},x.createElement(C5,ge({asChild:!0},y,{dir:v.dir,orientation:"vertical",loop:n,currentTabStopId:b,onCurrentTabStopIdChange:k,onEntryFocus:_e(l,oe=>{v.isUsingKeyboardRef.current||oe.preventDefault()})}),x.createElement(S2,ge({role:"menu","aria-orientation":"vertical","data-state":q5(g.open),"data-radix-menu-content":"",dir:v.dir},w,p,{ref:C,style:{outline:"none",...p.style},onKeyDown:_e(p.onKeyDown,oe=>{const te=oe.target.closest("[data-radix-menu-content]")===oe.currentTarget,O=oe.ctrlKey||oe.altKey||oe.metaKey,M=oe.key.length===1;te&&(oe.key==="Tab"&&oe.preventDefault(),!O&&M&&he(oe.key));const N=S.current;if(oe.target!==N||!F5.includes(oe.key))return;oe.preventDefault();const V=E().filter(Y=>!Y.disabled).map(Y=>Y.ref.current);U2.includes(oe.key)&&V.reverse(),Q5(V)}),onBlur:_e(e.onBlur,oe=>{oe.currentTarget.contains(oe.target)||(window.clearTimeout(A.current),L.current="")}),onPointerMove:_e(e.onPointerMove,h0(oe=>{const ye=oe.target,te=G.current!==oe.clientX;if(oe.currentTarget.contains(ye)&&te){const O=oe.clientX>G.current?"right":"left";H.current=O,G.current=oe.clientX}}))})))))))}),W5=x.forwardRef((e,t)=>{const{__scopeMenu:r,...n}=e;return x.createElement(Ie.div,ge({role:"group"},n,{ref:t}))}),z5=x.forwardRef((e,t)=>{const{__scopeMenu:r,...n}=e;return x.createElement(Ie.div,ge({},n,{ref:t}))}),d0="MenuItem",v1="menu.itemSelect",G5=x.forwardRef((e,t)=>{const{disabled:r=!1,onSelect:n,...i}=e,o=x.useRef(null),a=uh(d0,e.__scopeMenu),s=W2(d0,e.__scopeMenu),l=Ve(t,o),u=x.useRef(!1),c=()=>{const f=o.current;if(!r&&f){const d=new CustomEvent(v1,{bubbles:!0,cancelable:!0});f.addEventListener(v1,h=>n==null?void 0:n(h),{once:!0}),wd(f,d),d.defaultPrevented?u.current=!1:a.onClose()}};return x.createElement(j5,ge({},i,{ref:l,disabled:r,onClick:_e(e.onClick,c),onPointerDown:f=>{var d;(d=e.onPointerDown)===null||d===void 0||d.call(e,f),u.current=!0},onPointerUp:_e(e.onPointerUp,f=>{var d;u.current||(d=f.currentTarget)===null||d===void 0||d.click()}),onKeyDown:_e(e.onKeyDown,f=>{const d=s.searchRef.current!=="";r||d&&f.key===" "||R5.includes(f.key)&&(f.currentTarget.click(),f.preventDefault())})}))}),j5=x.forwardRef((e,t)=>{const{__scopeMenu:r,disabled:n=!1,textValue:i,...o}=e,a=W2(d0,r),s=H2(r),l=x.useRef(null),u=Ve(t,l),[c,f]=x.useState(!1),[d,h]=x.useState("");return x.useEffect(()=>{const m=l.current;if(m){var p;h(((p=m.textContent)!==null&&p!==void 0?p:"").trim())}},[o.children]),x.createElement(f0.ItemSlot,{scope:r,disabled:n,textValue:i??d},x.createElement(A5,ge({asChild:!0},s,{focusable:!n}),x.createElement(Ie.div,ge({role:"menuitem","data-highlighted":c?"":void 0,"aria-disabled":n||void 0,"data-disabled":n?"":void 0},o,{ref:u,onPointerMove:_e(e.onPointerMove,h0(m=>{n?a.onItemLeave(m):(a.onItemEnter(m),m.defaultPrevented||m.currentTarget.focus())})),onPointerLeave:_e(e.onPointerLeave,h0(m=>a.onItemLeave(m))),onFocus:_e(e.onFocus,()=>f(!0)),onBlur:_e(e.onBlur,()=>f(!1))}))))}),X5="MenuRadioGroup";Ri(X5,{value:void 0,onValueChange:()=>{}});const K5="MenuItemIndicator";Ri(K5,{checked:!1});const Y5="MenuSub";Ri(Y5);function q5(e){return e?"open":"closed"}function Q5(e){const t=document.activeElement;for(const r of e)if(r===t||(r.focus(),document.activeElement!==t))return}function Z5(e,t){return e.map((r,n)=>e[(t+n)%e.length])}function J5(e,t,r){const i=t.length>1&&Array.from(t).every(u=>u===t[0])?t[0]:t,o=r?e.indexOf(r):-1;let a=Z5(e,Math.max(o,0));i.length===1&&(a=a.filter(u=>u!==r));const l=a.find(u=>u.toLowerCase().startsWith(i.toLowerCase()));return l!==r?l:void 0}function eb(e,t){const{x:r,y:n}=e;let i=!1;for(let o=0,a=t.length-1;on!=c>n&&r<(u-s)*(n-l)/(c-l)+s&&(i=!i)}return i}function tb(e,t){if(!t)return!1;const r={x:e.clientX,y:e.clientY};return eb(r,t)}function h0(e){return t=>t.pointerType==="mouse"?e(t):void 0}const G2=k5,j2=$5,X2=L5,K2=U5,rb=W5,nb=z5,ib=G5,Y2="ContextMenu",[ob,o$]=ln(Y2,[Bu]),Uu=Bu(),[ab,q2]=ob(Y2),sb=e=>{const{__scopeContextMenu:t,children:r,onOpenChange:n,dir:i,modal:o=!0}=e,[a,s]=x.useState(!1),l=Uu(t),u=It(n),c=x.useCallback(f=>{s(f),u(f)},[u]);return x.createElement(ab,{scope:t,open:a,onOpenChange:c,modal:o},x.createElement(G2,ge({},l,{dir:i,open:a,onOpenChange:c,modal:o}),r))},lb="ContextMenuTrigger",ub=x.forwardRef((e,t)=>{const{__scopeContextMenu:r,disabled:n=!1,...i}=e,o=q2(lb,r),a=Uu(r),s=x.useRef({x:0,y:0}),l=x.useRef({getBoundingClientRect:()=>DOMRect.fromRect({width:0,height:0,...s.current})}),u=x.useRef(0),c=x.useCallback(()=>window.clearTimeout(u.current),[]),f=d=>{s.current={x:d.clientX,y:d.clientY},o.onOpenChange(!0)};return x.useEffect(()=>c,[c]),x.useEffect(()=>void(n&&c()),[n,c]),x.createElement(x.Fragment,null,x.createElement(j2,ge({},a,{virtualRef:l})),x.createElement(Ie.span,ge({"data-state":o.open?"open":"closed","data-disabled":n?"":void 0},i,{ref:t,style:{WebkitTouchCallout:"none",...e.style},onContextMenu:n?e.onContextMenu:_e(e.onContextMenu,d=>{c(),f(d),d.preventDefault()}),onPointerDown:n?e.onPointerDown:_e(e.onPointerDown,js(d=>{c(),u.current=window.setTimeout(()=>f(d),700)})),onPointerMove:n?e.onPointerMove:_e(e.onPointerMove,js(c)),onPointerCancel:n?e.onPointerCancel:_e(e.onPointerCancel,js(c)),onPointerUp:n?e.onPointerUp:_e(e.onPointerUp,js(c))})))}),cb=e=>{const{__scopeContextMenu:t,...r}=e,n=Uu(t);return x.createElement(X2,ge({},n,r))},fb="ContextMenuContent",db=x.forwardRef((e,t)=>{const{__scopeContextMenu:r,...n}=e,i=q2(fb,r),o=Uu(r),a=x.useRef(!1);return x.createElement(K2,ge({},o,n,{ref:t,side:"right",sideOffset:2,align:"start",onCloseAutoFocus:s=>{var l;(l=e.onCloseAutoFocus)===null||l===void 0||l.call(e,s),!s.defaultPrevented&&a.current&&s.preventDefault(),a.current=!1},onInteractOutside:s=>{var l;(l=e.onInteractOutside)===null||l===void 0||l.call(e,s),!s.defaultPrevented&&!i.modal&&(a.current=!0)},style:{...e.style,"--radix-context-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-context-menu-content-available-width":"var(--radix-popper-available-width)","--radix-context-menu-content-available-height":"var(--radix-popper-available-height)","--radix-context-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-context-menu-trigger-height":"var(--radix-popper-anchor-height)"}}))});function js(e){return t=>t.pointerType!=="mouse"?e(t):void 0}const hb=sb,pb=ub,gb=cb,mb=db,Q2=x.createContext({dragDropManager:void 0});function nr(e){return"Minified Redux error #"+e+"; visit https://redux.js.org/Errors?code="+e+" for the full message or use the non-minified dev environment for full errors. "}var x1=function(){return typeof Symbol=="function"&&Symbol.observable||"@@observable"}(),Gc=function(){return Math.random().toString(36).substring(7).split("").join(".")},w1={INIT:"@@redux/INIT"+Gc(),REPLACE:"@@redux/REPLACE"+Gc(),PROBE_UNKNOWN_ACTION:function(){return"@@redux/PROBE_UNKNOWN_ACTION"+Gc()}};function vb(e){if(typeof e!="object"||e===null)return!1;for(var t=e;Object.getPrototypeOf(t)!==null;)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t}function Z2(e,t,r){var n;if(typeof t=="function"&&typeof r=="function"||typeof r=="function"&&typeof arguments[3]=="function")throw new Error(nr(0));if(typeof t=="function"&&typeof r>"u"&&(r=t,t=void 0),typeof r<"u"){if(typeof r!="function")throw new Error(nr(1));return r(Z2)(e,t)}if(typeof e!="function")throw new Error(nr(2));var i=e,o=t,a=[],s=a,l=!1;function u(){s===a&&(s=a.slice())}function c(){if(l)throw new Error(nr(3));return o}function f(p){if(typeof p!="function")throw new Error(nr(4));if(l)throw new Error(nr(5));var g=!0;return u(),s.push(p),function(){if(g){if(l)throw new Error(nr(6));g=!1,u();var w=s.indexOf(p);s.splice(w,1),a=null}}}function d(p){if(!vb(p))throw new Error(nr(7));if(typeof p.type>"u")throw new Error(nr(8));if(l)throw new Error(nr(9));try{l=!0,o=i(o,p)}finally{l=!1}for(var g=a=s,v=0;vn&&n[i]?n[i]:r||null,e)}function yb(e,t){return e.filter(r=>r!==t)}function J2(e){return typeof e=="object"}function Eb(e,t){const r=new Map,n=o=>{r.set(o,r.has(o)?r.get(o)+1:1)};e.forEach(n),t.forEach(n);const i=[];return r.forEach((o,a)=>{o===1&&i.push(a)}),i}function _b(e,t){return e.filter(r=>t.indexOf(r)>-1)}const ch="dnd-core/INIT_COORDS",Hu="dnd-core/BEGIN_DRAG",fh="dnd-core/PUBLISH_DRAG_SOURCE",Vu="dnd-core/HOVER",Wu="dnd-core/DROP",zu="dnd-core/END_DRAG";function y1(e,t){return{type:ch,payload:{sourceClientOffset:t||null,clientOffset:e||null}}}const Sb={type:ch,payload:{clientOffset:null,sourceClientOffset:null}};function Tb(e){return function(r=[],n={publishSource:!0}){const{publishSource:i=!0,clientOffset:o,getSourceClientOffset:a}=n,s=e.getMonitor(),l=e.getRegistry();e.dispatch(y1(o)),Cb(r,s,l);const u=Ob(r,s);if(u==null){e.dispatch(Sb);return}let c=null;if(o){if(!a)throw new Error("getSourceClientOffset must be defined");Ab(a),c=a(u)}e.dispatch(y1(o,c));const d=l.getSource(u).beginDrag(s,u);if(d==null)return;Rb(d),l.pinSource(u);const h=l.getSourceType(u);return{type:Hu,payload:{itemType:h,item:d,sourceId:u,clientOffset:o||null,sourceClientOffset:c||null,isSourcePublic:!!i}}}}function Cb(e,t,r){Fe(!t.isDragging(),"Cannot call beginDrag while dragging."),e.forEach(function(n){Fe(r.getSource(n),"Expected sourceIds to be registered.")})}function Ab(e){Fe(typeof e=="function","When clientOffset is provided, getSourceClientOffset must be a function.")}function Rb(e){Fe(J2(e),"Item must be an object.")}function Ob(e,t){let r=null;for(let n=e.length-1;n>=0;n--)if(t.canDragSource(e[n])){r=e[n];break}return r}function Fb(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function Db(e){for(var t=1;t{const l=bb(a,s,i,n),u={type:Wu,payload:{dropResult:Db({},r,l)}};e.dispatch(u)})}}function Ib(e){Fe(e.isDragging(),"Cannot call drop while not dragging."),Fe(!e.didDrop(),"Cannot call drop twice during one drag operation.")}function bb(e,t,r,n){const i=r.getTarget(e);let o=i?i.drop(n,e):void 0;return kb(o),typeof o>"u"&&(o=t===0?{}:n.getDropResult()),o}function kb(e){Fe(typeof e>"u"||J2(e),"Drop result must either be an object or undefined.")}function $b(e){const t=e.getTargetIds().filter(e.canDropOnTarget,e);return t.reverse(),t}function Nb(e){return function(){const r=e.getMonitor(),n=e.getRegistry();Mb(r);const i=r.getSourceId();return i!=null&&(n.getSource(i,!0).endDrag(r,i),n.unpinSource()),{type:zu}}}function Mb(e){Fe(e.isDragging(),"Cannot call endDrag while not dragging.")}function p0(e,t){return t===null?e===null:Array.isArray(e)?e.some(r=>r===t):e===t}function Lb(e){return function(r,{clientOffset:n}={}){Bb(r);const i=r.slice(0),o=e.getMonitor(),a=e.getRegistry(),s=o.getItemType();return Hb(i,a,s),Ub(i,o,a),Vb(i,o,a),{type:Vu,payload:{targetIds:i,clientOffset:n||null}}}}function Bb(e){Fe(Array.isArray(e),"Expected targetIds to be an array.")}function Ub(e,t,r){Fe(t.isDragging(),"Cannot call hover while not dragging."),Fe(!t.didDrop(),"Cannot call hover after drop.");for(let n=0;n=0;n--){const i=e[n],o=t.getTargetType(i);p0(o,r)||e.splice(n,1)}}function Vb(e,t,r){e.forEach(function(n){r.getTarget(n).hover(t,n)})}function Wb(e){return function(){if(e.getMonitor().isDragging())return{type:fh}}}function zb(e){return{beginDrag:Tb(e),publishDragSource:Wb(e),hover:Lb(e),drop:Pb(e),endDrag:Nb(e)}}class Gb{receiveBackend(t){this.backend=t}getMonitor(){return this.monitor}getBackend(){return this.backend}getRegistry(){return this.monitor.registry}getActions(){const t=this,{dispatch:r}=this.store;function n(o){return(...a)=>{const s=o.apply(t,a);typeof s<"u"&&r(s)}}const i=zb(this);return Object.keys(i).reduce((o,a)=>{const s=i[a];return o[a]=n(s),o},{})}dispatch(t){this.store.dispatch(t)}constructor(t,r){this.isSetUp=!1,this.handleRefCountChange=()=>{const n=this.store.getState().refCount>0;this.backend&&(n&&!this.isSetUp?(this.backend.setup(),this.isSetUp=!0):!n&&this.isSetUp&&(this.backend.teardown(),this.isSetUp=!1))},this.store=t,this.monitor=r,t.subscribe(this.handleRefCountChange)}}function jb(e,t){return{x:e.x+t.x,y:e.y+t.y}}function ey(e,t){return{x:e.x-t.x,y:e.y-t.y}}function Xb(e){const{clientOffset:t,initialClientOffset:r,initialSourceClientOffset:n}=e;return!t||!r||!n?null:ey(jb(t,n),r)}function Kb(e){const{clientOffset:t,initialClientOffset:r}=e;return!t||!r?null:ey(t,r)}const Ca=[],dh=[];Ca.__IS_NONE__=!0;dh.__IS_ALL__=!0;function Yb(e,t){return e===Ca?!1:e===dh||typeof t>"u"?!0:_b(t,e).length>0}class qb{subscribeToStateChange(t,r={}){const{handlerIds:n}=r;Fe(typeof t=="function","listener must be a function."),Fe(typeof n>"u"||Array.isArray(n),"handlerIds, when specified, must be an array of strings.");let i=this.store.getState().stateId;const o=()=>{const a=this.store.getState(),s=a.stateId;try{s===i||s===i+1&&!Yb(a.dirtyHandlerIds,n)||t()}finally{i=s}};return this.store.subscribe(o)}subscribeToOffsetChange(t){Fe(typeof t=="function","listener must be a function.");let r=this.store.getState().dragOffset;const n=()=>{const i=this.store.getState().dragOffset;i!==r&&(r=i,t())};return this.store.subscribe(n)}canDragSource(t){if(!t)return!1;const r=this.registry.getSource(t);return Fe(r,`Expected to find a valid source. sourceId=${t}`),this.isDragging()?!1:r.canDrag(this,t)}canDropOnTarget(t){if(!t)return!1;const r=this.registry.getTarget(t);if(Fe(r,`Expected to find a valid target. targetId=${t}`),!this.isDragging()||this.didDrop())return!1;const n=this.registry.getTargetType(t),i=this.getItemType();return p0(n,i)&&r.canDrop(this,t)}isDragging(){return!!this.getItemType()}isDraggingSource(t){if(!t)return!1;const r=this.registry.getSource(t,!0);if(Fe(r,`Expected to find a valid source. sourceId=${t}`),!this.isDragging()||!this.isSourcePublic())return!1;const n=this.registry.getSourceType(t),i=this.getItemType();return n!==i?!1:r.isDragging(this,t)}isOverTarget(t,r={shallow:!1}){if(!t)return!1;const{shallow:n}=r;if(!this.isDragging())return!1;const i=this.registry.getTargetType(t),o=this.getItemType();if(o&&!p0(i,o))return!1;const a=this.getTargetIds();if(!a.length)return!1;const s=a.indexOf(t);return n?s===a.length-1:s>-1}getItemType(){return this.store.getState().dragOperation.itemType}getItem(){return this.store.getState().dragOperation.item}getSourceId(){return this.store.getState().dragOperation.sourceId}getTargetIds(){return this.store.getState().dragOperation.targetIds}getDropResult(){return this.store.getState().dragOperation.dropResult}didDrop(){return this.store.getState().dragOperation.didDrop}isSourcePublic(){return!!this.store.getState().dragOperation.isSourcePublic}getInitialClientOffset(){return this.store.getState().dragOffset.initialClientOffset}getInitialSourceClientOffset(){return this.store.getState().dragOffset.initialSourceClientOffset}getClientOffset(){return this.store.getState().dragOffset.clientOffset}getSourceClientOffset(){return Xb(this.store.getState().dragOffset)}getDifferenceFromInitialOffset(){return Kb(this.store.getState().dragOffset)}constructor(t,r){this.store=t,this.registry=r}}const E1=typeof global<"u"?global:self,ty=E1.MutationObserver||E1.WebKitMutationObserver;function ry(e){return function(){const r=setTimeout(i,0),n=setInterval(i,50);function i(){clearTimeout(r),clearInterval(n),e()}}}function Qb(e){let t=1;const r=new ty(e),n=document.createTextNode("");return r.observe(n,{characterData:!0}),function(){t=-t,n.data=t}}const Zb=typeof ty=="function"?Qb:ry;class Jb{enqueueTask(t){const{queue:r,requestFlush:n}=this;r.length||(n(),this.flushing=!0),r[r.length]=t}constructor(){this.queue=[],this.pendingErrors=[],this.flushing=!1,this.index=0,this.capacity=1024,this.flush=()=>{const{queue:t}=this;for(;this.indexthis.capacity){for(let n=0,i=t.length-this.index;n{this.pendingErrors.push(t),this.requestErrorThrow()},this.requestFlush=Zb(this.flush),this.requestErrorThrow=ry(()=>{if(this.pendingErrors.length)throw this.pendingErrors.shift()})}}class e8{call(){try{this.task&&this.task()}catch(t){this.onError(t)}finally{this.task=null,this.release(this)}}constructor(t,r){this.onError=t,this.release=r,this.task=null}}class t8{create(t){const r=this.freeTasks,n=r.length?r.pop():new e8(this.onError,i=>r[r.length]=i);return n.task=t,n}constructor(t){this.onError=t,this.freeTasks=[]}}const ny=new Jb,r8=new t8(ny.registerPendingError);function n8(e){ny.enqueueTask(r8.create(e))}const hh="dnd-core/ADD_SOURCE",ph="dnd-core/ADD_TARGET",gh="dnd-core/REMOVE_SOURCE",Gu="dnd-core/REMOVE_TARGET";function i8(e){return{type:hh,payload:{sourceId:e}}}function o8(e){return{type:ph,payload:{targetId:e}}}function a8(e){return{type:gh,payload:{sourceId:e}}}function s8(e){return{type:Gu,payload:{targetId:e}}}function l8(e){Fe(typeof e.canDrag=="function","Expected canDrag to be a function."),Fe(typeof e.beginDrag=="function","Expected beginDrag to be a function."),Fe(typeof e.endDrag=="function","Expected endDrag to be a function.")}function u8(e){Fe(typeof e.canDrop=="function","Expected canDrop to be a function."),Fe(typeof e.hover=="function","Expected hover to be a function."),Fe(typeof e.drop=="function","Expected beginDrag to be a function.")}function g0(e,t){if(t&&Array.isArray(e)){e.forEach(r=>g0(r,!1));return}Fe(typeof e=="string"||typeof e=="symbol",t?"Type can only be a string, a symbol, or an array of either.":"Type can only be a string or a symbol.")}var sr;(function(e){e.SOURCE="SOURCE",e.TARGET="TARGET"})(sr||(sr={}));let c8=0;function f8(){return c8++}function d8(e){const t=f8().toString();switch(e){case sr.SOURCE:return`S${t}`;case sr.TARGET:return`T${t}`;default:throw new Error(`Unknown Handler Role: ${e}`)}}function _1(e){switch(e[0]){case"S":return sr.SOURCE;case"T":return sr.TARGET;default:throw new Error(`Cannot parse handler ID: ${e}`)}}function S1(e,t){const r=e.entries();let n=!1;do{const{done:i,value:[,o]}=r.next();if(o===t)return!0;n=!!i}while(!n);return!1}class h8{addSource(t,r){g0(t),l8(r);const n=this.addHandler(sr.SOURCE,t,r);return this.store.dispatch(i8(n)),n}addTarget(t,r){g0(t,!0),u8(r);const n=this.addHandler(sr.TARGET,t,r);return this.store.dispatch(o8(n)),n}containsHandler(t){return S1(this.dragSources,t)||S1(this.dropTargets,t)}getSource(t,r=!1){return Fe(this.isSourceId(t),"Expected a valid source ID."),r&&t===this.pinnedSourceId?this.pinnedSource:this.dragSources.get(t)}getTarget(t){return Fe(this.isTargetId(t),"Expected a valid target ID."),this.dropTargets.get(t)}getSourceType(t){return Fe(this.isSourceId(t),"Expected a valid source ID."),this.types.get(t)}getTargetType(t){return Fe(this.isTargetId(t),"Expected a valid target ID."),this.types.get(t)}isSourceId(t){return _1(t)===sr.SOURCE}isTargetId(t){return _1(t)===sr.TARGET}removeSource(t){Fe(this.getSource(t),"Expected an existing source."),this.store.dispatch(a8(t)),n8(()=>{this.dragSources.delete(t),this.types.delete(t)})}removeTarget(t){Fe(this.getTarget(t),"Expected an existing target."),this.store.dispatch(s8(t)),this.dropTargets.delete(t),this.types.delete(t)}pinSource(t){const r=this.getSource(t);Fe(r,"Expected an existing source."),this.pinnedSourceId=t,this.pinnedSource=r}unpinSource(){Fe(this.pinnedSource,"No source is pinned at the time."),this.pinnedSourceId=null,this.pinnedSource=null}addHandler(t,r,n){const i=d8(t);return this.types.set(i,r),t===sr.SOURCE?this.dragSources.set(i,n):t===sr.TARGET&&this.dropTargets.set(i,n),i}constructor(t){this.types=new Map,this.dragSources=new Map,this.dropTargets=new Map,this.pinnedSourceId=null,this.pinnedSource=null,this.store=t}}const p8=(e,t)=>e===t;function g8(e,t){return!e&&!t?!0:!e||!t?!1:e.x===t.x&&e.y===t.y}function m8(e,t,r=p8){if(e.length!==t.length)return!1;for(let n=0;n0||!m8(r,n)))return Ca;const a=n[n.length-1],s=r[r.length-1];return a!==s&&(a&&i.push(a),s&&i.push(s)),i}function x8(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function w8(e){for(var t=1;t=0)&&Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function I8(e,t){if(e==null)return{};var r={},n=Object.keys(e),i,o;for(o=0;o=0)&&(r[i]=e[i]);return r}let C1=0;const ul=Symbol.for("__REACT_DND_CONTEXT_INSTANCE__");var b8=x.memo(function(t){var{children:r}=t,n=P8(t,["children"]);const[i,o]=k8(n);return x.useEffect(()=>{if(o){const a=iy();return++C1,()=>{--C1===0&&(a[ul]=null)}}},[]),X(Q2.Provider,{value:i,children:r})});function k8(e){if("manager"in e)return[{dragDropManager:e.manager},!1];const t=$8(e.backend,e.context,e.options,e.debugMode),r=!e.context;return[t,r]}function $8(e,t=iy(),r,n){const i=t;return i[ul]||(i[ul]={dragDropManager:F8(e,t,r,n)}),i[ul]}function iy(){return typeof global<"u"?global:window}var N8=function e(t,r){if(t===r)return!0;if(t&&r&&typeof t=="object"&&typeof r=="object"){if(t.constructor!==r.constructor)return!1;var n,i,o;if(Array.isArray(t)){if(n=t.length,n!=r.length)return!1;for(i=n;i--!==0;)if(!e(t[i],r[i]))return!1;return!0}if(t.constructor===RegExp)return t.source===r.source&&t.flags===r.flags;if(t.valueOf!==Object.prototype.valueOf)return t.valueOf()===r.valueOf();if(t.toString!==Object.prototype.toString)return t.toString()===r.toString();if(o=Object.keys(t),n=o.length,n!==Object.keys(r).length)return!1;for(i=n;i--!==0;)if(!Object.prototype.hasOwnProperty.call(r,o[i]))return!1;for(i=n;i--!==0;){var a=o[i];if(!e(t[a],r[a]))return!1}return!0}return t!==t&&r!==r};const M8=qa(N8),fi=typeof window<"u"?x.useLayoutEffect:x.useEffect;function L8(e,t,r){const[n,i]=x.useState(()=>t(e)),o=x.useCallback(()=>{const a=t(e);M8(n,a)||(i(a),r&&r())},[n,e,r]);return fi(o),[n,o]}function B8(e,t,r){const[n,i]=L8(e,t,r);return fi(function(){const a=e.getHandlerId();if(a!=null)return e.subscribeToStateChange(i,{handlerIds:[a]})},[e,i]),n}function oy(e,t,r){return B8(t,e||(()=>({})),()=>r.reconnect())}function ay(e,t){const r=[...t||[]];return t==null&&typeof e!="function"&&r.push(e),x.useMemo(()=>typeof e=="function"?e():e,r)}function U8(e){return x.useMemo(()=>e.hooks.dragSource(),[e])}function H8(e){return x.useMemo(()=>e.hooks.dragPreview(),[e])}let jc=!1,Xc=!1;class V8{receiveHandlerId(t){this.sourceId=t}getHandlerId(){return this.sourceId}canDrag(){Fe(!jc,"You may not call monitor.canDrag() inside your canDrag() implementation. Read more: http://react-dnd.github.io/react-dnd/docs/api/drag-source-monitor");try{return jc=!0,this.internalMonitor.canDragSource(this.sourceId)}finally{jc=!1}}isDragging(){if(!this.sourceId)return!1;Fe(!Xc,"You may not call monitor.isDragging() inside your isDragging() implementation. Read more: http://react-dnd.github.io/react-dnd/docs/api/drag-source-monitor");try{return Xc=!0,this.internalMonitor.isDraggingSource(this.sourceId)}finally{Xc=!1}}subscribeToStateChange(t,r){return this.internalMonitor.subscribeToStateChange(t,r)}isDraggingSource(t){return this.internalMonitor.isDraggingSource(t)}isOverTarget(t,r){return this.internalMonitor.isOverTarget(t,r)}getTargetIds(){return this.internalMonitor.getTargetIds()}isSourcePublic(){return this.internalMonitor.isSourcePublic()}getSourceId(){return this.internalMonitor.getSourceId()}subscribeToOffsetChange(t){return this.internalMonitor.subscribeToOffsetChange(t)}canDragSource(t){return this.internalMonitor.canDragSource(t)}canDropOnTarget(t){return this.internalMonitor.canDropOnTarget(t)}getItemType(){return this.internalMonitor.getItemType()}getItem(){return this.internalMonitor.getItem()}getDropResult(){return this.internalMonitor.getDropResult()}didDrop(){return this.internalMonitor.didDrop()}getInitialClientOffset(){return this.internalMonitor.getInitialClientOffset()}getInitialSourceClientOffset(){return this.internalMonitor.getInitialSourceClientOffset()}getSourceClientOffset(){return this.internalMonitor.getSourceClientOffset()}getClientOffset(){return this.internalMonitor.getClientOffset()}getDifferenceFromInitialOffset(){return this.internalMonitor.getDifferenceFromInitialOffset()}constructor(t){this.sourceId=null,this.internalMonitor=t.getMonitor()}}let Kc=!1;class W8{receiveHandlerId(t){this.targetId=t}getHandlerId(){return this.targetId}subscribeToStateChange(t,r){return this.internalMonitor.subscribeToStateChange(t,r)}canDrop(){if(!this.targetId)return!1;Fe(!Kc,"You may not call monitor.canDrop() inside your canDrop() implementation. Read more: http://react-dnd.github.io/react-dnd/docs/api/drop-target-monitor");try{return Kc=!0,this.internalMonitor.canDropOnTarget(this.targetId)}finally{Kc=!1}}isOver(t){return this.targetId?this.internalMonitor.isOverTarget(this.targetId,t):!1}getItemType(){return this.internalMonitor.getItemType()}getItem(){return this.internalMonitor.getItem()}getDropResult(){return this.internalMonitor.getDropResult()}didDrop(){return this.internalMonitor.didDrop()}getInitialClientOffset(){return this.internalMonitor.getInitialClientOffset()}getInitialSourceClientOffset(){return this.internalMonitor.getInitialSourceClientOffset()}getSourceClientOffset(){return this.internalMonitor.getSourceClientOffset()}getClientOffset(){return this.internalMonitor.getClientOffset()}getDifferenceFromInitialOffset(){return this.internalMonitor.getDifferenceFromInitialOffset()}constructor(t){this.targetId=null,this.internalMonitor=t.getMonitor()}}function z8(e,t,r){const n=r.getRegistry(),i=n.addTarget(e,t);return[i,()=>n.removeTarget(i)]}function G8(e,t,r){const n=r.getRegistry(),i=n.addSource(e,t);return[i,()=>n.removeSource(i)]}function m0(e,t,r,n){let i=r?r.call(n,e,t):void 0;if(i!==void 0)return!!i;if(e===t)return!0;if(typeof e!="object"||!e||typeof t!="object"||!t)return!1;const o=Object.keys(e),a=Object.keys(t);if(o.length!==a.length)return!1;const s=Object.prototype.hasOwnProperty.bind(t);for(let l=0;l, or turn it into a drag source or a drop target itself.`)}function X8(e){return(t=null,r=null)=>{if(!x.isValidElement(t)){const o=t;return e(o,r),o}const n=t;return j8(n),K8(n,r?o=>e(o,r):e)}}function sy(e){const t={};return Object.keys(e).forEach(r=>{const n=e[r];if(r.endsWith("Ref"))t[r]=e[r];else{const i=X8(n);t[r]=()=>i}}),t}function A1(e,t){typeof e=="function"?e(t):e.current=t}function K8(e,t){const r=e.ref;return Fe(typeof r!="string","Cannot connect React DnD to an element with an existing string ref. Please convert it to use a callback ref instead, or wrap it into a or
. Read more: https://reactjs.org/docs/refs-and-the-dom.html#callback-refs"),r?x.cloneElement(e,{ref:n=>{A1(r,n),A1(t,n)}}):x.cloneElement(e,{ref:t})}class Y8{receiveHandlerId(t){this.handlerId!==t&&(this.handlerId=t,this.reconnect())}get connectTarget(){return this.dragSource}get dragSourceOptions(){return this.dragSourceOptionsInternal}set dragSourceOptions(t){this.dragSourceOptionsInternal=t}get dragPreviewOptions(){return this.dragPreviewOptionsInternal}set dragPreviewOptions(t){this.dragPreviewOptionsInternal=t}reconnect(){const t=this.reconnectDragSource();this.reconnectDragPreview(t)}reconnectDragSource(){const t=this.dragSource,r=this.didHandlerIdChange()||this.didConnectedDragSourceChange()||this.didDragSourceOptionsChange();return r&&this.disconnectDragSource(),this.handlerId?t?(r&&(this.lastConnectedHandlerId=this.handlerId,this.lastConnectedDragSource=t,this.lastConnectedDragSourceOptions=this.dragSourceOptions,this.dragSourceUnsubscribe=this.backend.connectDragSource(this.handlerId,t,this.dragSourceOptions)),r):(this.lastConnectedDragSource=t,r):r}reconnectDragPreview(t=!1){const r=this.dragPreview,n=t||this.didHandlerIdChange()||this.didConnectedDragPreviewChange()||this.didDragPreviewOptionsChange();if(n&&this.disconnectDragPreview(),!!this.handlerId){if(!r){this.lastConnectedDragPreview=r;return}n&&(this.lastConnectedHandlerId=this.handlerId,this.lastConnectedDragPreview=r,this.lastConnectedDragPreviewOptions=this.dragPreviewOptions,this.dragPreviewUnsubscribe=this.backend.connectDragPreview(this.handlerId,r,this.dragPreviewOptions))}}didHandlerIdChange(){return this.lastConnectedHandlerId!==this.handlerId}didConnectedDragSourceChange(){return this.lastConnectedDragSource!==this.dragSource}didConnectedDragPreviewChange(){return this.lastConnectedDragPreview!==this.dragPreview}didDragSourceOptionsChange(){return!m0(this.lastConnectedDragSourceOptions,this.dragSourceOptions)}didDragPreviewOptionsChange(){return!m0(this.lastConnectedDragPreviewOptions,this.dragPreviewOptions)}disconnectDragSource(){this.dragSourceUnsubscribe&&(this.dragSourceUnsubscribe(),this.dragSourceUnsubscribe=void 0)}disconnectDragPreview(){this.dragPreviewUnsubscribe&&(this.dragPreviewUnsubscribe(),this.dragPreviewUnsubscribe=void 0,this.dragPreviewNode=null,this.dragPreviewRef=null)}get dragSource(){return this.dragSourceNode||this.dragSourceRef&&this.dragSourceRef.current}get dragPreview(){return this.dragPreviewNode||this.dragPreviewRef&&this.dragPreviewRef.current}clearDragSource(){this.dragSourceNode=null,this.dragSourceRef=null}clearDragPreview(){this.dragPreviewNode=null,this.dragPreviewRef=null}constructor(t){this.hooks=sy({dragSource:(r,n)=>{this.clearDragSource(),this.dragSourceOptions=n||null,v0(r)?this.dragSourceRef=r:this.dragSourceNode=r,this.reconnectDragSource()},dragPreview:(r,n)=>{this.clearDragPreview(),this.dragPreviewOptions=n||null,v0(r)?this.dragPreviewRef=r:this.dragPreviewNode=r,this.reconnectDragPreview()}}),this.handlerId=null,this.dragSourceRef=null,this.dragSourceOptionsInternal=null,this.dragPreviewRef=null,this.dragPreviewOptionsInternal=null,this.lastConnectedHandlerId=null,this.lastConnectedDragSource=null,this.lastConnectedDragSourceOptions=null,this.lastConnectedDragPreview=null,this.lastConnectedDragPreviewOptions=null,this.backend=t}}class q8{get connectTarget(){return this.dropTarget}reconnect(){const t=this.didHandlerIdChange()||this.didDropTargetChange()||this.didOptionsChange();t&&this.disconnectDropTarget();const r=this.dropTarget;if(this.handlerId){if(!r){this.lastConnectedDropTarget=r;return}t&&(this.lastConnectedHandlerId=this.handlerId,this.lastConnectedDropTarget=r,this.lastConnectedDropTargetOptions=this.dropTargetOptions,this.unsubscribeDropTarget=this.backend.connectDropTarget(this.handlerId,r,this.dropTargetOptions))}}receiveHandlerId(t){t!==this.handlerId&&(this.handlerId=t,this.reconnect())}get dropTargetOptions(){return this.dropTargetOptionsInternal}set dropTargetOptions(t){this.dropTargetOptionsInternal=t}didHandlerIdChange(){return this.lastConnectedHandlerId!==this.handlerId}didDropTargetChange(){return this.lastConnectedDropTarget!==this.dropTarget}didOptionsChange(){return!m0(this.lastConnectedDropTargetOptions,this.dropTargetOptions)}disconnectDropTarget(){this.unsubscribeDropTarget&&(this.unsubscribeDropTarget(),this.unsubscribeDropTarget=void 0)}get dropTarget(){return this.dropTargetNode||this.dropTargetRef&&this.dropTargetRef.current}clearDropTarget(){this.dropTargetRef=null,this.dropTargetNode=null}constructor(t){this.hooks=sy({dropTarget:(r,n)=>{this.clearDropTarget(),this.dropTargetOptions=n,v0(r)?this.dropTargetRef=r:this.dropTargetNode=r,this.reconnect()}}),this.handlerId=null,this.dropTargetRef=null,this.dropTargetOptionsInternal=null,this.lastConnectedHandlerId=null,this.lastConnectedDropTarget=null,this.lastConnectedDropTargetOptions=null,this.backend=t}}function ko(){const{dragDropManager:e}=x.useContext(Q2);return Fe(e!=null,"Expected drag drop context"),e}function Q8(e,t){const r=ko(),n=x.useMemo(()=>new Y8(r.getBackend()),[r]);return fi(()=>(n.dragSourceOptions=e||null,n.reconnect(),()=>n.disconnectDragSource()),[n,e]),fi(()=>(n.dragPreviewOptions=t||null,n.reconnect(),()=>n.disconnectDragPreview()),[n,t]),n}function Z8(){const e=ko();return x.useMemo(()=>new V8(e),[e])}class J8{beginDrag(){const t=this.spec,r=this.monitor;let n=null;return typeof t.item=="object"?n=t.item:typeof t.item=="function"?n=t.item(r):n={},n??null}canDrag(){const t=this.spec,r=this.monitor;return typeof t.canDrag=="boolean"?t.canDrag:typeof t.canDrag=="function"?t.canDrag(r):!0}isDragging(t,r){const n=this.spec,i=this.monitor,{isDragging:o}=n;return o?o(i):r===t.getSourceId()}endDrag(){const t=this.spec,r=this.monitor,n=this.connector,{end:i}=t;i&&i(r.getItem(),r),n.reconnect()}constructor(t,r,n){this.spec=t,this.monitor=r,this.connector=n}}function ek(e,t,r){const n=x.useMemo(()=>new J8(e,t,r),[t,r]);return x.useEffect(()=>{n.spec=e},[e]),n}function tk(e){return x.useMemo(()=>{const t=e.type;return Fe(t!=null,"spec.type must be defined"),t},[e])}function rk(e,t,r){const n=ko(),i=ek(e,t,r),o=tk(e);fi(function(){if(o!=null){const[s,l]=G8(o,i,n);return t.receiveHandlerId(s),r.receiveHandlerId(s),l}},[n,t,r,i,o])}function nk(e,t){const r=ay(e,t);Fe(!r.begin,"useDrag::spec.begin was deprecated in v14. Replace spec.begin() with spec.item(). (see more here - https://react-dnd.github.io/react-dnd/docs/api/use-drag)");const n=Z8(),i=Q8(r.options,r.previewOptions);return rk(r,n,i),[oy(r.collect,n,i),U8(i),H8(i)]}function ik(e){return x.useMemo(()=>e.hooks.dropTarget(),[e])}function ok(e){const t=ko(),r=x.useMemo(()=>new q8(t.getBackend()),[t]);return fi(()=>(r.dropTargetOptions=e||null,r.reconnect(),()=>r.disconnectDropTarget()),[e]),r}function ak(){const e=ko();return x.useMemo(()=>new W8(e),[e])}function sk(e){const{accept:t}=e;return x.useMemo(()=>(Fe(e.accept!=null,"accept must be defined"),Array.isArray(t)?t:[t]),[t])}class lk{canDrop(){const t=this.spec,r=this.monitor;return t.canDrop?t.canDrop(r.getItem(),r):!0}hover(){const t=this.spec,r=this.monitor;t.hover&&t.hover(r.getItem(),r)}drop(){const t=this.spec,r=this.monitor;if(t.drop)return t.drop(r.getItem(),r)}constructor(t,r){this.spec=t,this.monitor=r}}function uk(e,t){const r=x.useMemo(()=>new lk(e,t),[t]);return x.useEffect(()=>{r.spec=e},[e]),r}function ck(e,t,r){const n=ko(),i=uk(e,t),o=sk(e);fi(function(){const[s,l]=z8(o,i,n);return t.receiveHandlerId(s),r.receiveHandlerId(s),l},[n,t,i,r,o.map(a=>a.toString()).join("|")])}function fk(e,t){const r=ay(e,t),n=ak(),i=ok(r.options);return ck(r,n,i),[oy(r.collect,n,i),ik(i)]}const ly=new RegExp("^([0-9]+)(\\s)([kKmMbBtT])$"),ru=new RegExp("^\\d{4}$"),dk=new RegExp("^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}|\\d{4}-\\d{2}-\\d{2}$");function hk({column:e,table:t,numberOfColumns:r}){function n(f){if(!f)return null;const d=new Date(f),h=d.toISOString().split("T")[0],m=d.toTimeString().split(" ")[0];return`${h} ${m}`}const i=t.getPreFilteredRowModel().flatRows.map(f=>f.original[e.id]),o=i.every(f=>typeof f=="string"||f===null),a=i.every(f=>typeof f=="number"||ly.test(f)||f===null||f===""),s=i.some(f=>typeof f=="string"&&f.includes(" ")),l=e.getFilterValue();let u="date";const c=i.every(f=>{const d=f==null?void 0:f.toString().replace(/[^0-9]/g,"").trim();return dk.test(f==null?void 0:f.toString())&&(u="datetime-local"),ru.test(f==null?void 0:f.toString())&&(u="number"),(d==null?void 0:d.length)>=4&&(Yl(e.id)||e.id.toLowerCase()==="index"&&!s)});return c&&u==="number"?Ce("div",{className:"flex gap-2 h-6",children:[X("input",{type:u,value:(l==null?void 0:l[0])??"",onChange:f=>{e.setFilterValue(d=>[`${f.target.value}`,`${d==null?void 0:d[1]}`])},min:i.reduce((f,d)=>Math.min(f,parseInt(d,10)),1/0),max:i.reduce((f,d)=>Math.max(f,parseInt(d,10)),-1/0),placeholder:"Start year",className:"_input",title:"Start year"}),X("input",{type:u,value:(l==null?void 0:l[1])??"",onChange:f=>{e.setFilterValue(d=>[`${d==null?void 0:d[0]}`,`${f.target.value}`])},min:i.reduce((f,d)=>Math.min(f,parseInt(d,10)),1/0),max:i.reduce((f,d)=>Math.max(f,parseInt(d,10)),-1/0),placeholder:"End year",className:"_input",title:"End year"})]}):c&&u!=="number"?Ce("div",{className:"flex gap-2 h-6",children:[X("input",{type:u,value:n(l==null?void 0:l[0])??"",onChange:f=>{const d=new Date(f.target.value).getTime();e.setFilterValue(h=>[d,h==null?void 0:h[1]])},placeholder:"Start date",className:"_input",title:"Start date"}),X("input",{type:u,value:n(l==null?void 0:l[1])??"",onChange:f=>{const d=new Date(f.target.value).getTime();e.setFilterValue(h=>[h==null?void 0:h[0],d])},placeholder:"End date",className:"_input",title:"End date"})]}):a?Ce("div",{className:"flex gap-0.5 h-6",children:[X("input",{type:"number",value:(l==null?void 0:l[0])??"",onChange:f=>e.setFilterValue(d=>[f.target.value,d==null?void 0:d[1]]),placeholder:"Min",className:"_input p-0.5",title:"Min"}),X("input",{type:"number",value:(l==null?void 0:l[1])??"",onChange:f=>e.setFilterValue(d=>[d==null?void 0:d[0],f.target.value]),placeholder:"Max",className:"_input p-0.5",title:"Max"})]}):o?X("div",{className:"h-6",children:X("input",{type:"text",value:l??"",onChange:f=>e.setFilterValue(f.target.value),placeholder:"Search...",className:"_input",title:"Search"})}):X("div",{className:"h-6"})}const pk=(e,t,r)=>(r.splice(r.indexOf(t),0,r.splice(r.indexOf(e),1)[0]),[...r]),gk=({header:e,table:t,advanced:r,idx:n,lockFirstColumn:i,setLockFirstColumn:o})=>{const{getState:a,setColumnOrder:s}=t,{columnOrder:l}=a(),{column:u}=e,[,c]=fk({accept:"column",drop:p=>{const g=pk(p.id,u.id,l);s(g)}}),[{isDragging:f},d,h]=nk({collect:p=>({isDragging:p.isDragging()}),item:()=>u,type:"column"}),m=()=>X("div",{ref:h,className:"flex gap-1 flex-col",children:e.isPlaceholder?null:Ce(q1,{children:[Ce("div",{className:"font-bold uppercase text-grey-700 dark:text-white tracking-widest flex gap-2 whitespace-nowrap justify-between",children:[Ce("div",{onClick:u.getToggleSortingHandler(),className:Nt("flex gap-1",{"cursor-pointer select-none":u.getCanSort()}),children:[Kf(u.columnDef.header,e.getContext()),u.getCanSort()&&Ce("div",{className:"flex flex-col gap-0.5 items-center justify-center",children:[X("button",{className:Nt({"text-[#669DCB]":u.getIsSorted()==="asc","text-grey-600":u.getIsSorted()!=="asc"}),children:X("svg",{xmlns:"http://www.w3.org/2000/svg",width:"6",height:"4",fill:"none",viewBox:"0 0 11 5",children:X("path",{fill:"currentColor",d:"M10.333 5l-5-5-5 5"})})}),X("button",{className:Nt({"text-[#669DCB]":e.column.getIsSorted()==="desc","text-grey-600":e.column.getIsSorted()!=="desc"}),children:X("svg",{xmlns:"http://www.w3.org/2000/svg",width:"6",height:"4",fill:"none",viewBox:"0 0 11 5",children:X("path",{fill:"currentColor",d:"M.333 0l5 5 5-5"})})})]})]}),r&&u.id!=="select"&&X("button",{ref:d,className:"text-grey-600 hover:text-grey-800 dark:hover:text-white",children:X("svg",{xmlns:"http://www.w3.org/2000/svg",width:"12",height:"11",fill:"none",viewBox:"0 0 17 16",children:X("path",{stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",d:"M3.667 6l-2 2 2 2M6.333 3.333l2-2 2 2M10.333 12.667l-2 2-2-2M13 6l2 2-2 2M1.667 8H15M8.333 1.333v13.334"})})})]}),r&&u.getCanFilter()?X("div",{children:X(hk,{column:u,table:t,numberOfColumns:(l==null?void 0:l.length)??0})}):null]})});return Ce("th",{className:Nt("h-[70px] p-4 sticky",{"left-0 z-50 bg-white dark:bg-grey-900":n===0&&i}),colSpan:e.colSpan,style:{width:e.getSize()+10,opacity:f?.5:1},ref:c,children:[n===0?Ce(hb,{children:[X(pb,{asChild:!0,children:m()}),X(gb,{children:X(mb,{className:"bg-white text-black dark:text-white dark:bg-grey-900 border border-grey-200 dark:border-grey-800 rounded-md shadow-lg p-2 z-50 text-xs",children:X("div",{className:"flex flex-col gap-2",children:Ce("button",{onClick:()=>{o(!i)},className:"hover:bg-grey-300 dark:hover:bg-grey-800 rounded-md p-2",children:[i?"Unlock":"Lock"," first column"]})})})})]}):m(),X("button",{className:"resizer bg-grey-300/20 dark:hover:bg-white absolute top-0 right-0 w-0.5 h-full",onMouseDown:e.getResizeHandler(),onTouchStart:e.getResizeHandler()})]})};function mk({open:e,close:t}){const r=window.download_path||"~/OpenBBUserData/exports";return Ce(jv,{open:e,onOpenChange:t,children:[Ce("div",{id:"loading",className:"saving",children:[X("div",{id:"loading_text",className:"loading_text"}),X("div",{id:"loader",className:"loader"})]}),X(Xv,{onClick:t,className:"_modal-overlay"}),Ce(Kv,{className:"_modal",children:[X(Wf,{children:X(ql,{})}),X(Wf,{className:"_modal-close",onClick:t,style:{float:"right",marginTop:20},children:X(ql,{className:"w-6 h-6"})}),X(Yv,{className:"_modal-title",children:"Success"}),Ce("div",{id:"popup_title",className:"popup_content",style:{padding:"0px 2px 2px 5px",marginTop:5},children:[X("div",{style:{display:"flex",flexDirection:"column",gap:0,fontSize:14},children:X("div",{children:Ce("label",{htmlFor:"title_text",children:[X("b",{children:window.title})," has been downloaded to",X("br",{}),X("br",{}),X("a",{style:{color:"#FFDD00",marginTop:15},href:`${r}`,onClick:n=>{n.preventDefault(),window.pywry.open_file(r)},children:r})]})})}),X("div",{style:{float:"right",marginTop:20},children:X("button",{className:"_btn",style:{padding:"8px 16px",width:"100%"},onClick:t,children:"Close"})})]})]})]})}function vk({columns:e,data:t,type:r,setType:n,downloadFinished:i}){const o=()=>{switch(r){case"csv":Qg("csv",e,t,i);break;case"xlsx":Qg("xlsx",e,t,i);break;case"png":sP("table",i);break}};return Ce("div",{className:"flex gap-2 items-center",children:[X(Yi,{labelType:"row",value:r,onChange:a=>{n(a)},label:"Type",placeholder:"Select type",groups:[{label:"Type",items:w0.map(a=>({label:a,value:a}))}]}),X("button",{onClick:o,className:"_btn",children:"Export"})]})}const uy="DropdownMenu",[xk,a$]=ln(uy,[Bu]),Oi=Bu(),[wk,cy]=xk(uy),yk=e=>{const{__scopeDropdownMenu:t,children:r,dir:n,open:i,defaultOpen:o,onOpenChange:a,modal:s=!0}=e,l=Oi(t),u=x.useRef(null),[c=!1,f]=vo({prop:i,defaultProp:o,onChange:a});return x.createElement(wk,{scope:t,triggerId:Yr(),triggerRef:u,contentId:Yr(),open:c,onOpenChange:f,onOpenToggle:x.useCallback(()=>f(d=>!d),[f]),modal:s},x.createElement(G2,ge({},l,{open:c,onOpenChange:f,dir:n,modal:s}),r))},Ek="DropdownMenuTrigger",_k=x.forwardRef((e,t)=>{const{__scopeDropdownMenu:r,disabled:n=!1,...i}=e,o=cy(Ek,r),a=Oi(r);return x.createElement(j2,ge({asChild:!0},a),x.createElement(Ie.button,ge({type:"button",id:o.triggerId,"aria-haspopup":"menu","aria-expanded":o.open,"aria-controls":o.open?o.contentId:void 0,"data-state":o.open?"open":"closed","data-disabled":n?"":void 0,disabled:n},i,{ref:xd(t,o.triggerRef),onPointerDown:_e(e.onPointerDown,s=>{!n&&s.button===0&&s.ctrlKey===!1&&(o.onOpenToggle(),o.open||s.preventDefault())}),onKeyDown:_e(e.onKeyDown,s=>{n||(["Enter"," "].includes(s.key)&&o.onOpenToggle(),s.key==="ArrowDown"&&o.onOpenChange(!0),["Enter"," ","ArrowDown"].includes(s.key)&&s.preventDefault())})})))}),Sk=e=>{const{__scopeDropdownMenu:t,...r}=e,n=Oi(t);return x.createElement(X2,ge({},n,r))},Tk="DropdownMenuContent",Ck=x.forwardRef((e,t)=>{const{__scopeDropdownMenu:r,...n}=e,i=cy(Tk,r),o=Oi(r),a=x.useRef(!1);return x.createElement(K2,ge({id:i.contentId,"aria-labelledby":i.triggerId},o,n,{ref:t,onCloseAutoFocus:_e(e.onCloseAutoFocus,s=>{var l;a.current||(l=i.triggerRef.current)===null||l===void 0||l.focus(),a.current=!1,s.preventDefault()}),onInteractOutside:_e(e.onInteractOutside,s=>{const l=s.detail.originalEvent,u=l.button===0&&l.ctrlKey===!0,c=l.button===2||u;(!i.modal||c)&&(a.current=!0)}),style:{...e.style,"--radix-dropdown-menu-content-transform-origin":"var(--radix-popper-transform-origin)","--radix-dropdown-menu-content-available-width":"var(--radix-popper-available-width)","--radix-dropdown-menu-content-available-height":"var(--radix-popper-available-height)","--radix-dropdown-menu-trigger-width":"var(--radix-popper-anchor-width)","--radix-dropdown-menu-trigger-height":"var(--radix-popper-anchor-height)"}}))}),Ak=x.forwardRef((e,t)=>{const{__scopeDropdownMenu:r,...n}=e,i=Oi(r);return x.createElement(rb,ge({},i,n,{ref:t}))}),Rk=x.forwardRef((e,t)=>{const{__scopeDropdownMenu:r,...n}=e,i=Oi(r);return x.createElement(nb,ge({},i,n,{ref:t}))}),Ok=x.forwardRef((e,t)=>{const{__scopeDropdownMenu:r,...n}=e,i=Oi(r);return x.createElement(ib,ge({},i,n,{ref:t}))}),Fk=yk,R1=_k,Dk=Sk,Pk=Ck,Ik=Ak,bk=Rk,Yc=Ok;function kk(e,t){x.useEffect(()=>{const r=n=>{!e.current||e.current.contains(n.target)||t(n)};return document.addEventListener("mousedown",r),document.addEventListener("touchstart",r),()=>{document.removeEventListener("mousedown",r),document.removeEventListener("touchstart",r)}},[e,t])}function O1({label:e,table:t,onlyIconTrigger:r=!1}){const[n,i]=x.useState(!1),o=x.useRef(null);kk(o,()=>i(!1)),x.useEffect(()=>{const s=l=>{l.key==="Escape"&&i(!1)};return document.addEventListener("keydown",s),()=>document.removeEventListener("keydown",s)},[]);function a(){t.resetColumnFilters(),i(!1)}return Ce(Fk,{open:n,children:[r?X(R1,{title:"Filter columns",onClick:()=>i(!n),children:X("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",strokeWidth:1.5,stroke:"currentColor",className:"w-7 h-7",children:X("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M12 3c2.755 0 5.455.232 8.083.678.533.09.917.556.917 1.096v1.044a2.25 2.25 0 01-.659 1.591l-5.432 5.432a2.25 2.25 0 00-.659 1.591v2.927a2.25 2.25 0 01-1.244 2.013L9.75 21v-6.568a2.25 2.25 0 00-.659-1.591L3.659 7.409A2.25 2.25 0 013 5.818V4.774c0-.54.384-1.006.917-1.096A48.32 48.32 0 0112 3z"})})}):Ce(Ik,{className:"flex flex-row items-center gap-2",children:[X(bk,{className:"whitespace-nowrap",children:e}),Ce(R1,{onClick:()=>i(!n),className:"bg-white text-black dark:bg-grey-900 dark:text-white whitespace-nowrap h-[36px] border-[1.5px] border-grey-700 rounded p-3 inline-flex items-center justify-center leading-none gap-[5px] shadow-[0_2px_10px] shadow-black/10 focus:shadow-[0_0_0_2px] focus:shadow-black data-[placeholder]:text-white outline-none","aria-label":e,children:[X("span",{children:"Filter columns"}),X(s0,{className:Nt({"transform rotate-180 duration-200 transition":n})})]})]}),X(Dk,{children:Ce(Pk,{sideOffset:10,ref:o,className:"z-50 bg-white/80 dark:bg-grey-900/80 backdrop-filter backdrop-blur flex flex-col gap-4 overflow-auto border-[1.5px] border-grey-700 rounded p-3 max-h-[500px] text-black dark:text-white",children:[X(Yc,{children:X("button",{className:"_btn w-full",onClick:a,children:"Clear Filters"})}),X(Yc,{children:Ce("label",{className:"flex items-center gap-2",children:[X("input",{type:"checkbox",checked:t.getIsAllColumnsVisible(),onChange:t.getToggleAllColumnsVisibilityHandler()}),"Toggle All"]})}),t.getAllLeafColumns().filter(s=>s.id!=="select").map(s=>X(Yc,{children:Ce("label",{className:"flex items-center gap-2",children:[X("input",{type:"checkbox",checked:s.getIsVisible(),onChange:s.getToggleVisibilityHandler()}),s.id]})},s.id))]})})]})}function fy(e){return typeof e!="number"?typeof e=="string"&&e.includes("All")?e:x0:e<1?x0:e}function $k({table:e,currentPage:t,setCurrentPage:r}){const n=e.getFilteredRowModel().rows.length||0;return Ce("div",{className:"hidden md:flex items-center gap-3",children:[X(Yi,{value:t,onChange:i=>{const o=fy(i);r(o),o.toString().includes("All")?e.setPageSize(n):e.setPageSize(o)},labelType:"row",label:"Rows per page",placeholder:"Select rows per page",groups:[{label:"Rows per page",items:[10,20,30,40,50,`All (${n})`].map(i=>({label:`${i}`,value:i}))}]}),Ce("span",{className:"flex items-center gap-1",children:[X("strong",{children:e.getState().pagination.pageIndex+1}),"of",X("strong",{children:e.getPageCount()})]}),Ce("div",{className:"hidden mdl:block",children:[X("button",{className:Nt("px-2",{"text-grey-400 dark:text-grey-700":!e.getCanPreviousPage(),"dark:text-white":e.getCanPreviousPage()}),onClick:()=>e.setPageIndex(0),disabled:!e.getCanPreviousPage(),children:"<<"}),X("button",{className:Nt("px-2",{"text-grey-400 dark:text-grey-700":!e.getCanPreviousPage(),"dark:text-white":e.getCanPreviousPage()}),onClick:()=>e.previousPage(),disabled:!e.getCanPreviousPage(),children:"<"}),X("button",{className:Nt("px-2",{"text-grey-400 dark:text-grey-700":!e.getCanNextPage(),"dark:text-white":e.getCanNextPage()}),onClick:()=>e.nextPage(),disabled:!e.getCanNextPage(),children:">"}),X("button",{className:Nt("px-2",{"text-grey-400 dark:text-grey-700":!e.getCanNextPage(),"dark:text-white":e.getCanNextPage()}),onClick:()=>e.setPageIndex(e.getPageCount()-1),disabled:!e.getCanNextPage(),children:">>"})]})]})}const Nk=new Date,Mk=50,x0=30;function Lk(e,t){try{const r=e.hasOwnProperty("index")?"index":e.hasOwnProperty("Index")?"Index":null,n=r?e[r]:null,i=e[t],o=typeof i,a=i==null?void 0:i.toString().replace(/[^0-9]/g,""),s=(a==null?void 0:a.length)>=4&&(Yl(t)||t.toLowerCase()==="index"||n&&typeof n=="string"&&(n.toLowerCase().includes("date")||n.toLowerCase().includes("day")||n.toLowerCase().includes("time")||n.toLowerCase().includes("timestamp")||n.toLowerCase().includes("month")||n.toLowerCase().includes("week")||n.toLowerCase().includes("hour")||n.toLowerCase().includes("minute")));if(o==="string"&&i.startsWith("http")||!s)return(i==null?void 0:i.toString().length)??0;if(s&&!isNaN(new Date(i).getTime())&&!ru.test(i==null?void 0:i.toString())){if(typeof i=="string")return(i==null?void 0:i.toString().length)??0;try{const u=new Date(i);let c="";return u.getUTCHours()===0&&u.getUTCMinutes()===0&&u.getUTCSeconds()===0&&u.getMilliseconds()===0?c=u.toISOString().split("T")[0]:(c=u.toISOString(),c=`${c.split("T")[0]} ${c.split("T")[1].split(".")[0]}`),(c==null?void 0:c.toString().length)??0}catch{return(i==null?void 0:i.toString().length)??0}}return(i==null?void 0:i.toString().length)??0}catch{return 0}}const w0=["csv","xlsx","png"];function Bk({data:e,columns:t,title:r,initialTheme:n,cmd:i=""}){const[o,a]=Jo("exportType",w0[0]),[s,l]=x.useState(!1),[u,c]=JC(n),[f,d]=x.useState(u==="dark"),h=W=>{c(u),d(W)},[m,p]=Jo("rowsPerPage",x0,fy),[g,v]=Jo("advanced",!1),[w,y]=Jo("colors",!1),[E,b]=x.useState([]),[k,S]=x.useState(""),[C,A]=Jo("fontSize","1"),[L,B]=x.useState(!1),U=t.reduce((W,Q,le)=>(W[Q]=le{const ne=Math.max(...W.map($e=>Lk($e,Q)),le!=null&&le.length?(le==null?void 0:le.length)+8:0);return Math.min(200,ne*12)},ae=x.useMemo(()=>[...t.map((W,Q)=>({accessorKey:W,accessorFn:le=>{var ve,ut,gt;const me=le.hasOwnProperty("index")?"index":le.hasOwnProperty("Index")?"Index":t[0],Se=me?le[me]:null,ne=le[W],$e=((gt=(ut=(ve=ne==null?void 0:ne.toString())==null?void 0:ve.split("."))==null?void 0:ut[0])==null?void 0:gt.replace(/[^0-9]/g,""))??"",Pe=($e==null?void 0:$e.length)>=4&&(Yl(W)||W.toLowerCase()==="index"||Se&&typeof Se=="string"&&(Se.toLowerCase().includes("date")||Se.toLowerCase().includes("time")||Se.toLowerCase().includes("timestamp")||Se.toLowerCase().includes("month")||Se.toLowerCase().includes("week")||Se.toLowerCase().includes("hour")||Se.toLowerCase().includes("minute")));return Pe&&(ne==null?void 0:ne.length)===4&&ru.test(ne==null?void 0:ne.toString())?ne:Pe?typeof ne=="number"?ne:new Date(ne).getTime():ne},id:W,header:W,size:ee(e,W,W),footer:W,cell:({row:le})=>{var gt,bt,Br,$o;const me=le.original.hasOwnProperty("index")?"index":le.original.hasOwnProperty("Index")?"Index":t[0],Se=me?le.original[me]:null,ne=le.original[W],$e=typeof ne,Pe=((Br=(bt=(gt=ne==null?void 0:ne.toString())==null?void 0:gt.split("."))==null?void 0:bt[0])==null?void 0:Br.replace(/[^0-9]/g,""))??"",ve=(Pe==null?void 0:Pe.length)>=4&&(Yl(W)||W.toLowerCase()==="index"||Se&&typeof Se=="string"&&(Se.toLowerCase().includes("date")||Se.toLowerCase().includes("time")||Se.toLowerCase().includes("timestamp")));if($e==="string"&&ne.startsWith("http"))return X("a",{className:"_hyper-link",href:ne,target:"_blank",rel:"noreferrer",children:(ne==null?void 0:ne.length)>25?`${ne.substring(0,25)}...`:ne});if(ve&&(ne==null?void 0:ne.length)===4&&ru.test(ne==null?void 0:ne.toString()))return X("p",{children:ne});if(ve&&!isNaN(new Date(ne).getTime())){if(typeof ne=="string"){const Ze=ne.split("T")[0],We=($o=ne.split("T")[1])==null?void 0:$o.split(".")[0];return We==="00:00:00"?X("p",{children:Ze}):Ce("p",{children:[Ze," ",We]})}try{const Ze=new Date(ne);let We="";return Ze.getUTCHours()===0&&Ze.getUTCMinutes()===0&&Ze.getUTCSeconds()===0&&Ze.getMilliseconds()===0?We=Ze.toISOString().split("T")[0]:(We=Ze.toISOString(),We=`${We.split("T")[0]} ${We.split("T")[1].split(".")[0]}`),X("p",{children:We})}catch{return X("p",{children:ne})}}if($e==="number"||ly.test(ne==null?void 0:ne.toString())){let Ze=tP(ne,W);const We=Number(t0(ne));if(typeof Se=="string"&&n2(Se)){Ze=Number(t0(ne));const Fi=Ze<2?4:2;Ze=Ze.toLocaleString("en-US",{maximumFractionDigits:Fi,minimumFractionDigits:2})}return X("p",{className:Nt("whitespace-nowrap",{"text-black dark:text-white":!w,"text-[#16A34A]":We>0&&w,"text-[#F87171]":We<0&&w,"text-[#404040]":We===0&&w}),title:r2(ne).toString()??"",children:We!==0?We>0?`${Ze}`:`${Ze}`:Ze})}else if($e==="string")return X("div",{dangerouslySetInnerHTML:{__html:ZC(ne)}});return X("p",{children:ne})}}))],[g,w]),[he,Te]=x.useState(!1),[oe,ye]=x.useState(ae.map(W=>W.id)),te=()=>ye(t.map(W=>W.id)),O=x.useMemo(()=>{const W=oe.map(le=>le),Q=ae.map(le=>le.id);return!rP(W,Q)},[oe,ae]),M=aC({data:e,columns:ae,getCoreRowModel:YT(),getSortedRowModel:eC(),getFilteredRowModel:JT(),getPaginationRowModel:rC(),columnResizeMode:"onChange",onColumnVisibilityChange:G,onColumnOrderChange:ye,onSortingChange:b,onGlobalFilterChange:S,globalFilterFn:nP,state:{sorting:E,globalFilter:k,columnOrder:oe,columnVisibility:H},initialState:{pagination:{pageIndex:0,pageSize:typeof m=="string"?m.includes("All")?e==null?void 0:e.length:parseInt(m):m}}}),N=x.useRef(null),{rows:F}=M.getRowModel(),V=M.getVisibleFlatColumns(),[Y,J]=x.useState(!1);return x.useEffect(()=>{s&&(l(!1),J(!0))},[s]),Ce(q1,{children:[X(f5,{toast:{id:"max-columns",title:"Max 12 columns are visible by default",description:"You can change this by clicking on advanced and then top right 'Filter' button",status:"info"},open:L,setOpen:B}),X(mk,{open:Y,close:()=>J(!1)}),Ce("div",{ref:N,className:Nt("overflow-x-hidden h-screen"),children:[Ce("div",{className:"relative p-4",id:"table",children:[X("div",{className:"absolute -inset-0.5 bg-gradient-to-r rounded-md blur-md from-[#072e49]/30 via-[#0d345f]/30 to-[#0d3362]/30"}),Ce("div",{className:"border border-grey-500/60 dark:border-grey-200/60 bg-white dark:bg-grey-900 rounded overflow-hidden relative z-20",children:[Ce("div",{className:"_header relative gap-4 py-2 text-center text-xs flex items-center justify-between px-4 text-white",style:{fontSize:`${Number(C)*90}%`},children:[X("div",{className:"w-1/3",children:X("svg",{xmlns:"http://www.w3.org/2000/svg",width:"64",height:"40",fill:"none",viewBox:"0 0 64 40",children:X("path",{fill:"#fff",d:"M61.283 3.965H33.608v27.757h25.699V19.826H37.561v-3.965H63.26V3.965h-1.977zM39.538 23.792h15.815v3.965H37.561v-3.965h1.977zM59.306 9.913v1.983H37.561V7.931h21.745v1.982zM33.606 0h-3.954v3.965H33.606V0zM25.7 3.966H0V15.86h25.7v3.965H3.953v11.896h25.7V3.966h-3.955zm0 21.808v1.983H7.907v-3.965h17.791v1.982zm0-15.86v1.982H3.953V7.931h21.745v1.982zM37.039 35.693v2.952l-.246-.246-.245-.245-.245-.247-.245-.246-.246-.246-.245-.245-.245-.247-.247-.246-.245-.246-.245-.246-.245-.246-.246-.246h-.49v3.936h.49v-3.198l.246.246.245.246.245.246.245.246.246.246.246.246.245.247.246.245.245.246.245.247.245.246.246.245.245.246h.245v-3.936h-.49zM44.938 37.17h-.491v-1.477h-2.944v3.937h3.93v-2.46h-.495zm-2.944-.246v-.739h1.962v.984h-1.962v-.245zm2.944.984v1.23h-2.944V37.66h2.944v.247zM52.835 37.17h-.49v-1.477h-2.946v3.937h3.925v-2.46h-.489zm-2.944-.246v-.739h1.963v.984h-1.965l.002-.245zm2.944.984v1.23H49.89V37.66h2.946v.247zM29.174 35.693H25.739v3.936H29.663v-.491H26.229v-.984h2.943v-.493H26.229v-1.476h3.434v-.492h-.489zM13.37 35.693H9.934v3.937h3.925v-3.937h-.49zm0 .738v2.709h-2.945v-2.955h2.943l.001.246zM21.276 35.693h-3.435v3.937h.491v-1.476h3.434v-2.461h-.49zm0 .738v1.23h-2.944v-1.476h2.944v.246z"})})}),X("p",{className:"font-bold w-1/3 flex flex-col gap-0.5 items-center",children:r}),Ce("p",{className:"w-1/3 text-right text-xs",children:[new Intl.DateTimeFormat("en-GB",{dateStyle:"full",timeStyle:"long"}).format(Nk).replace(/:\d\d /," "),X("br",{}),X("span",{className:"text-grey-400",children:i})]})]}),X("div",{className:"overflow-auto max-h-[calc(100vh-170px)] smh:max-h-[calc(100vh-95px)]",children:Ce("table",{className:"text-sm relative",children:[X("thead",{className:"sticky top-0 bg-white dark:bg-grey-900",style:{fontSize:`${Number(C)*100}%`},children:M.getHeaderGroups().map((W,Q)=>X("tr",{children:W.headers.map((le,me)=>X(gk,{setLockFirstColumn:Te,lockFirstColumn:he,idx:me,advanced:g,header:le,table:M},le.id))},W.id))}),X("tbody",{children:M.getRowModel().rows.map((W,Q)=>X("tr",{className:"!h-[64px] border-b border-grey-400",style:{fontSize:`${Number(C)*100}%`},children:W.getVisibleCells().map((le,me)=>X("td",{className:Nt("whitespace-normal p-4 text-black dark:text-white",{"bg-white dark:bg-grey-850":Q%2===0,"bg-grey-100 dark:bg-[#202020]":Q%2===1,"sticky left-0 z-10":me===0&&he}),style:{width:le.column.getSize()},children:Kf(le.column.columnDef.cell,le.getContext())},le.id))},W.id))}),(F==null?void 0:F.length)>30&&(V==null?void 0:V.length)>4&&X("tfoot",{children:M.getFooterGroups().map(W=>X("tr",{children:W.headers.map(Q=>X("th",{colSpan:Q.colSpan,className:"text-grey-500 bg-grey-100 dark:bg-grey-850 font-normal text-left text-sm h-10 p-4",style:{width:Q.getSize(),fontSize:`${Number(C)*100}%`},children:Q.isPlaceholder?null:Kf(Q.column.columnDef.footer,Q.getContext())},Q.id))},W.id))})]})})]})]}),Ce("div",{className:"smh:hidden flex max-h-[68px] overflow-x-auto bg-white/70 dark:bg-grey-900/70 backdrop-filter backdrop-blur z-20 bottom-0 left-0 w-full gap-10 justify-between py-4 px-4 text-sm",children:[Ce("div",{className:"flex items-center gap-10",children:[Ce(jv,{children:[X(pT,{className:"_btn",children:"Settings"}),Ce(gT,{children:[X(Xv,{className:"_modal-overlay"}),Ce(Kv,{className:"_modal",children:[X(Wf,{className:"absolute top-[40px] right-[46px] text-grey-200 hover:text-white rounded-[4px] focus:outline focus:outline-2 focus:outline-grey-500",children:X(ql,{className:"w-6 h-6"})}),X(Yv,{className:"uppercase font-bold tracking-widest",children:"Settings"}),Ce("div",{className:"grid grid-cols-2 gap-2 mt-10 text-sm",children:[O&&X("button",{onClick:()=>te(),className:"_btn h-9",children:"Reset Order"}),X(Yi,{labelType:"row",value:f?"light":"dark",onChange:W=>{h(W!=="dark")},label:"Theme",placeholder:"Select theme",groups:[{label:"Theme",items:[{label:"Dark",value:"dark"},{label:"Light",value:"light"}]}]}),X(Yi,{labelType:"row",value:o,onChange:W=>{a(W)},label:"Export type",placeholder:"Select export type",groups:[{label:"Export type",items:w0.map(W=>({label:W,value:W}))}]}),X(Yi,{labelType:"row",value:C,onChange:A,label:"Font size",placeholder:"Select font size",groups:[{label:"Font size",items:[{label:"50%",value:"0.5"},{label:"75%",value:"0.75"},{label:"100%",value:"1"},{label:"125%",value:"1.25"},{label:"150%",value:"1.5"},{label:"175%",value:"1.75"},{label:"200%",value:"2"}]}]}),X(O1,{table:M,label:"Filter"}),X("div",{className:"flex gap-2 items-center",children:X(Yi,{labelType:"row",value:g?"advanced":"simple",onChange:W=>{v(W==="advanced")},label:"Type",placeholder:"Select type",groups:[{label:"Type",items:[{label:"Simple",value:"simple"},{label:"Advanced",value:"advanced"}]}]})}),Ce("div",{className:"flex gap-2 items-center",children:[X("label",{htmlFor:"colors",children:"Colors"}),X("input",{id:"colors",type:"checkbox",checked:w,onChange:()=>y(!w)})]})]})]})]})]}),X(O1,{onlyIconTrigger:!0,table:M,label:""})]}),X($k,{currentPage:m,setCurrentPage:p,table:M}),X(vk,{setType:a,type:o,columns:t,data:e,downloadFinished:l})]})]})]})}function dy(e){let t=null;return()=>(t==null&&(t=e()),t)}function Uk(e,t){return e.filter(r=>r!==t)}function Hk(e,t){const r=new Set,n=o=>r.add(o);e.forEach(n),t.forEach(n);const i=[];return r.forEach(o=>i.push(o)),i}class Vk{enter(t){const r=this.entered.length,n=i=>this.isNodeInDocument(i)&&(!i.contains||i.contains(t));return this.entered=Hk(this.entered.filter(n),[t]),r===0&&this.entered.length>0}leave(t){const r=this.entered.length;return this.entered=Uk(this.entered.filter(this.isNodeInDocument),t),r>0&&this.entered.length===0}reset(){this.entered=[]}constructor(t){this.entered=[],this.isNodeInDocument=t}}class Wk{initializeExposedProperties(){Object.keys(this.config.exposeProperties).forEach(t=>{Object.defineProperty(this.item,t,{configurable:!0,enumerable:!0,get(){return console.warn(`Browser doesn't allow reading "${t}" until the drop event.`),null}})})}loadDataTransfer(t){if(t){const r={};Object.keys(this.config.exposeProperties).forEach(n=>{const i=this.config.exposeProperties[n];i!=null&&(r[n]={value:i(t,this.config.matchesTypes),configurable:!0,enumerable:!0})}),Object.defineProperties(this.item,r)}}canDrag(){return!0}beginDrag(){return this.item}isDragging(t,r){return r===t.getSourceId()}endDrag(){}constructor(t){this.config=t,this.item={},this.initializeExposedProperties()}}const hy="__NATIVE_FILE__",py="__NATIVE_URL__",gy="__NATIVE_TEXT__",my="__NATIVE_HTML__",F1=Object.freeze(Object.defineProperty({__proto__:null,FILE:hy,HTML:my,TEXT:gy,URL:py},Symbol.toStringTag,{value:"Module"}));function qc(e,t,r){const n=t.reduce((i,o)=>i||e.getData(o),"");return n??r}const y0={[hy]:{exposeProperties:{files:e=>Array.prototype.slice.call(e.files),items:e=>e.items,dataTransfer:e=>e},matchesTypes:["Files"]},[my]:{exposeProperties:{html:(e,t)=>qc(e,t,""),dataTransfer:e=>e},matchesTypes:["Html","text/html"]},[py]:{exposeProperties:{urls:(e,t)=>qc(e,t,"").split(` +`),dataTransfer:e=>e},matchesTypes:["Url","text/uri-list"]},[gy]:{exposeProperties:{text:(e,t)=>qc(e,t,""),dataTransfer:e=>e},matchesTypes:["Text","text/plain"]}};function zk(e,t){const r=y0[e];if(!r)throw new Error(`native type ${e} has no configuration`);const n=new Wk(r);return n.loadDataTransfer(t),n}function Qc(e){if(!e)return null;const t=Array.prototype.slice.call(e.types||[]);return Object.keys(y0).filter(r=>{const n=y0[r];return n!=null&&n.matchesTypes?n.matchesTypes.some(i=>t.indexOf(i)>-1):!1})[0]||null}const Gk=dy(()=>/firefox/i.test(navigator.userAgent)),vy=dy(()=>!!window.safari);class D1{interpolate(t){const{xs:r,ys:n,c1s:i,c2s:o,c3s:a}=this;let s=r.length-1;if(t===r[s])return n[s];let l=0,u=a.length-1,c;for(;l<=u;){c=Math.floor(.5*(l+u));const h=r[c];if(ht)u=c-1;else return n[c]}s=Math.max(0,u);const f=t-r[s],d=f*f;return n[s]+i[s]*f+o[s]*d+a[s]*f*d}constructor(t,r){const{length:n}=t,i=[];for(let h=0;ht[h]{let k=new D1([0,.5,1],[l.y,l.y/c*m,l.y+m-c]).interpolate(d);return vy()&&o&&(k+=(window.devicePixelRatio-1)*m),k},g=()=>new D1([0,.5,1],[l.x,l.x/u*h,l.x+h-u]).interpolate(f),{offsetX:v,offsetY:w}=i,y=v===0||v,E=w===0||w;return{x:y?v:g(),y:E?w:p()}}class qk{get window(){if(this.globalContext)return this.globalContext;if(typeof window<"u")return window}get document(){var t;return!((t=this.globalContext)===null||t===void 0)&&t.document?this.globalContext.document:this.window?this.window.document:void 0}get rootElement(){var t;return((t=this.optionsArgs)===null||t===void 0?void 0:t.rootElement)||this.window}constructor(t,r){this.ownerDocument=null,this.globalContext=t,this.optionsArgs=r}}function Qk(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function P1(e){for(var t=1;t{this.sourcePreviewNodes.delete(t),this.sourcePreviewNodeOptions.delete(t)}}connectDragSource(t,r,n){this.sourceNodes.set(t,r),this.sourceNodeOptions.set(t,n);const i=a=>this.handleDragStart(a,t),o=a=>this.handleSelectStart(a);return r.setAttribute("draggable","true"),r.addEventListener("dragstart",i),r.addEventListener("selectstart",o),()=>{this.sourceNodes.delete(t),this.sourceNodeOptions.delete(t),r.removeEventListener("dragstart",i),r.removeEventListener("selectstart",o),r.setAttribute("draggable","false")}}connectDropTarget(t,r){const n=a=>this.handleDragEnter(a,t),i=a=>this.handleDragOver(a,t),o=a=>this.handleDrop(a,t);return r.addEventListener("dragenter",n),r.addEventListener("dragover",i),r.addEventListener("drop",o),()=>{r.removeEventListener("dragenter",n),r.removeEventListener("dragover",i),r.removeEventListener("drop",o)}}addEventListeners(t){t.addEventListener&&(t.addEventListener("dragstart",this.handleTopDragStart),t.addEventListener("dragstart",this.handleTopDragStartCapture,!0),t.addEventListener("dragend",this.handleTopDragEndCapture,!0),t.addEventListener("dragenter",this.handleTopDragEnter),t.addEventListener("dragenter",this.handleTopDragEnterCapture,!0),t.addEventListener("dragleave",this.handleTopDragLeaveCapture,!0),t.addEventListener("dragover",this.handleTopDragOver),t.addEventListener("dragover",this.handleTopDragOverCapture,!0),t.addEventListener("drop",this.handleTopDrop),t.addEventListener("drop",this.handleTopDropCapture,!0))}removeEventListeners(t){t.removeEventListener&&(t.removeEventListener("dragstart",this.handleTopDragStart),t.removeEventListener("dragstart",this.handleTopDragStartCapture,!0),t.removeEventListener("dragend",this.handleTopDragEndCapture,!0),t.removeEventListener("dragenter",this.handleTopDragEnter),t.removeEventListener("dragenter",this.handleTopDragEnterCapture,!0),t.removeEventListener("dragleave",this.handleTopDragLeaveCapture,!0),t.removeEventListener("dragover",this.handleTopDragOver),t.removeEventListener("dragover",this.handleTopDragOverCapture,!0),t.removeEventListener("drop",this.handleTopDrop),t.removeEventListener("drop",this.handleTopDropCapture,!0))}getCurrentSourceNodeOptions(){const t=this.monitor.getSourceId(),r=this.sourceNodeOptions.get(t);return P1({dropEffect:this.altKeyPressed?"copy":"move"},r||{})}getCurrentDropEffect(){return this.isDraggingNativeItem()?"copy":this.getCurrentSourceNodeOptions().dropEffect}getCurrentSourcePreviewNodeOptions(){const t=this.monitor.getSourceId(),r=this.sourcePreviewNodeOptions.get(t);return P1({anchorX:.5,anchorY:.5,captureDraggingState:!1},r||{})}isDraggingNativeItem(){const t=this.monitor.getItemType();return Object.keys(F1).some(r=>F1[r]===t)}beginDragNativeItem(t,r){this.clearCurrentDragSourceNode(),this.currentNativeSource=zk(t,r),this.currentNativeHandle=this.registry.addSource(t,this.currentNativeSource),this.actions.beginDrag([this.currentNativeHandle])}setCurrentDragSourceNode(t){this.clearCurrentDragSourceNode(),this.currentDragSourceNode=t;const r=1e3;this.mouseMoveTimeoutTimer=setTimeout(()=>{var n;return(n=this.rootElement)===null||n===void 0?void 0:n.addEventListener("mousemove",this.endDragIfSourceWasRemovedFromDOM,!0)},r)}clearCurrentDragSourceNode(){if(this.currentDragSourceNode){if(this.currentDragSourceNode=null,this.rootElement){var t;(t=this.window)===null||t===void 0||t.clearTimeout(this.mouseMoveTimeoutTimer||void 0),this.rootElement.removeEventListener("mousemove",this.endDragIfSourceWasRemovedFromDOM,!0)}return this.mouseMoveTimeoutTimer=null,!0}return!1}handleDragStart(t,r){t.defaultPrevented||(this.dragStartSourceIds||(this.dragStartSourceIds=[]),this.dragStartSourceIds.unshift(r))}handleDragEnter(t,r){this.dragEnterTargetIds.unshift(r)}handleDragOver(t,r){this.dragOverTargetIds===null&&(this.dragOverTargetIds=[]),this.dragOverTargetIds.unshift(r)}handleDrop(t,r){this.dropTargetIds.unshift(r)}constructor(t,r,n){this.sourcePreviewNodes=new Map,this.sourcePreviewNodeOptions=new Map,this.sourceNodes=new Map,this.sourceNodeOptions=new Map,this.dragStartSourceIds=null,this.dropTargetIds=[],this.dragEnterTargetIds=[],this.currentNativeSource=null,this.currentNativeHandle=null,this.currentDragSourceNode=null,this.altKeyPressed=!1,this.mouseMoveTimeoutTimer=null,this.asyncEndDragFrameId=null,this.dragOverTargetIds=null,this.lastClientOffset=null,this.hoverRafId=null,this.getSourceClientOffset=i=>{const o=this.sourceNodes.get(i);return o&&xy(o)||null},this.endDragNativeItem=()=>{this.isDraggingNativeItem()&&(this.actions.endDrag(),this.currentNativeHandle&&this.registry.removeSource(this.currentNativeHandle),this.currentNativeHandle=null,this.currentNativeSource=null)},this.isNodeInDocument=i=>!!(i&&this.document&&this.document.body&&this.document.body.contains(i)),this.endDragIfSourceWasRemovedFromDOM=()=>{const i=this.currentDragSourceNode;i==null||this.isNodeInDocument(i)||(this.clearCurrentDragSourceNode()&&this.monitor.isDragging()&&this.actions.endDrag(),this.cancelHover())},this.scheduleHover=i=>{this.hoverRafId===null&&typeof requestAnimationFrame<"u"&&(this.hoverRafId=requestAnimationFrame(()=>{this.monitor.isDragging()&&this.actions.hover(i||[],{clientOffset:this.lastClientOffset}),this.hoverRafId=null}))},this.cancelHover=()=>{this.hoverRafId!==null&&typeof cancelAnimationFrame<"u"&&(cancelAnimationFrame(this.hoverRafId),this.hoverRafId=null)},this.handleTopDragStartCapture=()=>{this.clearCurrentDragSourceNode(),this.dragStartSourceIds=[]},this.handleTopDragStart=i=>{if(i.defaultPrevented)return;const{dragStartSourceIds:o}=this;this.dragStartSourceIds=null;const a=Xs(i);this.monitor.isDragging()&&(this.actions.endDrag(),this.cancelHover()),this.actions.beginDrag(o||[],{publishSource:!1,getSourceClientOffset:this.getSourceClientOffset,clientOffset:a});const{dataTransfer:s}=i,l=Qc(s);if(this.monitor.isDragging()){if(s&&typeof s.setDragImage=="function"){const c=this.monitor.getSourceId(),f=this.sourceNodes.get(c),d=this.sourcePreviewNodes.get(c)||f;if(d){const{anchorX:h,anchorY:m,offsetX:p,offsetY:g}=this.getCurrentSourcePreviewNodeOptions(),y=Yk(f,d,a,{anchorX:h,anchorY:m},{offsetX:p,offsetY:g});s.setDragImage(d,y.x,y.y)}}try{s==null||s.setData("application/json",{})}catch{}this.setCurrentDragSourceNode(i.target);const{captureDraggingState:u}=this.getCurrentSourcePreviewNodeOptions();u?this.actions.publishDragSource():setTimeout(()=>this.actions.publishDragSource(),0)}else if(l)this.beginDragNativeItem(l);else{if(s&&!s.types&&(i.target&&!i.target.hasAttribute||!i.target.hasAttribute("draggable")))return;i.preventDefault()}},this.handleTopDragEndCapture=()=>{this.clearCurrentDragSourceNode()&&this.monitor.isDragging()&&this.actions.endDrag(),this.cancelHover()},this.handleTopDragEnterCapture=i=>{if(this.dragEnterTargetIds=[],this.isDraggingNativeItem()){var o;(o=this.currentNativeSource)===null||o===void 0||o.loadDataTransfer(i.dataTransfer)}if(!this.enterLeaveCounter.enter(i.target)||this.monitor.isDragging())return;const{dataTransfer:s}=i,l=Qc(s);l&&this.beginDragNativeItem(l,s)},this.handleTopDragEnter=i=>{const{dragEnterTargetIds:o}=this;if(this.dragEnterTargetIds=[],!this.monitor.isDragging())return;this.altKeyPressed=i.altKey,o.length>0&&this.actions.hover(o,{clientOffset:Xs(i)}),o.some(s=>this.monitor.canDropOnTarget(s))&&(i.preventDefault(),i.dataTransfer&&(i.dataTransfer.dropEffect=this.getCurrentDropEffect()))},this.handleTopDragOverCapture=i=>{if(this.dragOverTargetIds=[],this.isDraggingNativeItem()){var o;(o=this.currentNativeSource)===null||o===void 0||o.loadDataTransfer(i.dataTransfer)}},this.handleTopDragOver=i=>{const{dragOverTargetIds:o}=this;if(this.dragOverTargetIds=[],!this.monitor.isDragging()){i.preventDefault(),i.dataTransfer&&(i.dataTransfer.dropEffect="none");return}this.altKeyPressed=i.altKey,this.lastClientOffset=Xs(i),this.scheduleHover(o),(o||[]).some(s=>this.monitor.canDropOnTarget(s))?(i.preventDefault(),i.dataTransfer&&(i.dataTransfer.dropEffect=this.getCurrentDropEffect())):this.isDraggingNativeItem()?i.preventDefault():(i.preventDefault(),i.dataTransfer&&(i.dataTransfer.dropEffect="none"))},this.handleTopDragLeaveCapture=i=>{this.isDraggingNativeItem()&&i.preventDefault(),this.enterLeaveCounter.leave(i.target)&&(this.isDraggingNativeItem()&&setTimeout(()=>this.endDragNativeItem(),0),this.cancelHover())},this.handleTopDropCapture=i=>{if(this.dropTargetIds=[],this.isDraggingNativeItem()){var o;i.preventDefault(),(o=this.currentNativeSource)===null||o===void 0||o.loadDataTransfer(i.dataTransfer)}else Qc(i.dataTransfer)&&i.preventDefault();this.enterLeaveCounter.reset()},this.handleTopDrop=i=>{const{dropTargetIds:o}=this;this.dropTargetIds=[],this.actions.hover(o,{clientOffset:Xs(i)}),this.actions.drop({dropEffect:this.getCurrentDropEffect()}),this.isDraggingNativeItem()?this.endDragNativeItem():this.monitor.isDragging()&&this.actions.endDrag(),this.cancelHover()},this.handleSelectStart=i=>{const o=i.target;typeof o.dragDrop=="function"&&(o.tagName==="INPUT"||o.tagName==="SELECT"||o.tagName==="TEXTAREA"||o.isContentEditable||(i.preventDefault(),o.dragDrop()))},this.options=new qk(r,n),this.actions=t.getActions(),this.monitor=t.getMonitor(),this.registry=t.getRegistry(),this.enterLeaveCounter=new Vk(this.isNodeInDocument)}}const Jk=function(t,r,n){return new Zk(t,r,n)};function e$(){const[e,t]=x.useState(null),[r,n]=x.useState("Interactive Table");x.useEffect(()=>{const a=setInterval(()=>{if(window.json_data){const s=JSON.parse(window.json_data);console.log(s),t(s),s.title&&typeof s.title=="string"&&n(s.title),clearInterval(a)}},100);return()=>clearInterval(a)},[]);const o=(a=>{var h;if(!a)return null;const s=(h=a.title)==null?void 0:h.replace(/|<\/b>/g,"").replace(/ /g,"_"),l=new Date().toISOString().slice(0,10).replace(/-/g,""),u=new Date().toISOString().slice(11,19).replace(/:/g,"");window.title=`openbb_${s}_${l}_${u}`;const c=a.columns;a.index;const d=a.data.map((m,p)=>{const g={};return m.forEach((v,w)=>{g[c[w]]=v||(v===0?0:"")}),g});return{columns:c,data:d}})(e);return X("div",{className:"relative h-full bg-white dark:bg-black text-black dark:text-white",children:X(b8,{backend:Jk,children:o&&X(Bk,{title:r,data:o.data,columns:o.columns,initialTheme:e.theme&&typeof e.theme=="string"&&e.theme==="dark"?"dark":"light",cmd:(e==null?void 0:e.command_location)??""})})})}Ov.render(X(or.StrictMode,{children:X(e$,{})}),document.getElementById("root")); + + + + + +
+ + + diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/core/to_chart.py b/openbb_platform/obbject_extensions/charting/openbb_charting/core/to_chart.py index 3c84018c3e4..affcde5929b 100644 --- a/openbb_platform/obbject_extensions/charting/openbb_charting/core/to_chart.py +++ b/openbb_platform/obbject_extensions/charting/openbb_charting/core/to_chart.py @@ -18,8 +18,7 @@ def to_chart( prepost: bool = False, volume_ticks_x: int = 7, ) -> Tuple[OpenBBFigure, Dict[str, Any]]: - """ - Returns the plotly json representation of the chart. + """Return the plotly json representation of the chart. This function is used so it can be called at the module level and used out of the box, which allows some more flexibility, ease of use and doesn't require the user to know diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/query_params.py b/openbb_platform/obbject_extensions/charting/openbb_charting/query_params.py index 0ae69972dc3..db8274042c0 100644 --- a/openbb_platform/obbject_extensions/charting/openbb_charting/query_params.py +++ b/openbb_platform/obbject_extensions/charting/openbb_charting/query_params.py @@ -1,47 +1,178 @@ """Charting Extension Query Params.""" -from typing import List, Optional, Union +# pylint: disable=unused-variable,unused-argument + +from typing import Any, Dict, List, Literal, Optional, Union from openbb_core.provider.abstract.data import Data from openbb_core.provider.abstract.query_params import QueryParams -from pydantic import Field +from pydantic import Field, model_validator + +from openbb_charting.core.to_chart import ChartIndicators + +MAMODES = Literal["ema", "sma", "wma", "hna", "zlma", "rma"] -class FredSeriesChartQueryParams(QueryParams): - """ - FRED Series Chart Query Params. +def _get_type_name(t): + """Get the type name of a type hint.""" + if hasattr(t, "__origin__"): + if hasattr(t.__origin__, "__name__"): + return f"{t.__origin__.__name__}[{', '.join([_get_type_name(arg) for arg in t.__args__])}]" + if hasattr(t.__origin__, "_name"): + return f"{t.__origin__._name}[{', '.join([_get_type_name(arg) for arg in t.__args__])}]" # pylint: disable=W0212 + if isinstance(t, str): + return t + if hasattr(t, "__name__"): + return t.__name__ + if hasattr(t, "_name"): + return t._name # pylint: disable=W0212 + return str(t) - kwargs - ------ - data : List[Data], optional - Filtered versions of the data contained in the original results. - Example use is to reduce the number of columns or the length of data to plot. - To supply additional columns, set `allow_unsafe = True`. - title : str, optional - Title of the chart. - y1title : str, optional - Right Y-axis title. - y2title : str, optional - Left Y-axis title. - xtitle : str, optional - X-axis title. - dropnan: bool, optional (default: True) - If True, rows containing NaN will be dropped. - normalize: bool, optional (default: False) - If True, the data will be normalized and placed on the same axis. - allow_unsafe: bool, optional (default: False) - If True, the method will attempt to pass all supplied data to the chart constructor. - This can result in unexpected behavior. - """ +class BaseQueryParams(QueryParams): + """Base Query Parmams Base Model.""" + + def __init__(self, **data): + """Initialize the BaseQueryParams.""" + super().__init__(**data) + self.__doc__ = self.__repr__() + + def __repr__(self): + """Return the string representation of the model.""" + fields = self.__class__.model_fields + repr_str = ( + "\n" + + self.__class__.__name__ + + "\n\n" + + " Parameters\n" + + " ----------\n" + + "\n".join( + [ + f"\n {k} : {_get_type_name(v.annotation)}\n {v.description}".replace( + ". ", ".\n " + ) + for k, v in fields.items() + ] + ) + ) + return repr_str + + +class ChartQueryParams(BaseQueryParams): + """ChartParams.""" data: Optional[Union[Data, List[Data]]] = Field( default=None, description="Filtered versions of the data contained in the original `self.results`." + " Columns should be the same as the original data." - + " Example use is to reduce the number of columns or the length of data to plot." - + " To supply additional columns, set `allow_unsafe = True`.", + + " Example use is to reduce the number of columns, or the length of data, to plot.", ) + + +class EquityPricePerformanceChartQueryParams(ChartQueryParams): + """Equity Price Performance Chart Query Params.""" + + title: Optional[str] = Field( + default=None, + description="Title of the chart.", + ) + orientation: Literal["v", "h"] = Field( + default="v", + description="Orientation of the bars.", + ) + limit: Optional[int] = Field( + default=None, + description="Limit the number of bars to plot, from the most recent." + + " If None, the periods from one-day to five-years will be plotted, if available.", + ) + layout_kwargs: Optional[Dict[str, Any]] = Field( + default=None, + description="Additional keyword arguments to pass to the Plotly `update_layout` method.", + ) + + +class EtfPricePerformanceChartQueryParams(EquityPricePerformanceChartQueryParams): + """ETF Price Performance Chart Query Params.""" + + +class EtfHoldingsChartQueryParams(ChartQueryParams): + """ "ETF Holdings Chart Query Params.""" + + title: Optional[str] = Field( + default=None, + description="Title of the chart.", + ) + orientation: Literal["v", "h"] = Field( + default="v", + description="Orientation of the bars.", + ) + limit: Optional[int] = Field( + default=20, + description="Limit the number of bars to plot, ranked by top weighting.", + ) + layout_kwargs: Optional[Dict[str, Any]] = Field( + default=None, + description="Additional keyword arguments to pass to the Plotly `update_layout` method.", + ) + + +class EquityPriceHistoricalChartQueryParams(ChartQueryParams): + """Equity Historical Price Chart Query Params.""" + + title: Optional[str] = Field( + default=None, + description="Title of the chart.", + ) + target: Optional[str] = Field( + default=None, + description="The specific column to target. If supplied, this will override the candles and volume parameters.", + ) + multi_symbol: bool = Field( + default=False, + description="Flag to indicate whether the data contains multiple symbols." + + " This is mostly handled automatically, but if the chart fails to generate try setting this to True.", + ) + same_axis: bool = Field( + default=False, + description="If True, forces all data to be plotted on the same axis.", + ) + normalize: bool = Field( + default=False, + description="If True, the data will be normalized and placed on the same axis.", + ) + returns: bool = Field( + default=False, + description="If True, the cumulative returns for the length of the time series will be calculated and plotted.", + ) + candles: bool = Field( + default=True, + description="If True, and OHLC exists, and there is only one symbol in the data, candles will be plotted.", + ) + heikin_ashi: bool = Field( + default=False, + description="If True, and `candles=True`, Heikin Ashi candles will be plotted.", + ) + volume: bool = Field( + default=True, + description="If True, and volume exists, and `candles=True`, volume will be plotted.", + ) + indicators: Optional[Union[ChartIndicators, Dict[str, Dict[str, Any]]]] = Field( + default=None, + description="Indicators to be plotted, formatted as a dictionary." + + " Data containing multiple symbols will ignore indicators." + + """ + Example: + indicators = dict( + sma=dict(length=[20,30,50]), + adx=dict(length=14), + rsi=dict(length=14), + )""", + ) + + +class EconomyFredSeriesChartQueryParams(ChartQueryParams): + """FRED Series Chart Query Params.""" + title: Optional[str] = Field( default=None, description="Title of the chart.", @@ -71,30 +202,25 @@ class FredSeriesChartQueryParams(QueryParams): description="If True, the method will attempt to pass all supplied data to the chart constructor." + " This can result in unexpected behavior.", ) - - -class TechnicalConesChartQueryParams(QueryParams): - """ - Technical Cones Chart Query Params. - - kwargs - ------ - - data : List[Data], optional - Filtered versions of the data contained in the original results. - Example use is to reduce the number of windows to plot. - title : str, optional - Title of the chart. - symbol: str, optional - Symbol represented by the data. Used to label the chart. - """ - - data: Optional[Union[Data, List[Data]]] = Field( - default=None, - description="Filtered versions of the data contained in the original results." - + " Columns should be the same as the original data." - + " Example use is to reduce the number of columns or the length of data to plot.", + plot_bar: bool = Field( + default=False, + description="If True, a bar chart will be plotted instead of a line." + + " If multiple units of measure are present, they will be normalized and plotted on the same axis.", ) + barmode: Literal["stack", "group", "relative"] = Field( + default="group", + description="The mode to use for the bar chart, by default is 'group'." + + " Has no effect if `bar=False`.", + ) + layout_kwargs: Optional[Dict[str, Any]] = Field( + default=None, + description="Additional keyword arguments to pass to the Plotly `update_layout` method.", + ) + + +class TechnicalConesChartQueryParams(ChartQueryParams): + """Technical Cones Chart Query Params.""" + title: Optional[str] = Field( default=None, description="Title of the chart.", @@ -103,3 +229,606 @@ class TechnicalConesChartQueryParams(QueryParams): default=None, description="Symbol represented by the data. Used to label the chart.", ) + + +class MAQueryParams(ChartQueryParams): + """Moving Average Query Params.""" + + target: str = Field( + default="close", + description="The column to calculate the moving average on.", + ) + index: str = Field( + default="date", + description="The index column.", + ) + length: Optional[Union[int, List[int]]] = Field( + default=50, + description="Window length for the moving average." + "+ The number is relative to the interval of the time series data.", + ) + offset: Optional[int] = Field( + default=0, + description="Number of periods to offset for the moving average.", + ) + dropnan: bool = Field( + default=False, + description="If True, rows containing NaN will be dropped." + + " This will reduce the length of the charted data by the longest window.", + ) + symbol: Optional[str] = Field( + default=None, + description="Symbol represented by the data. Used to label the chart.", + ) + + +class TechnicalSMAChartQueryParams(MAQueryParams): + """Technical SMA Chart Query Params.""" + + +class TechnicalEMAChartQueryParams(MAQueryParams): + """Technical EMA Chart Query Params.""" + + +class TechnicalHMAChartQueryParams(MAQueryParams): + """Technical HMA Chart Query Params.""" + + +class TechnicalWMAChartQueryParams(MAQueryParams): + """Technical WMA Chart Query Params.""" + + +class TechnicalZLMAChartQueryParams(MAQueryParams): + """Technical ZLMA Chart Query Params.""" + + +class TechnicalADXChartQueryParams(ChartQueryParams): + """Technical ADX Chart Query Params.""" + + length: Optional[int] = Field( + default=50, + description="Window length for the ADX, by default is 50.", + ) + scalar: Optional[float] = Field( + default=100, + description="Scalar to multiply the ADX by, default is 100.", + ) + drift: Optional[int] = Field( + default=1, + description="Drift value for the ADX, by default is 1.", + ) + + +class TechnicalArooonChartQueryParams(ChartQueryParams): + """Technical Aroon Chart Query Params.""" + + length: Optional[int] = Field( + default=25, + description="Window length for the Aroon, by default is 50.", + ) + scalar: Optional[float] = Field( + default=100, + description="Scalar to multiply the Aroon by, default is 100.", + ) + + +class TechnicalMACDChartQueryParams(ChartQueryParams): + """Technical MACD Chart Query Params.""" + + fast: Optional[int] = Field( + default=12, + description="Window length for the fast EMA, by default is 12.", + ) + slow: Optional[int] = Field( + default=26, + description="Window length for the slow EMA, by default is 26.", + ) + signal: Optional[int] = Field( + default=9, + description="Window length for the signal line, by default is 9.", + ) + scalar: Optional[float] = Field( + default=100, + description="Scalar to multiply the MACD by, default is 100.", + ) + + +class TechnicalRSIChartQueryParams(ChartQueryParams): + """Technical RSI Chart Query Params.""" + + length: Optional[int] = Field( + default=14, + description="Window length for the RSI, by default is 14.", + ) + scalar: Optional[float] = Field( + default=100, + description="Scalar to multiply the RSI by, default is 100.", + ) + drift: Optional[int] = Field( + default=1, + description="Drift value for the RSI, by default is 1.", + ) + + +class TechnicalRelativeRotationChartQueryParams(ChartQueryParams): + """Technical Relative Rotation Chart Query Params.""" + + date: Optional[str] = Field( + default=None, + description="A target end date within the data to use for the chart, by default is the last date in the data.", + ) + show_tails: bool = Field( + default=True, + description="Show the tails on the chart, by default True.", + ) + tail_periods: Optional[int] = Field( + default=16, + description="Number of periods to show in the tails, by default 16.", + ) + tail_interval: Literal["day", "week", "month"] = Field( + default="week", + description="The interval to show the tails, by default 'week'.", + ) + title: Optional[str] = Field( + default=None, + description="Title of the chart.", + ) + + +class ChartParams: + """Chart Query Params.""" + + crypto_price_historical = EquityPriceHistoricalChartQueryParams + equity_price_historical = EquityPriceHistoricalChartQueryParams + economy_fred_series = EconomyFredSeriesChartQueryParams + equity_price_historical = EquityPriceHistoricalChartQueryParams + equity_price_performance = EquityPricePerformanceChartQueryParams + etf_historical = EtfPricePerformanceChartQueryParams + etf_holdings = EtfHoldingsChartQueryParams + etf_price_performance = EquityPricePerformanceChartQueryParams + index_price_historical = EquityPriceHistoricalChartQueryParams + technical_adx = TechnicalADXChartQueryParams + technical_aroon = TechnicalArooonChartQueryParams + technical_cones = TechnicalConesChartQueryParams + technical_ema = TechnicalEMAChartQueryParams + technical_hma = TechnicalHMAChartQueryParams + technical_macd = TechnicalMACDChartQueryParams + technical_relative_rotation = TechnicalRelativeRotationChartQueryParams + technical_rsi = TechnicalRSIChartQueryParams + technical_sma = TechnicalSMAChartQueryParams + technical_wma = TechnicalWMAChartQueryParams + technical_zlma = TechnicalZLMAChartQueryParams + + +class IndicatorsQueryParams(BaseQueryParams): + """Indicators Query Params.""" + + +class MAIndicatorsQueryParams(IndicatorsQueryParams): + """Moving Average Indicators Query Params.""" + + length: Union[int, List[int]] = Field( + default=50, + description="Window length for the moving average, by default is 50." + + " The number is relative to the interval of the time series data.", + ) + offset: int = Field( + default=0, + description="Number of periods to offset for the moving average, by default is 0.", + ) + + +class SMAIndicatorsQueryParams(MAIndicatorsQueryParams): + """Simple Moving Average Indicators Query Params.""" + + +class EMAIndicatorsQueryParams(MAIndicatorsQueryParams): + """Exponential Moving Average Indicators Query Params.""" + + +class HMAIndicatorsQueryParams(MAIndicatorsQueryParams): + """Hull Moving Average Indicators Query Params.""" + + +class WMAIndicatorsQueryParams(MAIndicatorsQueryParams): + """Weighted Moving Average Indicators Query Params.""" + + +class ZLMAIndicatorsQueryParams(MAIndicatorsQueryParams): + """Zero-Lag Moving Average Indicators Query Params.""" + + +class ADIndicatorsQueryParams(IndicatorsQueryParams): + """Accumulation/Distribution Indicators Query Params.""" + + offset: int = Field( + default=0, + description="Offset value for the AD, by default is 0.", + ) + + +class ADOscillatorIndicatorsQueryParams(IndicatorsQueryParams): + """Accumulation/Distribution Oscillator Indicators Query Params.""" + + fast: int = Field( + default=3, + description="Number of periods to use for the fast calculation, by default 3.", + ) + slow: int = Field( + default=10, + description="Number of periods to use for the slow calculation, by default 10.", + ) + offset: int = Field( + default=0, + description="Offset to be used for the calculation, by default is 0.", + ) + + +class ADXIndicatorsQueryParams(IndicatorsQueryParams): + """Average Directional Index Indicators Query Params.""" + + length: int = Field( + default=50, + description="Window length for the ADX, by default is 50.", + ) + scalar: float = Field( + default=100, + description="Scalar to multiply the ADX by, default is 100.", + ) + drift: int = Field( + default=1, + description="Drift value for the ADX, by default is 1.", + ) + + +class AroonIndicatorsQueryParams(IndicatorsQueryParams): + """Aroon Indicators Query Params.""" + + length: int = Field( + default=25, + description="Window length for the Aroon, by default is 50.", + ) + scalar: float = Field( + default=100, + description="Scalar to multiply the Aroon by, default is 100.", + ) + + +class ATRIndicatorsQueryParams(IndicatorsQueryParams): + """Average True Range Indicators Query Params.""" + + length: int = Field( + default=14, + description="Window length for the ATR, by default is 14.", + ) + mamode: Literal["rma", "ema", "sma", "wma"] = Field( + default="rma", + description="The mode to use for the moving average calculation.", + ) + drift: int = Field( + default=1, + description="The difference period.", + ) + offset: int = Field( + default=0, + description="Number of periods to offset the result, by default is 0.", + ) + + +class CCIIndicatorsQueryParams(IndicatorsQueryParams): + """Commodity Channel Index Indicators Query Params.""" + + length: int = Field( + default=14, + description="Window length for the CCI, by default is 14.", + ) + scalar: float = Field( + default=0.015, + description="Scalar to multiply the CCI by, default is 0.015.", + ) + + +class DonchianIndicatorsQueryParams(IndicatorsQueryParams): + """Donchian Channel Indicators Query Params.""" + + lower: Optional[int] = Field( + default=20, + description="Window length for the lower band, by default is 20.", + ) + upper: Optional[int] = Field( + default=20, + description="Window length for the upper band, by default is 20.", + ) + offset: Optional[int] = Field( + default=0, + description="Number of periods to offset the result, by default is 0.", + ) + + +class FisherIndicatorsQueryParams(IndicatorsQueryParams): + """Fisher Transform Indicators Query Params.""" + + length: int = Field( + default=14, + description="Window length for the Fisher Transform, by default is 14.", + ) + signal: int = Field( + default=1, + description="Fisher Signal Period", + ) + + +class KCIndicatorsQueryParams(IndicatorsQueryParams): + """Keltner Channel Indicators Query Params.""" + + length: int = Field( + default=20, + description="Window length for the Keltner Channel, by default is 20.", + ) + scalar: float = Field( + default=2, + description="Scalar to multiply the ATR, by default is 2.", + ) + mamode: MAMODES = Field( + default="rma", + description="The mode to use for the moving average calculation, by default is ema.", + ) + offset: int = Field( + default=0, + description="Number of periods to offset the result, by default is 0.", + ) + + +class MACDIndicatorsQueryParams(IndicatorsQueryParams): + """MACD Indicators Query Params.""" + + fast: Optional[int] = Field( + default=12, + description="Window length for the fast EMA, by default is 12.", + ) + slow: Optional[int] = Field( + default=26, + description="Window length for the slow EMA, by default is 26.", + ) + signal: Optional[int] = Field( + default=9, + description="Window length for the signal line, by default is 9.", + ) + scalar: Optional[float] = Field( + default=100, + description="Scalar to multiply the MACD by, default is 100.", + ) + + +class OBVIndicatorsQueryParams(IndicatorsQueryParams): + """On Balance Volume Indicators Query Params.""" + + offset: int = Field( + default=0, + description="Number of periods to offset the result, by default is 0.", + ) + + +class RSIIndicatorsQueryParams(IndicatorsQueryParams): + """RSI Indicators Query Params.""" + + length: int = Field( + default=14, + description="Window length for the RSI, by default is 14.", + ) + scalar: float = Field( + default=100, + description="Scalar to multiply the RSI by, default is 100.", + ) + drift: int = Field( + default=1, + description="Drift value for the RSI, by default is 1.", + ) + + +class StochIndicatorsQueryParams(IndicatorsQueryParams): + """Stochastic Oscillator Indicators Query Params.""" + + fast_k: int = Field( + default=14, + description="The fast K period, by default 14.", + ) + slow_d: int = Field( + default=3, + description="The slow D period, by default 3.", + ) + slow_k: int = Field( + default=3, + description="The slow K period, by default 3.", + ) + + +class FibIndicatorsQueryParams(IndicatorsQueryParams): + """Fibonacci Retracement Indicators Query Params.""" + + period: int = Field( + default=120, + description="The period to calculate the Fibonacci Retracement, by default 120.", + ) + start_date: Optional[str] = Field( + default=None, + description="The start date for the Fibonacci Retracement.", + ) + end_date: Optional[str] = Field( + default=None, + description="The end date for the Fibonacci Retracement.", + ) + + +class ClenowIndicatorsQueryParams(IndicatorsQueryParams): + """Clenow Volatility Adjusted Momentum Indicators Query Params.""" + + period: int = Field( + default=90, + description="The number of periods for the momentum, by default 90.", + ) + + +class DemarkIndicatorsQueryParams(IndicatorsQueryParams): + """Demark Indicators Query Params.""" + + show_all: bool = Field( + default=False, + description="Show 1 - 13. If set to False, show 6 - 9.", + ) + offset: int = Field( + default=0, + description="Number of periods to offset the result, by default is 0.", + ) + + +class IchimokuIndicatorsQueryParams(IndicatorsQueryParams): + """Ichimoku Cloud Indicators Query Params.""" + + conversion: int = Field( + default=9, + description="The conversion line period, by default 9.", + ) + base: int = Field( + default=26, + description="The base line period, by default 26.", + ) + lagging: int = Field( + default=52, + description="The lagging line period, by default 52.", + ) + offset: int = Field( + default=26, + description="The offset period, by default 26.", + ) + lookahead: bool = Field( + default=False, + description="Drops the Chikou Span Column to prevent potential data leak", + ) + + +class SRLinesIndicatorsQueryParams(IndicatorsQueryParams): + """Support and Resistance Lines Indicators Query Params.""" + + show: bool = Field( + default=True, + description="Show the support and resistance lines.", + ) + + +class IndicatorsParams(QueryParams): + """Indicators Query Params.""" + + sma: SMAIndicatorsQueryParams = Field( + default=SMAIndicatorsQueryParams(), + description=repr(SMAIndicatorsQueryParams()), + ) + ema: EMAIndicatorsQueryParams = Field( + default=EMAIndicatorsQueryParams(), + description=repr(EMAIndicatorsQueryParams()), + ) + hma: HMAIndicatorsQueryParams = Field( + default=HMAIndicatorsQueryParams(), + description=repr(HMAIndicatorsQueryParams()), + ) + wma: WMAIndicatorsQueryParams = Field( + default=WMAIndicatorsQueryParams(), + description=repr(WMAIndicatorsQueryParams()), + ) + zlma: ZLMAIndicatorsQueryParams = Field( + default=ZLMAIndicatorsQueryParams(), + description=repr(ZLMAIndicatorsQueryParams()), + ) + ad: ADIndicatorsQueryParams = Field( + default=ADIndicatorsQueryParams(), + description=repr(ADIndicatorsQueryParams()), + ) + adoscillator: ADOscillatorIndicatorsQueryParams = Field( + default=ADOscillatorIndicatorsQueryParams(), + description=repr(ADOscillatorIndicatorsQueryParams()), + ) + adx: ADXIndicatorsQueryParams = Field( + default=ADXIndicatorsQueryParams(), + description=repr(ADXIndicatorsQueryParams()), + ) + aroon: AroonIndicatorsQueryParams = Field( + default=AroonIndicatorsQueryParams(), + description=repr(AroonIndicatorsQueryParams()), + ) + atr: ATRIndicatorsQueryParams = Field( + default=ATRIndicatorsQueryParams(), + description=repr(ATRIndicatorsQueryParams()), + ) + cci: CCIIndicatorsQueryParams = Field( + default=CCIIndicatorsQueryParams(), + description=repr(CCIIndicatorsQueryParams()), + ) + clenow: ClenowIndicatorsQueryParams = Field( + default=ClenowIndicatorsQueryParams(), + description=repr(ClenowIndicatorsQueryParams()), + ) + demark: DemarkIndicatorsQueryParams = Field( + default=DemarkIndicatorsQueryParams(), + description=repr(DemarkIndicatorsQueryParams()), + ) + donchian: DonchianIndicatorsQueryParams = Field( + default=DonchianIndicatorsQueryParams(), + description=repr(DonchianIndicatorsQueryParams()), + ) + fib: FibIndicatorsQueryParams = Field( + default=FibIndicatorsQueryParams(), + description=repr(FibIndicatorsQueryParams()), + ) + fisher: FisherIndicatorsQueryParams = Field( + default=FisherIndicatorsQueryParams(), + description=repr(FisherIndicatorsQueryParams()), + ) + ichimoku: IchimokuIndicatorsQueryParams = Field( + default=IchimokuIndicatorsQueryParams(), + description=repr(IchimokuIndicatorsQueryParams()), + ) + kc: KCIndicatorsQueryParams = Field( + default=KCIndicatorsQueryParams(), + description=repr(KCIndicatorsQueryParams()), + ) + macd: MACDIndicatorsQueryParams = Field( + default=MACDIndicatorsQueryParams(), + description=repr(MACDIndicatorsQueryParams()), + ) + obv: OBVIndicatorsQueryParams = Field( + default=OBVIndicatorsQueryParams(), + description=repr(OBVIndicatorsQueryParams()), + ) + rsi: RSIIndicatorsQueryParams = Field( + default=RSIIndicatorsQueryParams(), + description=repr(RSIIndicatorsQueryParams()), + ) + srlines: SRLinesIndicatorsQueryParams = Field( + default=SRLinesIndicatorsQueryParams(), + description=repr(SRLinesIndicatorsQueryParams()), + ) + stoch: StochIndicatorsQueryParams = Field( + default=StochIndicatorsQueryParams(), + description=repr(StochIndicatorsQueryParams()), + ) + + def __repr__(self): + """Return the string representation of the model.""" + fields = self.__class__.model_fields + repr_str = "\n" + "\n".join( + [ + f"{str(v.description).replace('IndicatorsQueryParams', ':').replace('ADOs', 'AD Os')}" + for k, v in fields.items() + ] + ) + return repr_str + + @model_validator(mode="before") + @classmethod + def validate_model(cls, values): + """Validate the model.""" + indicators = list(ChartIndicators.get_available_indicators()) + for k, v in values.items(): + if k not in indicators: + raise ValueError(f"{k} is not a valid indicator.") + return values diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/styles/__init__.py b/openbb_platform/obbject_extensions/charting/openbb_charting/styles/__init__.py new file mode 100644 index 00000000000..05f805d0904 --- /dev/null +++ b/openbb_platform/obbject_extensions/charting/openbb_charting/styles/__init__.py @@ -0,0 +1 @@ +"""Charting Extension Styles""" diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/styles/colors.py b/openbb_platform/obbject_extensions/charting/openbb_charting/styles/colors.py new file mode 100644 index 00000000000..d904c0e7be0 --- /dev/null +++ b/openbb_platform/obbject_extensions/charting/openbb_charting/styles/colors.py @@ -0,0 +1,39 @@ +"""Color Palettes and Sequences for OpenBB Charting""" + +LARGE_CYCLER = [ + "#1f77b4", + "#7f7f7f", + "#ff7f0e", + "#2ca02c", + "#d62728", + "#9467bd", + "#8c564b", + "#e377c2", + "#bcbd22", + "#17becf", + "burlywood", + "magenta", + "cyan", + "yellowgreen", + "#aec7e8", + "#ffbb78", + "#ff9896", + "#c5b0d5", + "#c49c94", + "#f7b6d2", + "#c7c7c7", + "#dbdb8d", + "#9edae5", + "#7e7e7e", + "#1b9e77", + "#d95f02", + "#7570b3", + "#e7298a", + "#66a61e", + "#e6ab02", + "#a6761d", + "#666666", + "#f0027f", + "#bf5b17", + "#d9f202", +] diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/styles/default/dark.pltstyle.json b/openbb_platform/obbject_extensions/charting/openbb_charting/styles/default/dark.pltstyle.json index f1f75a99fa2..d5d75ac6826 100644 --- a/openbb_platform/obbject_extensions/charting/openbb_charting/styles/default/dark.pltstyle.json +++ b/openbb_platform/obbject_extensions/charting/openbb_charting/styles/default/dark.pltstyle.json @@ -30,22 +30,26 @@ }, "autotypenumbers": "strict", "colorway": [ - "#ffed00", - "#ef7d00", - "#e4003a", - "#c13246", - "#822661", - "#48277c", - "#005ca9", - "#00aaff", - "#9b30d9", - "#af005f", - "#5f00af", - "#af87ff" + "#1f77b4", + "#ff7f0e", + "#2ca02c", + "#d62728", + "#9467bd", + "#8c564b", + "#e377c2", + "#bcbd22", + "#17becf", + "#aec7e8", + "#ffbb78", + "#ff9896", + "#c5b0d5", + "#f7b6d2", + "#dbdb8d", + "#9edae5" ], "dragmode": "pan", "font": { - "family": "Fira Code", + "family": "Arial", "size": 18 }, "hoverlabel": { @@ -56,13 +60,13 @@ }, "hovermode": "x", "legend": { - "bgcolor": "rgba(0, 0, 0, 0.5)", - "x": 0.01, - "xanchor": "left", - "y": 0.99, - "yanchor": "top", + "bgcolor": "rgba(0, 0, 0, 0)", + "x": 1, + "xanchor": "right", + "y": 1.02, + "yanchor": "bottom", "font": { - "size": 15 + "size": 12 } }, "legend2": { @@ -105,7 +109,10 @@ "zeroline": false, "tick0": 1, "title": { - "standoff": 20 + "standoff": 20, + "font": { + "size": 16 + } }, "linecolor": "#F5EFF3", "mirror": true, @@ -121,9 +128,13 @@ "side": "right", "tick0": 0.5, "title": { - "standoff": 20 + "standoff": 20, + "font": { + "size": 16 + } }, - "gridcolor": "#283442", + + "gridcolor": "rgba(128, 128, 128, 0.33)", "linecolor": "#F5EFF3", "mirror": true, "ticks": "outside" diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/styles/default/light.pltstyle.json b/openbb_platform/obbject_extensions/charting/openbb_charting/styles/default/light.pltstyle.json index 6572f11da1a..4f3198c4989 100644 --- a/openbb_platform/obbject_extensions/charting/openbb_charting/styles/default/light.pltstyle.json +++ b/openbb_platform/obbject_extensions/charting/openbb_charting/styles/default/light.pltstyle.json @@ -1,569 +1,23 @@ { "line": { - "up_color": "#009600", - "down_color": "#c80000", - "color": "#0d0887", - "width": 1.5, - "down_color_transparent": "rgba(200, 0, 0, 0.4)", - "up_color_transparent": "rgba(0, 150, 0, 0.4)" + "up_color": "#0074D9", + "down_color": "#FF4136", + "color": "#111111", + "width": 1.5 }, "data": { - "barpolar": [ - { - "marker": { - "line": { - "color": "white", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "barpolar" - } - ], - "bar": [ - { - "error_x": { - "color": "#2a3f5f" - }, - "error_y": { - "color": "#2a3f5f" - }, - "marker": { - "line": { - "color": "white", - "width": 0.5 - }, - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "bar" - } - ], - "carpet": [ - { - "aaxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "#C8D4E3", - "linecolor": "#C8D4E3", - "minorgridcolor": "#C8D4E3", - "startlinecolor": "#2a3f5f" - }, - "baxis": { - "endlinecolor": "#2a3f5f", - "gridcolor": "#C8D4E3", - "linecolor": "#C8D4E3", - "minorgridcolor": "#C8D4E3", - "startlinecolor": "#2a3f5f" - }, - "type": "carpet" - } - ], - "choropleth": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "choropleth" - } - ], - "contourcarpet": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "contourcarpet" - } - ], - "contour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0.0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1.0, - "#f0f921" - ] - ], - "type": "contour" - } - ], - "heatmapgl": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0.0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1.0, - "#f0f921" - ] - ], - "type": "heatmapgl" - } - ], - "heatmap": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0.0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1.0, - "#f0f921" - ] - ], - "type": "heatmap" - } - ], - "histogram2dcontour": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0.0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1.0, - "#f0f921" - ] - ], - "type": "histogram2dcontour" - } - ], - "histogram2d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0.0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1.0, - "#f0f921" - ] - ], - "type": "histogram2d" - } - ], - "histogram": [ - { - "marker": { - "pattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - } - }, - "type": "histogram" - } - ], - "mesh3d": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "type": "mesh3d" - } - ], - "parcoords": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "parcoords" - } - ], - "pie": [ - { - "automargin": true, - "type": "pie" - } - ], - "scatter3d": [ - { - "line": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatter3d" - } - ], - "scattercarpet": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattercarpet" - } - ], - "scattergeo": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergeo" - } - ], - "scattergl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattergl" - } - ], - "scattermapbox": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scattermapbox" - } - ], - "scatterpolargl": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolargl" - } - ], - "scatterpolar": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterpolar" - } - ], - "scatter": [ - { - "fillpattern": { - "fillmode": "overlay", - "size": 10, - "solidity": 0.2 - }, - "type": "scatter" - } - ], - "scatterternary": [ - { - "marker": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "type": "scatterternary" - } - ], - "surface": [ - { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - }, - "colorscale": [ - [ - 0.0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1.0, - "#f0f921" - ] - ], - "type": "surface" - } - ], - "table": [ - { - "cells": { - "fill": { - "color": "#EBF0F8" - }, - "line": { - "color": "white" - } - }, - "header": { - "fill": { - "color": "#C8D4E3" - }, - "line": { - "color": "white" - } - }, - "type": "table" - } - ], "candlestick": [ { "decreasing": { - "fillcolor": "#c80000", + "fillcolor": "#e4003a", "line": { - "color": "#990000" + "color": "#e4003a" } }, "increasing": { - "fillcolor": "#009600", + "fillcolor": "#00ACFF", "line": { - "color": "#007500" + "color": "#00ACFF" } }, "type": "candlestick" @@ -572,300 +26,117 @@ }, "layout": { "annotationdefaults": { - "arrowcolor": "#2a3f5f", - "arrowhead": 0, - "arrowwidth": 1, "showarrow": false }, "autotypenumbers": "strict", - "coloraxis": { - "colorbar": { - "outlinewidth": 0, - "ticks": "" - } - }, - "colorscale": { - "diverging": [ - [ - 0, - "#8e0152" - ], - [ - 0.1, - "#c51b7d" - ], - [ - 0.2, - "#de77ae" - ], - [ - 0.3, - "#f1b6da" - ], - [ - 0.4, - "#fde0ef" - ], - [ - 0.5, - "#f7f7f7" - ], - [ - 0.6, - "#e6f5d0" - ], - [ - 0.7, - "#b8e186" - ], - [ - 0.8, - "#7fbc41" - ], - [ - 0.9, - "#4d9221" - ], - [ - 1, - "#276419" - ] - ], - "sequential": [ - [ - 0.0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1.0, - "#f0f921" - ] - ], - "sequentialminus": [ - [ - 0.0, - "#0d0887" - ], - [ - 0.1111111111111111, - "#46039f" - ], - [ - 0.2222222222222222, - "#7201a8" - ], - [ - 0.3333333333333333, - "#9c179e" - ], - [ - 0.4444444444444444, - "#bd3786" - ], - [ - 0.5555555555555556, - "#d8576b" - ], - [ - 0.6666666666666666, - "#ed7953" - ], - [ - 0.7777777777777778, - "#fb9f3a" - ], - [ - 0.8888888888888888, - "#fdca26" - ], - [ - 1.0, - "#f0f921" - ] - ] - }, "colorway": [ - "#254495", - "#c13246", - "#48277c", - "#e4003a", - "#ef7d00", - "#822661", - "#ffed00", - "#00aaff", - "#9b30d9", - "#af005f", - "#5f00af", - "#af87ff" + "#1f77b4", + "#ff7f0e", + "#2ca02c", + "#d62728", + "#9467bd", + "#8c564b", + "#e377c2", + "#bcbd22", + "#17becf", + "#aec7e8", + "#ffbb78", + "#ff9896", + "#c5b0d5", + "#f7b6d2", + "#dbdb8d", + "#9edae5" ], + "dragmode": "pan", "font": { - "color": "#2a3f5f" - }, - "geo": { - "bgcolor": "white", - "lakecolor": "white", - "landcolor": "white", - "showlakes": true, - "showland": true, - "subunitcolor": "#C8D4E3" + "family": "Arial", + "size": 18 }, "hoverlabel": { "align": "left" }, - "hovermode": "x", "mapbox": { "style": "light" }, - "paper_bgcolor": "white", - "plot_bgcolor": "white", - "polar": { - "angularaxis": { - "gridcolor": "#EBF0F8", - "linecolor": "#EBF0F8", - "ticks": "" - }, - "bgcolor": "white", - "radialaxis": { - "gridcolor": "#EBF0F8", - "linecolor": "#EBF0F8", - "ticks": "" + "hovermode": "x", + "legend": { + "bgcolor": "rgba(255, 255, 255, 0)", + "x": 1, + "xanchor": "right", + "y": 1.02, + "yanchor": "bottom", + "font": { + "size": 12 } }, - "scene": { - "xaxis": { - "backgroundcolor": "white", - "gridcolor": "#DFE8F3", - "gridwidth": 2, - "linecolor": "#EBF0F8", - "showbackground": true, - "ticks": "", - "zerolinecolor": "#EBF0F8" - }, - "yaxis": { - "backgroundcolor": "white", - "gridcolor": "#DFE8F3", - "gridwidth": 2, - "linecolor": "#EBF0F8", - "showbackground": true, - "ticks": "", - "zerolinecolor": "#EBF0F8" - }, - "zaxis": { - "backgroundcolor": "white", - "gridcolor": "#DFE8F3", - "gridwidth": 2, - "linecolor": "#EBF0F8", - "showbackground": true, - "ticks": "", - "zerolinecolor": "#EBF0F8" + "legend2": { + "bgcolor": "rgba(255, 255, 255, 0.5)", + "font": { + "size": 15 } }, - "shapedefaults": { - "line": { - "color": "#2a3f5f" + "legend3": { + "bgcolor": "rgba(255, 255, 255, 0.5)", + "font": { + "size": 15 } }, - "ternary": { - "aaxis": { - "gridcolor": "#DFE8F3", - "linecolor": "#A2B1C6", - "ticks": "" - }, - "baxis": { - "gridcolor": "#DFE8F3", - "linecolor": "#A2B1C6", - "ticks": "" - }, - "bgcolor": "white", - "caxis": { - "gridcolor": "#DFE8F3", - "linecolor": "#A2B1C6", - "ticks": "" + "legend4": { + "bgcolor": "rgba(255, 255, 255, 0.5)", + "font": { + "size": 15 } }, - "title": { - "x": 0.05 + "legend5": { + "bgcolor": "rgba(255, 255, 255, 0.5)", + "font": { + "size": 15 + } }, + "paper_bgcolor": "#FFFFFF", + "plot_bgcolor": "#FFFFFF", "xaxis": { "automargin": true, - "ticks": "", - "zerolinewidth": 2, + "autorange": true, "rangeslider": { "visible": false }, "showgrid": true, "showline": true, "tickfont": { - "size": 15 + "size": 14 }, + "zeroline": false, + "tick0": 1, + "title": { + "standoff": 20, + "font": { + "size": 16 + } + }, + "linecolor": "#A9A9A9", "mirror": true, - "zeroline": false + "ticks": "outside" }, "yaxis": { + "anchor": "x", "automargin": true, - "ticks": "", - "tickfont": { - "size": 15 - }, - "zerolinewidth": 2, "fixedrange": false, + "zeroline": false, "showgrid": true, "showline": true, "side": "right", + "tick0": 0.5, + "title": { + "standoff": 20, + "font": { + "size": 16 + } + }, + "gridcolor": "rgba(128, 128, 128, 0.33)", + "linecolor": "#A9A9A9", "mirror": true, - "zeroline": false - }, - "dragmode": "pan", - "legend": { - "bgcolor": "rgba(0, 0, 0, 0)", - "x": 1.1, - "xanchor": "left", - "y": 0.99, - "yanchor": "top" - }, - "legend2": { - "bgcolor": "rgba(0, 0, 0, 0)" - }, - "legend3": { - "bgcolor": "rgba(0, 0, 0, 0)" - }, - "legend4": { - "bgcolor": "rgba(0, 0, 0, 0)" - }, - "legend5": { - "bgcolor": "rgba(0, 0, 0, 0)" + "ticks": "outside" } } -} +} \ No newline at end of file diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/utils/generic_charts.py b/openbb_platform/obbject_extensions/charting/openbb_charting/utils/generic_charts.py new file mode 100644 index 00000000000..9254408b4c8 --- /dev/null +++ b/openbb_platform/obbject_extensions/charting/openbb_charting/utils/generic_charts.py @@ -0,0 +1,606 @@ +"""Generic Charts Module.""" + +# pylint: disable=too-many-arguments,unused-argument,too-many-locals, too-many-branches, too-many-lines, too-many-statements, use-dict-literal, broad-exception-caught, too-many-nested-blocks + +from typing import Any, Dict, List, Literal, Optional, Union + +import numpy as np +import pandas as pd +from openbb_core.app.utils import basemodel_to_df, convert_to_basemodel +from openbb_core.provider.abstract.data import Data +from plotly.graph_objs import Figure + +from openbb_charting.core.chart_style import ChartStyle +from openbb_charting.core.openbb_figure import OpenBBFigure +from openbb_charting.styles.colors import LARGE_CYCLER +from openbb_charting.utils.helpers import ( + calculate_returns, + should_share_axis, + z_score_standardization, +) + + +def line_chart( # noqa: PLR0912 + data: Union[ + list, + dict, + pd.DataFrame, + List[pd.DataFrame], + pd.Series, + List[pd.Series], + np.ndarray, + Data, + ], + index: Optional[str] = None, + target: Optional[str] = None, + title: Optional[str] = None, + x: Optional[str] = None, + xtitle: Optional[str] = None, + y: Optional[Union[str, List[str]]] = None, + ytitle: Optional[str] = None, + y2: Optional[Union[str, List[str]]] = None, + y2title: Optional[str] = None, + layout_kwargs: Optional[dict] = None, + scatter_kwargs: Optional[dict] = None, + normalize: bool = False, + returns: bool = False, + same_axis: bool = False, + **kwargs, +) -> Union[OpenBBFigure, Figure]: + """Create a line chart.""" + + if data is None: + raise ValueError("Error: Data is a required field.") + + auto_layout = False + index = ( + data.index.name + if isinstance(data, (pd.DataFrame, pd.Series)) + else index if index is not None else x if x is not None else "date" + ) + df: pd.DataFrame = ( + basemodel_to_df(convert_to_basemodel(data), index=index) + ).dropna(how="all", axis=1) + + if df.index.name is None: + if "date" in df.columns: + df.date = df.date.apply(pd.to_datetime) + df.set_index("date", inplace=True) + else: + found_index = False + for col in df.columns: + if df[col].dtype == "object": + try: + df[col] = df[col].apply(pd.to_datetime) + index = df[col].name # type: ignore + df.set_index(col, inplace=True) + df.index.name = "date" + found_index = True + except Exception as _: # noqa: S112 + continue + if found_index is True: + break + if found_index is False: + df.set_index(df.iloc[:, 0], inplace=True) + + if "symbol" in df.columns and len(df.symbol.unique()) > 1: + df = df.pivot(columns="symbol", values=target if target else "close") + + if "symbol" not in df.columns and target in df.columns: + df = df[[target]] + + y = y.split(",") if isinstance(y, str) else y + + if y is None or same_axis is True: + y = df.columns.to_list() + auto_layout = True + + if same_axis is True: + auto_layout = False + + if returns is True: + df = df.apply(calculate_returns) + auto_layout = False + + if normalize is True: + df = df.apply(z_score_standardization) + auto_layout = False + + if layout_kwargs is None: + layout_kwargs = {} + + if scatter_kwargs is None: + scatter_kwargs = {} + + try: + fig = OpenBBFigure() + except Exception as _: + fig = OpenBBFigure(create_backend=True) + + title = f"{title}" if title else "" + xtitle = xtitle if xtitle else "" + y1title = ytitle if ytitle else "" + y2title = y2title if y2title else "" + y2 = y2 if y2 else [] + yaxis_num = 1 + yaxis = f"y{yaxis_num}" + first_y = y[0] # type: ignore[index] + second_y = None + third_y = None + add_scatter = False + + # Attempt to layout the chart automatically with multiple y-axis. + mode = scatter_kwargs.pop("mode", "lines") + hovertemplate = scatter_kwargs.pop("hovertemplate", None) + + if auto_layout is True: + # Sort columns by the difference between the max and min values. + # This is to help determine which columns should share the same y-axis. + diff = df.max(numeric_only=True) - df.min(numeric_only=True) + sorted_columns = diff.sort_values(ascending=False).index + if sorted_columns is None or len(sorted_columns) == 0: + raise ValueError("Error: expected data with numeric values.") + df = df[sorted_columns] + + for i, col in enumerate(df.columns): + + if col in y: # type: ignore[operator] + hovertemplate = ( + hovertemplate + if hovertemplate + else f"{df[col].name}: %{{y}}" + ) + share_yaxis = should_share_axis(df, first_y, col, threshold=2.5) + if share_yaxis is True: + add_scatter = True + if share_yaxis is False: + yaxis_num = 2 + yaxis = f"y{yaxis_num}" + if second_y is None: + second_y = col + add_scatter = True + if second_y is not None: + add_scatter = False + share_yaxis = should_share_axis(df, col, second_y, threshold=3) + if share_yaxis is True: + add_scatter = True + if share_yaxis is False: + yaxis_num = 3 + yaxis = f"y{yaxis_num}" + third_y = col + add_scatter = True + + if add_scatter is True: + fig = fig.add_scatter( + x=df.index, + y=df[col], + name=col, + mode=mode, + line=dict(width=1, color=LARGE_CYCLER[i % len(LARGE_CYCLER)]), + hovertemplate=hovertemplate, + hoverlabel=dict(font_size=10), + yaxis=yaxis, + **scatter_kwargs, + ) + + if auto_layout is False: + color = 0 + for i, col in enumerate(y): # type: ignore[arg-type] + hovertemplate = ( + hovertemplate + if hovertemplate + else f"{df[col].name}: %{{y}}" + ) + fig = fig.add_scatter( + x=df.index, + y=df[col], + name=col, + mode=mode, + line=dict(width=1, color=LARGE_CYCLER[color]), + hovertemplate=hovertemplate, + hoverlabel=dict(font_size=10), + yaxis="y1", + **scatter_kwargs, + ) + color += 1 + if y2: + second_y = y2[0] + for i, col in enumerate(y2): + hovertemplate = ( + hovertemplate + if hovertemplate + else f"{df[col].name}: %{{y}}" + ) + fig = fig.add_scatter( + x=df.index, + y=df[col], + name=col, + mode=mode, + line=dict(width=1, color=LARGE_CYCLER[color]), + hovertemplate=hovertemplate, + hoverlabel=dict(font_size=10), + yaxis="y2", + **scatter_kwargs, + ) + color += 1 + + if returns is True: + y1title = "Percent" + title = f"{title} - Cumulative Returns" if title else "Cumulative Returns" + + if normalize is True: + y1title = "Z-Score" + title = f"{title} - Z-Score" if title else "Z-Score" + + if not title and target is not None: + title = f"{target.replace('_', ' ').title()}" + + fig.update_layout( + title=dict(text=title if title else None, x=0.5, font=dict(size=16)), + paper_bgcolor="rgba(0,0,0,0)", + plot_bgcolor="rgba(0,0,0,0)", + legend=dict( + orientation="h", + yanchor="bottom", + xanchor="right", + y=1.02, + x=0.95, + bgcolor="rgba(0,0,0,0)", + ), + yaxis=( + dict( + ticklen=0, + side="right", + title=dict( + text=y1title if ytitle else None, standoff=30, font=dict(size=16) + ), + tickfont=dict(size=14), + anchor="x", + showgrid=True, + mirror=True, + showline=True, + zeroline=False, + gridcolor="rgba(128,128,128,0.25)", + ) + ), + yaxis2=( + dict( + overlaying="y", + side="left", + ticklen=0, + showgrid=False, + showline=True, + zeroline=False, + mirror=True, + title=dict( + text=y2title if y2title else None, standoff=10, font=dict(size=16) + ), + tickfont=dict(size=14), + anchor="x", + ) + ), + yaxis3=( + dict( + overlaying="y", + side="left", + ticklen=0, + position=0, + showgrid=False, + showline=False, + zeroline=False, + showticklabels=True, + mirror=False, + tickfont=dict(size=12, color="rgba(128,128,128,0.75)"), + anchor="free", + ) + ), + xaxis=dict( + ticklen=0, + showgrid=True, + title=( + dict(text=xtitle, standoff=30, font=dict(size=16)) if xtitle else None + ), + zeroline=False, + showline=True, + mirror=True, + gridcolor="rgba(128,128,128,0.25)", + domain=[0.095, 0.95] if third_y else None, + ), + margin=dict(r=25, l=25) if normalize is False else None, + autosize=True, + dragmode="pan", + hovermode="x", + ) + + if df.index.name not in ("date", "timestamp"): + fig.update_xaxes(type="category") + + if layout_kwargs: + fig.update_layout( + **layout_kwargs, + ) + + return fig + + +def bar_chart( # noqa: PLR0912 + data: Union[ + list, + dict, + pd.DataFrame, + List[pd.DataFrame], + pd.Series, + List[pd.Series], + np.ndarray, + Data, + ], + x: str, + y: Union[str, List[str]], + barmode: Literal["group", "stack", "relative", "overlay"] = "group", + xtype: Literal["category", "multicategory", "date", "log", "linear"] = "category", + title: Optional[str] = None, + xtitle: Optional[str] = None, + ytitle: Optional[str] = None, + orientation: Literal["h", "v"] = "v", + colors: Optional[List[str]] = None, + bar_kwargs: Optional[Dict[str, Any]] = None, + layout_kwargs: Optional[Dict[str, Any]] = None, + **kwargs, +) -> Union[OpenBBFigure, Figure]: + """Create a vertical bar chart on a single x-axis with one or more values for the y-axis. + + Parameters + ---------- + data : Union[ + list, dict, pd.DataFrame, List[pd.DataFrame], pd.Series, List[pd.Series], np.ndarray, Data + ] + Data to plot. + x : str + The x-axis column name. + y : Union[str, List[str]] + The y-axis column name(s). + barmode : Literal["group", "stack", "relative", "overlay"], optional + The bar mode, by default "group". + xtype : Literal["category", "multicategory", "date", "log", "linear"], optional + The x-axis type, by default "category". + title : str, optional + The title of the chart, by default None. + xtitle : str, optional + The x-axis title, by default None. + ytitle : str, optional + The y-axis title, by default None. + colors: List[str], optional + Manually set the colors to cycle through for each column in 'y', by default None. + bar_kwargs : Dict[str, Any], optional + Additional keyword arguments to apply with figure.add_bar(), by default None. + layout_kwargs : Dict[str, Any], optional + Additional keyword arguments to apply with figure.update_layout(), by default None. + + Returns + ------- + OpenBBFigure + The OpenBBFigure object. + """ + + try: + figure = OpenBBFigure() + except Exception as _: + figure = OpenBBFigure(create_backend=True) + + figure = figure.create_subplots( + 1, + 1, + shared_xaxes=True, + vertical_spacing=0.06, + horizontal_spacing=0.01, + row_width=[1], + specs=[[{"secondary_y": True}]], + ) + + figure.update_layout(ChartStyle().plotly_template.get("layout", {})) + if colors is not None: + figure.update_layout(colorway=colors) + if bar_kwargs is None: + bar_kwargs = {} + if isinstance(data, (Data, list, dict)): + data = basemodel_to_df(convert_to_basemodel(data), index=None) + + bar_df = data.copy().set_index(x) # type: ignore + y = y.split(",") if isinstance(y, str) else y + + for item in y: + figure.add_bar( + x=bar_df.index if orientation == "v" else bar_df[item], + y=bar_df[item] if orientation == "v" else bar_df.index, + name=bar_df[item].name, + showlegend=len(y) > 1, + legendgroup=bar_df[item].name, + orientation=orientation, + hovertemplate=( + "%{fullData.name}:%{y}" + if orientation == "v" + else "%{fullData.name}:%{x}" + ), + width=0.95 / len(y) * 0.75 if barmode == "group" and len(y) > 1 else 0.95, + **bar_kwargs, + ) + + figure.update_layout( + title=dict(text=title if title else None, x=0.5, font=dict(size=16)), + paper_bgcolor="rgba(0,0,0,0)", + plot_bgcolor="rgba(0,0,0,0)", + legend=dict( + orientation="h", + yanchor="bottom", + xanchor="right", + y=1.02, + x=0.98, + bgcolor="rgba(0,0,0,0)", + ), + xaxis=dict( + type=xtype, + title=dict( + text=xtitle if xtitle else None, standoff=30, font=dict(size=16) + ), + ticklen=0, + showgrid=orientation == "h", + tickformat="%{x}", + tickfont=dict(size=12), + categoryorder="array" if orientation == "v" else None, + categoryarray=bar_df.index if orientation == "v" else None, + ), + yaxis=dict( + title=dict( + text=ytitle if ytitle else None, standoff=30, font=dict(size=16) + ), + ticklen=0, + showgrid=orientation == "v", + tickfont=dict(size=12), + side="left" if orientation == "h" else "right", + categoryorder="array" if orientation == "h" else None, + categoryarray=bar_df.index if orientation == "h" else None, + ), + margin=dict(pad=5), + barmode=barmode, + ) + if orientation == "h": + figure.update_layout( + xaxis=dict( + type="linear", + showspikes=False, + ), + yaxis=dict( + type="category", + showspikes=False, + ), + hoverlabel=dict( + font=dict(size=12), + ), + ) + if layout_kwargs: + figure.update_layout( + **layout_kwargs, + ) + return figure + + +def bar_increasing_decreasing( # pylint: disable=W0102 + keys: List[str], + values: List[Union[int, float]], + title: Optional[str] = None, + xtitle: Optional[str] = None, + ytitle: Optional[str] = None, + colors: List[str] = ["blue", "red"], + orientation: Literal["h", "v"] = "h", + barmode: Literal["group", "stack", "relative", "overlay"] = "relative", + layout_kwargs: Optional[Dict[str, Any]] = None, +) -> Union[OpenBBFigure, Figure]: + """Create a bar chart with increasing and decreasing values represented by two colors. + + Parameters + ---------- + keys : List[str] + The x-axis keys. + values : List[Any] + The y-axis values. + title : Optional[str], optional + The title of the chart, by default None. + xtitle : Optional[str], optional + The x-axis title, by default None. + ytitle : Optional[str], optional + The y-axis title, by default None. + colors : List[str], optional + The colors to use for increasing and decreasing values, by default ["blue", "red"]. + orientation : Literal["h", "v"], optional + The orientation of the bars, by default "h". + barmode : Literal["group", "stack", "relative", "overlay"], optional + The bar mode, by default "relative". + layout_kwargs : Optional[Dict[str, Any]], optional + Additional keyword arguments to apply with figure.update_layout(), by default None. + + Returns + ------- + OpenBBFigure + The OpenBBFigure object. + """ + + try: + figure = OpenBBFigure() + except Exception as _: + figure = OpenBBFigure(create_backend=True) + + figure = figure.create_subplots( + 1, + 1, + shared_xaxes=False, + vertical_spacing=0.06, + horizontal_spacing=0.01, + row_width=[1], + specs=[[{"secondary_y": True}]], + ) + # figure.update_layout(ChartStyle().plotly_template.get("layout", {})) + + try: + data = pd.Series(data=values, index=keys) + increasing_data = data[data > 0] # type: ignore + decreasing_data = data[data < 0] # type: ignore + except Exception as e: + raise ValueError(f"Error: {e}") from e + + if not increasing_data.empty: + figure.add_bar( + x=increasing_data.index if orientation == "v" else increasing_data, + y=increasing_data if orientation == "v" else increasing_data.index, + marker=dict(color=colors[0]), + orientation=orientation, + showlegend=False, + width=0.95 / len(keys) * 0.75 if barmode == "group" else 0.95, + hoverinfo="y" if orientation == "v" else "x", + ) + if not decreasing_data.empty: + figure.add_bar( + x=decreasing_data.index if orientation == "v" else decreasing_data, + y=decreasing_data if orientation == "v" else decreasing_data.index, + marker=dict(color=colors[1]), + orientation=orientation, + showlegend=False, + width=0.95 / len(keys) * 0.75 if barmode == "group" else 0.95, + hoverinfo="y" if orientation == "v" else "x", + ) + + figure.update_layout( + title=dict(text=title if title else None, x=0.5, font=dict(size=20)), + hovermode="x" if orientation == "v" else "y", + hoverlabel=dict(align="left" if orientation == "h" else "auto"), + yaxis=dict( + title=dict( + text=ytitle if ytitle else None, standoff=30, font=dict(size=16) + ), + side="left" if orientation == "h" else "right", + showgrid=orientation == "v", + gridcolor="rgba(128,128,128,0.25)", + tickfont=dict(size=12), + ticklen=0, + categoryorder="array" if orientation == "h" else None, + categoryarray=keys if orientation == "h" else None, + ), + xaxis=dict( + title=dict( + text=xtitle if xtitle else None, standoff=30, font=dict(size=16) + ), + showgrid=orientation == "h", + gridcolor="rgba(128,128,128,0.25)", + tickfont=dict(size=12), + ticklen=0, + categoryorder="array" if orientation == "v" else None, + categoryarray=keys if orientation == "v" else None, + ), + margin=dict(pad=5), + ) + + if layout_kwargs: + figure.update_layout( + **layout_kwargs, + ) + + return figure diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/utils/helpers.py b/openbb_platform/obbject_extensions/charting/openbb_charting/utils/helpers.py index da765a42bb6..53d26c40e47 100644 --- a/openbb_platform/obbject_extensions/charting/openbb_charting/utils/helpers.py +++ b/openbb_platform/obbject_extensions/charting/openbb_charting/utils/helpers.py @@ -1,13 +1,18 @@ """Helper functions for charting.""" +import importlib from inspect import getmembers, getsource, isfunction from typing import List -from openbb_charting import charting_router +import pandas as pd +from pandas_ta import candles def get_charting_functions() -> List[str]: """Discover charting functions.""" + + charting_router = importlib.import_module("openbb_charting.charting_router") + implemented_functions = [] for name, obj in getmembers(charting_router, isfunction): @@ -19,3 +24,71 @@ def get_charting_functions() -> List[str]: implemented_functions.append(name) return implemented_functions + + +def z_score_standardization(data: pd.Series) -> pd.Series: + """Z-Score Standardization Method.""" + return (data - data.mean()) / data.std() + + +def calculate_returns(data: pd.Series) -> pd.Series: + """Calculate the returns of a column.""" + return ((1 + data.pct_change().dropna()).cumprod() - 1) * 100 + + +def should_share_axis( + df: pd.DataFrame, col1: str, col2: str, threshold: float = 0.15 +) -> bool: + """Determine whether two columns should share an axis.""" + try: + if isinstance(df, pd.Series): + df = df.to_frame() + range1 = df[col1].max() - df[col1].min() + range2 = df[col2].max() - df[col2].min() + # Calculate the ratio of the two ranges + ratio = max(range1, range2) / min(range1, range2) + # If the ratio is less than the threshold, the two columns can share an axis + if ratio == 1: + return True + return ratio < threshold + except Exception: + return False + + +def heikin_ashi(data: pd.DataFrame) -> pd.DataFrame: + """Return OHLC data as Heikin Ashi Candles. + + Parameters + ---------- + data: pd.DataFrame + DataFrame containing OHLC data. + + Returns + ------- + pd.DataFrame + DataFrame copy with Heikin Ashi candle calculations. + """ + + df = data.copy() + + check_columns = ["open", "high", "low", "close"] + + for item in check_columns: + if item not in df.columns: + raise ValueError( + "The expected column labels, " + f"{check_columns}" + ", were not found in DataFrame." + ) + + ha = candles.ha( + df["open"], + df["high"], + df["low"], + df["close"], + ) + + for item in check_columns: + df[item] = ha[f"HA_{item}"] + + return df diff --git a/openbb_platform/obbject_extensions/charting/openbb_charting/utils/relative_rotation.py b/openbb_platform/obbject_extensions/charting/openbb_charting/utils/relative_rotation.py new file mode 100644 index 00000000000..b543d5d2633 --- /dev/null +++ b/openbb_platform/obbject_extensions/charting/openbb_charting/utils/relative_rotation.py @@ -0,0 +1,582 @@ +"""Relative Rotation Chart Helpers.""" + +from datetime import date as dateType +from typing import Literal, Optional +from warnings import warn + +from pandas import DataFrame, to_datetime +from plotly import graph_objects as go +from plotly.graph_objects import Figure + +color_sequence = [ + "burlywood", + "orange", + "grey", + "magenta", + "cyan", + "yellowgreen", + "#1f77b4", + "#aec7e8", + "#ff7f0e", + "#ffbb78", + "#d62728", + "#ff9896", + "#9467bd", + "#c5b0d5", + "#8c564b", + "#c49c94", + "#e377c2", + "#f7b6d2", + "#7f7f7f", + "#c7c7c7", + "#bcbd22", + "#dbdb8d", + "#17becf", + "#9edae5", + "#7e7e7e", + "#1b9e77", + "#d95f02", + "#7570b3", + "#e7298a", + "#66a61e", + "#e6ab02", + "#a6761d", + "#666666", + "#f0027f", + "#bf5b17", + "#d9f202", + "#8dd3c7", + "#ffffb3", + "#bebada", + "#fb8072", + "#80b1d3", + "#fdb462", + "#b3de69", + "#fccde5", + "#d9d9d9", + "#bc80bd", + "#ccebc5", + "#ffed6f", + "#6a3d9a", + "#b15928", + "#b2df8a", + "#33a02c", + "#fb9a99", + "#e31a1c", + "#fdbf6f", + "#ff7f00", + "#cab2d6", + "#6a3d9a", + "#ffff99", + "#b15928", +] + + +def create_rrg_with_tails( + ratios_data: DataFrame, + momentum_data: DataFrame, + study: str, + benchmark_symbol: str, + tail_periods: int, + tail_interval: Literal["day", "week", "month"], +) -> Figure: + """Create The Relative Rotation Graph With Tails. + + Parameters + ---------- + ratios_data : DataFrame + The DataFrame containing the RS-Ratio values. + momentum_data : DataFrame + The DataFrame containing the RS-Momentum values. + study : str + The study that was selected when loading the raw data. + If custom data is supplied, this will override the study for the chart titles. + benchmark_symbol : str + The symbol of the benchmark. + tail_periods : int + The number of periods to display in the tails. + tail_interval : Literal["day", "week", "month"] + + Returns + ------- + Figure + Plotly GraphObjects Figure. + """ + color = 0 + symbols = ratios_data.columns.to_list() + + tail_dict = {"week": "W", "month": "M"} + + ratios_data.index = to_datetime(ratios_data.index) + momentum_data.index = to_datetime(momentum_data.index) + if tail_interval != "day": + ratios_data = ratios_data.resample(tail_dict[tail_interval]).last() + momentum_data = momentum_data.resample(tail_dict[tail_interval]).last() + ratios_data = ratios_data.iloc[-tail_periods:] + momentum_data = momentum_data.iloc[-tail_periods:] + _tail_periods = len(ratios_data) + tail_title = ( + f"The Previous {_tail_periods} {tail_interval.capitalize()}s " + f"Ending {ratios_data.index[-1].strftime('%Y-%m-%d')}" + ) + x_min = ratios_data.min().min() + x_max = ratios_data.max().max() + y_min = momentum_data.min().min() + y_max = momentum_data.max().max() + # Create an empty list to store the scatter traces + traces = [] + + for symbol in symbols: + # Select a single row from each dataframe + x_data = ratios_data[symbol] + y_data = momentum_data[symbol] + name = symbol.upper().replace("^", "").replace(":US", "") + # Create a trace for the line + line_trace = go.Scattergl( + x=x_data[:-1], # All but the last data point + y=y_data[:-1], # All but the last data point + mode="lines+markers", + line=dict( + color=color_sequence[color % len(color_sequence)], width=2, dash="dash" + ), + marker=dict(size=6, color=color_sequence[color % len(color_sequence)]), + opacity=0.3, + showlegend=False, + name=name, + text=name, + hovertemplate="%{fullData.name}" + + "
RS-Ratio: %{x:.4f}
" + + "RS-Momentum: %{y:.4f}" + + "", + hoverlabel=dict(font_size=10), + ) + special_name = "-" in name or len(name) > 5 + marker_size = 38 if special_name else 30 + # Create a trace for the last data point + marker_trace = go.Scatter( + x=[x_data.iloc[-1]], # Only the last data point + y=[y_data.iloc[-1]], # Only the last data point + mode="markers+text", + name=name, + text=[name], + textposition="middle center", + textfont=( + dict(size=10, color="black") + if len(name) < 4 + else dict(size=8, color="black") + ), + marker=dict( + size=marker_size, + color=color_sequence[color % len(color_sequence)], + line=dict(color="black", width=1), + ), + showlegend=False, + hovertemplate="%{fullData.name}" + + "
RS-Ratio: %{x:.4f}
" + + "RS-Momentum: %{y:.4f}" + + "", + hoverlabel=dict(font_size=10), + ) + traces.extend([line_trace, marker_trace]) + color += 1 + padding = 0.1 + y_range = [y_min - padding * abs(y_min) - 0.3, y_max + padding * abs(y_max) + 0.3] + x_range = [x_min - padding * abs(x_min) - 0.3, x_max + padding * abs(x_max) + 0.3] + + layout = go.Layout( + title={ + "text": ( + f"Relative Rotation Against {benchmark_symbol.replace('^', '')} {study.capitalize()} For {tail_title}" + ), + "x": 0.5, + "xanchor": "center", + "font": dict(color="white", size=18), + }, + xaxis=dict( + title="RS-Ratio", + zerolinecolor="black", + range=x_range, + showspikes=False, + ), + yaxis=dict( + title="
RS-Momentum", + zerolinecolor="black", + range=y_range, + showspikes=False, + side="left", + title_standoff=5, + ), + shapes=[ + go.layout.Shape( + type="rect", + xref="x", + yref="y", + x0=0, + y0=0, + x1=x_range[1], + y1=y_range[1], + fillcolor="lightgreen", + opacity=0.3, + layer="below", + line_width=0, + ), + go.layout.Shape( + type="rect", + xref="x", + yref="y", + x0=x_range[0], + y0=0, + x1=0, + y1=y_range[1], + fillcolor="lightblue", + opacity=0.3, + layer="below", + line_width=0, + ), + go.layout.Shape( + type="rect", + xref="x", + yref="y", + x0=x_range[0], + y0=y_range[0], + x1=0, + y1=0, + fillcolor="lightpink", + opacity=0.3, + layer="below", + line_width=0, + ), + go.layout.Shape( + type="rect", + xref="x", + yref="y", + x0=0, + y0=y_range[0], + x1=x_range[1], + y1=0, + fillcolor="lightyellow", + opacity=0.3, + layer="below", + line_width=0, + ), + go.layout.Shape( + type="rect", + xref="x", + yref="y", + x0=x_range[0], + y0=y_range[0], + x1=x_range[1], + y1=y_range[1], + line=dict( + color="Black", + width=1, + ), + fillcolor="rgba(0,0,0,0)", + layer="above", + ), + ], + annotations=[ + go.layout.Annotation( + x=1, + xref="paper", + y=1, + yref="paper", + text="Leading", + showarrow=False, + font=dict( + size=18, + color="darkgreen", + ), + ), + go.layout.Annotation( + x=1, + xref="paper", + y=0, + yref="paper", + text="Weakening", + showarrow=False, + font=dict( + size=18, + color="goldenrod", + ), + ), + go.layout.Annotation( + x=0, + xref="paper", + y=0, + yref="paper", + text="Lagging", + showarrow=False, + font=dict( + size=18, + color="red", + ), + ), + go.layout.Annotation( + x=0, + xref="paper", + yref="paper", + y=1, + text="Improving", + showarrow=False, + font=dict( + size=18, + color="blue", + ), + ), + ], + autosize=True, + margin=dict( + l=30, + r=50, + b=50, + t=50, + pad=0, + ), + dragmode="pan", + hovermode="closest", + ) + + fig = go.Figure(data=traces, layout=layout) + + return fig + + +def create_rrg_without_tails( + ratios_data: DataFrame, + momentum_data: DataFrame, + benchmark_symbol: str, + study: str, + date: Optional[dateType] = None, +) -> Figure: + """Create the Plotly Figure Object without Tails. + + Parameters + ---------- + ratios_data : DataFrame + The DataFrame containing the RS-Ratio values. + momentum_data : DataFrame + The DataFrame containing the RS-Momentum values. + benchmark_symbol : str + The symbol of the benchmark. + study: str + The study that was selected when loading the raw data. + If custom data is supplied, this will override the study for the chart titles. + date : Optional[dateType], optional + A specific date within the data to target for display, by default None. + + Returns + ------- + Figure + Plotly GraphObjects Figure. + """ + + if date is not None and date not in ratios_data.index.astype(str): + warn(f"Date {str(date)} not found in data, using the last available date.") + date = ratios_data.index[-1] + if date is None: + date = ratios_data.index[-1] + + # Select a single row from each dataframe + row_x = ratios_data.loc[to_datetime(date).date()] # type: ignore + row_y = momentum_data.loc[to_datetime(date).date()] # type: ignore + + x_max = row_x.max() + 0.5 + x_min = row_x.min() - 0.5 + y_max = row_y.max() + 0.5 + y_min = row_y.min() - 0.5 + + # Create an empty list to store the scatter traces + traces = [] + + # Loop through each column in the row_x dataframe + for i, (column_name, value_x) in enumerate(row_x.items()): + # Retrieve the corresponding value from the row_y dataframe + value_y = row_y[column_name] # type: ignore + marker_name = column_name.upper().replace("^", "").replace(":US", "") # type: ignore + special_name = "-" in marker_name or len(marker_name) > 5 + marker_size = 38 if special_name else 30 + # Create a scatter trace for each column + trace = go.Scatter( + x=[value_x], + y=[value_y], + mode="markers+text", + text=[marker_name], + textposition="middle center", + textfont=dict(size=10 if len(marker_name) < 4 else 8, color="black"), + marker=dict( + size=marker_size, + color=color_sequence[i % len(color_sequence)], + line=dict(color="black", width=1), + ), + name=column_name, + showlegend=False, + hovertemplate="%{fullData.name}" + + "
RS-Ratio: %{x:.4f}
" + + "RS-Momentum: %{y:.4f}" + + "", + ) + # Add the trace to the list + traces.append(trace) + + padding = 0.1 + y_range = [y_min - padding * abs(y_min) - 0.3, y_max + padding * abs(y_max)] + x_range = [x_min - padding * abs(x_min), x_max + padding * abs(x_max)] + + layout = go.Layout( + title={ + "text": ( + f"RS-Ratio vs RS-Momentum of {study.capitalize()} " + f"Against {benchmark_symbol.replace('^', '')} - {to_datetime(row_x.name).strftime('%Y-%m-%d')}" # type: ignore + ), + "x": 0.5, + "xanchor": "center", + "font": dict(size=20), + }, + xaxis=dict( + title="RS-Ratio", + zerolinecolor="black", + range=x_range, + showspikes=False, + ), + yaxis=dict( + title="
RS-Momentum", + zerolinecolor="black", + range=y_range, + side="left", + title_standoff=5, + showspikes=False, + ), + shapes=[ + go.layout.Shape( + type="rect", + xref="x", + yref="y", + x0=0, + y0=0, + x1=x_range[1], + y1=y_range[1], + fillcolor="lightgreen", + opacity=0.3, + layer="below", + line_width=0, + ), + go.layout.Shape( + type="rect", + xref="x", + yref="y", + x0=x_range[0], + y0=0, + x1=0, + y1=y_range[1], + fillcolor="lightblue", + opacity=0.3, + layer="below", + line_width=0, + ), + go.layout.Shape( + type="rect", + xref="x", + yref="y", + x0=x_range[0], + y0=y_range[0], + x1=0, + y1=0, + fillcolor="lightpink", + opacity=0.3, + layer="below", + line_width=0, + ), + go.layout.Shape( + type="rect", + xref="x", + yref="y", + x0=0, + y0=y_range[0], + x1=x_range[1], + y1=0, + fillcolor="lightyellow", + opacity=0.3, + layer="below", + line_width=0, + ), + go.layout.Shape( + type="rect", + xref="x", + yref="y", + x0=x_range[0], + y0=y_range[0], + x1=x_range[1], + y1=y_range[1], + line=dict( + color="Black", + width=1, + ), + fillcolor="rgba(0,0,0,0)", + layer="above", + ), + ], + annotations=[ + go.layout.Annotation( + x=1, + xref="paper", + y=1, + yref="paper", + text="Leading", + showarrow=False, + font=dict( + size=18, + color="darkgreen", + ), + ), + go.layout.Annotation( + x=1, + xref="paper", + y=0, + yref="paper", + text="Weakening", + showarrow=False, + font=dict( + size=18, + color="goldenrod", + ), + ), + go.layout.Annotation( + x=0, + xref="paper", + y=0, + yref="paper", + text="Lagging", + showarrow=False, + font=dict( + size=18, + color="red", + ), + ), + go.layout.Annotation( + x=0, + xref="paper", + yref="paper", + y=1, + text="Improving", + showarrow=False, + font=dict( + size=18, + color="blue", + ), + ), + ], + autosize=True, + margin=dict( + l=30, + r=50, + b=50, + t=50, + pad=0, + ), + dragmode="pan", + ) + + fig = go.Figure(data=traces, layout=layout) + + return fig diff --git a/openbb_platform/obbject_extensions/charting/poetry.lock b/openbb_platform/obbject_extensions/charting/poetry.lock index 75146b5425e..54f0410fa3e 100644 --- a/openbb_platform/obbject_extensions/charting/poetry.lock +++ b/openbb_platform/obbject_extensions/charting/poetry.lock @@ -933,13 +933,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -2263,4 +2263,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.12" -content-hash = "8e596e7ed1b446a8b76dd6b76c083527f659282813bdb844926830254ace9de4" +content-hash = "bb29ff5b59d695fe948af761716ca0f021b9733ed9061c7aa041077b74823d0b" diff --git a/openbb_platform/obbject_extensions/charting/pyproject.toml b/openbb_platform/obbject_extensions/charting/pyproject.toml index ee19e1e7c90..d95d9b43ab9 100644 --- a/openbb_platform/obbject_extensions/charting/pyproject.toml +++ b/openbb_platform/obbject_extensions/charting/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-charting" -version = "2.0.2" +version = "2.0.3" description = "Charting extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -16,7 +16,7 @@ pywry = "^0.6.1" svglib = "^1.5.1" nbformat = "^5.9.2" pandas-ta = "^0.3.14b" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/obbject_extensions/charting/tests/__init__.py b/openbb_platform/obbject_extensions/charting/tests/__init__.py index e69de29bb2d..6108752fdf4 100644 --- a/openbb_platform/obbject_extensions/charting/tests/__init__.py +++ b/openbb_platform/obbject_extensions/charting/tests/__init__.py @@ -0,0 +1 @@ +"""OBBject Extensions Charting Tests Module.""" diff --git a/openbb_platform/obbject_extensions/charting/tests/test_charting.py b/openbb_platform/obbject_extensions/charting/tests/test_charting.py index 4e29544dd87..3f270c53a25 100644 --- a/openbb_platform/obbject_extensions/charting/tests/test_charting.py +++ b/openbb_platform/obbject_extensions/charting/tests/test_charting.py @@ -1,3 +1,5 @@ +"""Test Charting class.""" + from unittest.mock import MagicMock, patch import pytest @@ -6,9 +8,14 @@ from openbb_core.app.model.system_settings import SystemSettings from openbb_core.app.model.user_settings import UserSettings from pydantic import BaseModel +# pylint: disable=redefined-outer-name, protected-access + class MockDataframe: + """Mock Dataframe.""" + def __init__(self): + """Mock Dataframe.""" self.columns = ["column1", "column2"] @@ -17,12 +24,19 @@ mock_dataframe = MockDataframe() @pytest.fixture() def obbject(): + """Mock OOBject.""" + class MockStdParams(BaseModel): + """Mock Standard Parameters.""" + param1: str param2: str class MockOOBject: + """Mock OOBject.""" + def __init__(self): + """Mock OOBject.""" self._user_settings = UserSettings() self._system_settings = SystemSettings() self._route = "mock/route" @@ -36,36 +50,53 @@ def obbject(): self.warnings = "mock_warnings" def to_dataframe(self): + """Mock to_dataframe.""" return mock_dataframe return MockOOBject() def test_charting_settings(obbject): + """Test charting_settings.""" cm = Charting(obbject) assert isinstance(cm, Charting) -@patch("openbb_charting.ChartIndicators.get_available_indicators") -def test_indicators(mock_get_available_indicators, obbject): - # Arrange - mock_get_available_indicators.return_value = [ - "indicator1", - "indicator2", - "indicator3", - ] +def test_indicators(obbject): + """Test indicators method.""" obj = Charting(obbject) + indicators = list(obj.indicators().model_dump().keys()) - # Act - result = obj.indicators() - - # Assert - assert result == ["indicator1", "indicator2", "indicator3"] - mock_get_available_indicators.assert_called_once() + assert indicators == [ + "sma", + "ema", + "hma", + "wma", + "zlma", + "ad", + "adoscillator", + "adx", + "aroon", + "atr", + "cci", + "clenow", + "demark", + "donchian", + "fib", + "fisher", + "ichimoku", + "kc", + "macd", + "obv", + "rsi", + "srlines", + "stoch", + ] @patch("openbb_charting.get_charting_functions") def test_functions(mock_get_charting_functions): + """Test functions method.""" # Arrange mock_get_charting_functions.return_value = ["function1", "function2", "function3"] @@ -80,6 +111,7 @@ def test_functions(mock_get_charting_functions): @patch("openbb_charting.core.backend.get_backend") @patch("openbb_charting.core.backend.create_backend") def test_handle_backend(mock_create_backend, mock_get_backend, obbject): + """Test _handle_backend method.""" # Act -> _handle backend is called in the constructor obj = Charting(obbject) @@ -90,6 +122,7 @@ def test_handle_backend(mock_create_backend, mock_get_backend, obbject): @patch("openbb_charting.charting_router") def test_get_chart_function(mock_charting_router): + """Test _get_chart_function method.""" # Arrange mock_function = MagicMock() mock_charting_router.some_function = mock_function @@ -104,6 +137,7 @@ def test_get_chart_function(mock_charting_router): @patch("openbb_charting.Charting._get_chart_function") def test_show(mock_get_chart_function, obbject): + """Test show method.""" # Arrange mock_function = MagicMock() mock_get_chart_function.return_value = mock_function @@ -122,6 +156,7 @@ def test_show(mock_get_chart_function, obbject): @patch("openbb_charting.to_chart") def test_to_chart(mock_to_chart, obbject): + """Test to_chart method.""" # Arrange mock_fig = MagicMock() mock_to_chart.return_value = (mock_fig, {"content": "mock_content"}) diff --git a/openbb_platform/openbb/assets/extension_map.json b/openbb_platform/openbb/assets/extension_map.json deleted file mode 100644 index a364041c217..00000000000 --- a/openbb_platform/openbb/assets/extension_map.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "openbb_core_extension": [ - "commodity@1.0.2", - "crypto@1.1.4", - "currency@1.1.4", - "derivatives@1.1.4", - "economy@1.1.4", - "equity@1.1.4", - "etf@1.1.4", - "fixedincome@1.1.4", - "index@1.1.4", - "news@1.1.4", - "regulators@1.1.4" - ], - "openbb_obbject_extension": [], - "openbb_provider_extension": [ - "benzinga@1.1.4", - "federal_reserve@1.1.4", - "fmp@1.1.4", - "fred@1.1.4", - "intrinio@1.1.4", - "oecd@1.1.4", - "polygon@1.1.4", - "sec@1.1.4", - "tiingo@1.1.4", - "tradingeconomics@1.1.4", - "yfinance@1.1.4" - ] -} \ No newline at end of file diff --git a/openbb_platform/openbb/assets/reference.json b/openbb_platform/openbb/assets/reference.json index 7b753ba76ee..76e676be348 100644 --- a/openbb_platform/openbb/assets/reference.json +++ b/openbb_platform/openbb/assets/reference.json @@ -1,26584 +1,27293 @@ { - "/crypto/price/historical": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get historical price data for cryptocurrency pair(s) within a provider.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.crypto.price.historical(symbol='BTCUSD', provider='fmp')\nobb.crypto.price.historical(symbol='BTCUSD', start_date='2024-01-01', end_date='2024-01-31', provider='fmp')\nobb.crypto.price.historical(symbol='BTCUSD,ETHUSD', start_date='2024-01-01', end_date='2024-01-31', provider='polygon')\n# Get monthly historical prices from Yahoo Finance for Ethereum.\nobb.crypto.price.historical(symbol='ETH-USD', interval=1m, start_date='2024-01-01', end_date='2024-12-31', provider='yfinance')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. Can use CURR1-CURR2 or CURR1CURR2 format. Multiple items allowed for provider(s): fmp, polygon, tiingo, yfinance.", - "default": "", - "optional": false - }, - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp', 'polygon', 'tiingo', 'yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [ - { - "name": "interval", - "type": "Literal['1m', '5m', '15m', '30m', '1h', '4h', '1d']", - "description": "Time interval of the data to return.", - "default": "1d", - "optional": true - } - ], - "polygon": [ - { - "name": "interval", - "type": "str", - "description": "Time interval of the data to return. The numeric portion of the interval can be any positive integer. The letter portion can be one of the following: s, m, h, d, W, M, Q, Y", - "default": "1d", - "optional": true - }, - { - "name": "sort", - "type": "Literal['asc', 'desc']", - "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date.", - "default": "asc", - "optional": true - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": 49999, - "optional": true - } - ], - "tiingo": [ - { - "name": "interval", - "type": "Literal['1m', '5m', '15m', '30m', '1h', '4h', '1d']", - "description": "Time interval of the data to return.", - "default": "1d", - "optional": true - }, - { - "name": "exchanges", - "type": "List[str]", - "description": "To limit the query to a subset of exchanges e.g. ['POLONIEX', 'GDAX']", - "default": null, - "optional": true - } - ], - "yfinance": [ - { - "name": "interval", - "type": "Literal['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1W', '1M', '1Q']", - "description": "Time interval of the data to return.", - "default": "1d", - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[CryptoHistorical]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'polygon', 'tiingo', 'yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "Union[date, datetime]", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "open", - "type": "float", - "description": "The open price.", - "default": "", - "optional": false - }, - { - "name": "high", - "type": "float", - "description": "The high price.", - "default": "", - "optional": false - }, - { - "name": "low", - "type": "float", - "description": "The low price.", - "default": "", - "optional": false - }, - { - "name": "close", - "type": "float", - "description": "The close price.", - "default": "", - "optional": false - }, - { - "name": "volume", - "type": "float", - "description": "The trading volume.", - "default": "", - "optional": false - }, - { - "name": "vwap", - "type": "Annotated[float, Gt(gt=0)]", - "description": "Volume Weighted Average Price over the period.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "adj_close", - "type": "float", - "description": "The adjusted close price.", - "default": null, - "optional": true - }, - { - "name": "change", - "type": "float", - "description": "Change in the price from the previous close.", - "default": null, - "optional": true - }, - { - "name": "change_percent", - "type": "float", - "description": "Change in the price from the previous close, as a normalized percent.", - "default": null, - "optional": true - } - ], - "polygon": [ - { - "name": "transactions", - "type": "Annotated[int, Gt(gt=0)]", - "description": "Number of transactions for the symbol in the time period.", - "default": null, - "optional": true - } - ], - "tiingo": [ - { - "name": "transactions", - "type": "int", - "description": "Number of transactions for the symbol in the time period.", - "default": null, - "optional": true - }, - { - "name": "volume_notional", - "type": "float", - "description": "The last size done for the asset on the specific date in the quote currency. The volume of the asset on the specific date in the quote currency.", - "default": null, - "optional": true - } - ], - "yfinance": [] - }, - "model": "CryptoHistorical" - }, - "/crypto/search": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Search available cryptocurrency pairs within a provider.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.crypto.search(provider='fmp')\nobb.crypto.search(query='BTCUSD', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "query", - "type": "str", - "description": "Search query.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[CryptoSearch]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data. (Crypto)", - "default": "", - "optional": false - }, - { - "name": "name", - "type": "str", - "description": "Name of the crypto.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "currency", - "type": "str", - "description": "The currency the crypto trades for.", - "default": null, - "optional": true - }, - { - "name": "exchange", - "type": "str", - "description": "The exchange code the crypto trades on.", - "default": null, - "optional": true - }, - { - "name": "exchange_name", - "type": "str", - "description": "The short name of the exchange the crypto trades on.", - "default": null, - "optional": true - } - ] - }, - "model": "CryptoSearch" - }, - "/currency/price/historical": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Currency Historical Price. Currency historical data.\n\nCurrency historical prices refer to the past exchange rates of one currency against\nanother over a specific period.\nThis data provides insight into the fluctuations and trends in the foreign exchange market,\nhelping analysts, traders, and economists understand currency performance,\nevaluate economic health, and make predictions about future movements.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.currency.price.historical(symbol='EURUSD', provider='fmp')\n# Filter historical data with specific start and end date.\nobb.currency.price.historical(symbol='EURUSD', start_date='2023-01-01', end_date='2023-12-31', provider='fmp')\n# Get data with different granularity.\nobb.currency.price.historical(symbol='EURUSD', provider='polygon', interval=15m)\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. Can use CURR1-CURR2 or CURR1CURR2 format. Multiple items allowed for provider(s): fmp, polygon, tiingo, yfinance.", - "default": "", - "optional": false - }, - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp', 'polygon', 'tiingo', 'yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [ - { - "name": "interval", - "type": "Literal['1m', '5m', '15m', '30m', '1h', '4h', '1d']", - "description": "Time interval of the data to return.", - "default": "1d", - "optional": true - } - ], - "polygon": [ - { - "name": "interval", - "type": "str", - "description": "Time interval of the data to return. The numeric portion of the interval can be any positive integer. The letter portion can be one of the following: s, m, h, d, W, M, Q, Y", - "default": "1d", - "optional": true - }, - { - "name": "sort", - "type": "Literal['asc', 'desc']", - "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date.", - "default": "asc", - "optional": true - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": 49999, - "optional": true - } - ], - "tiingo": [ - { - "name": "interval", - "type": "Literal['1m', '5m', '15m', '30m', '1h', '4h', '1d']", - "description": "Time interval of the data to return.", - "default": "1d", - "optional": true - } - ], - "yfinance": [ - { - "name": "interval", - "type": "Literal['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1W', '1M', '1Q']", - "description": "Time interval of the data to return.", - "default": "1d", - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[CurrencyHistorical]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'polygon', 'tiingo', 'yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "Union[date, datetime]", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "open", - "type": "float", - "description": "The open price.", - "default": "", - "optional": false - }, - { - "name": "high", - "type": "float", - "description": "The high price.", - "default": "", - "optional": false - }, - { - "name": "low", - "type": "float", - "description": "The low price.", - "default": "", - "optional": false - }, - { - "name": "close", - "type": "float", - "description": "The close price.", - "default": "", - "optional": false - }, - { - "name": "volume", - "type": "float", - "description": "The trading volume.", - "default": null, - "optional": true - }, - { - "name": "vwap", - "type": "Annotated[float, Gt(gt=0)]", - "description": "Volume Weighted Average Price over the period.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "adj_close", - "type": "float", - "description": "The adjusted close price.", - "default": null, - "optional": true - }, - { - "name": "change", - "type": "float", - "description": "Change in the price from the previous close.", - "default": null, - "optional": true - }, - { - "name": "change_percent", - "type": "float", - "description": "Change in the price from the previous close, as a normalized percent.", - "default": null, - "optional": true - } - ], - "polygon": [ - { - "name": "transactions", - "type": "Annotated[int, Gt(gt=0)]", - "description": "Number of transactions for the symbol in the time period.", - "default": null, - "optional": true - } - ], - "tiingo": [], - "yfinance": [] - }, - "model": "CurrencyHistorical" - }, - "/currency/search": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Currency Search.\n\nSearch available currency pairs.\nCurrency pairs are the national currencies from two countries coupled for trading on\nthe foreign exchange (FX) marketplace.\nBoth currencies will have exchange rates on which the trade will have its position basis.\nAll trading within the forex market, whether selling, buying, or trading, will take place through currency pairs.\n(ref: Investopedia)\nMajor currency pairs include pairs such as EUR/USD, USD/JPY, GBP/USD, etc.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.currency.search(provider='intrinio')\n# Search for 'EURUSD' currency pair using 'intrinio' as provider.\nobb.currency.search(provider='intrinio', symbol=EURUSD)\n# Search for actively traded currency pairs on the queried date using 'polygon' as provider.\nobb.currency.search(provider='polygon', date=2024-01-02, active=True)\n# Search for terms using 'polygon' as provider.\nobb.currency.search(provider='polygon', search=Euro zone)\n```\n\n", - "parameters": { - "standard": [ - { - "name": "provider", - "type": "Literal['fmp', 'intrinio', 'polygon']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [], - "intrinio": [], - "polygon": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol of the pair to search.", - "default": null, - "optional": true - }, - { - "name": "date", - "type": "Union[date, str]", - "description": "A specific date to get data for.", - "default": null, - "optional": true - }, - { - "name": "search", - "type": "str", - "description": "Search for terms within the ticker and/or company name.", - "default": "", - "optional": true - }, - { - "name": "active", - "type": "bool", - "description": "Specify if the tickers returned should be actively traded on the queried date.", - "default": true, - "optional": true - }, - { - "name": "order", - "type": "Literal['asc', 'desc']", - "description": "Order data by ascending or descending.", - "default": "asc", - "optional": true - }, - { - "name": "sort", - "type": "Literal['ticker', 'name', 'market', 'locale', 'currency_symbol', 'currency_name', 'base_currency_symbol', 'base_currency_name', 'last_updated_utc', 'delisted_utc']", - "description": "Sort field used for ordering.", - "default": "", - "optional": true - }, - { - "name": "limit", - "type": "Annotated[int, Gt(gt=0)]", - "description": "The number of data entries to return.", - "default": 1000, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[CurrencyPairs]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'intrinio', 'polygon']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "name", - "type": "str", - "description": "Name of the currency pair.", - "default": "", - "optional": false - } - ], - "fmp": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol of the currency pair.", - "default": "", - "optional": false - }, - { - "name": "currency", - "type": "str", - "description": "Base currency of the currency pair.", - "default": "", - "optional": false - }, - { - "name": "stock_exchange", - "type": "str", - "description": "Stock exchange of the currency pair.", - "default": null, - "optional": true - }, - { - "name": "exchange_short_name", - "type": "str", - "description": "Short name of the stock exchange of the currency pair.", - "default": null, - "optional": true - } - ], - "intrinio": [ - { - "name": "code", - "type": "str", - "description": "Code of the currency pair.", - "default": "", - "optional": false - }, - { - "name": "base_currency", - "type": "str", - "description": "ISO 4217 currency code of the base currency.", - "default": "", - "optional": false - }, - { - "name": "quote_currency", - "type": "str", - "description": "ISO 4217 currency code of the quote currency.", - "default": "", - "optional": false - } - ], - "polygon": [ - { - "name": "market", - "type": "str", - "description": "Name of the trading market. Always 'fx'.", - "default": "", - "optional": false - }, - { - "name": "locale", - "type": "str", - "description": "Locale of the currency pair.", - "default": "", - "optional": false - }, - { - "name": "currency_symbol", - "type": "str", - "description": "The symbol of the quote currency.", - "default": null, - "optional": true - }, - { - "name": "currency_name", - "type": "str", - "description": "Name of the quote currency.", - "default": null, - "optional": true - }, - { - "name": "base_currency_symbol", - "type": "str", - "description": "The symbol of the base currency.", - "default": null, - "optional": true - }, - { - "name": "base_currency_name", - "type": "str", - "description": "Name of the base currency.", - "default": null, - "optional": true - }, - { - "name": "last_updated_utc", - "type": "datetime", - "description": "The last updated timestamp in UTC.", - "default": "", - "optional": false - }, - { - "name": "delisted_utc", - "type": "datetime", - "description": "The delisted timestamp in UTC.", - "default": null, - "optional": true - } - ] - }, - "model": "CurrencyPairs" - }, - "/currency/snapshots": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Snapshots of currency exchange rates from an indirect or direct perspective of a base currency.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.currency.snapshots(provider='fmp')\n# Get exchange rates from USD and XAU to EUR, JPY, and GBP using 'fmp' as provider.\nobb.currency.snapshots(provider='fmp', base='USD,XAU', counter_currencies='EUR,JPY,GBP', quote_type='indirect')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "base", - "type": "Union[str, List[str]]", - "description": "The base currency symbol. Multiple items allowed for provider(s): fmp.", - "default": "usd", - "optional": true - }, - { - "name": "quote_type", - "type": "Literal['direct', 'indirect']", - "description": "Whether the quote is direct or indirect. Selecting 'direct' will return the exchange rate as the amount of domestic currency required to buy one unit of the foreign currency. Selecting 'indirect' (default) will return the exchange rate as the amount of foreign currency required to buy one unit of the domestic currency.", - "default": "indirect", - "optional": true - }, - { - "name": "counter_currencies", - "type": "Union[List[str], str]", - "description": "An optional list of counter currency symbols to filter for. None returns all.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[CurrencySnapshots]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "base_currency", - "type": "str", - "description": "The base, or domestic, currency.", - "default": "", - "optional": false - }, - { - "name": "counter_currency", - "type": "str", - "description": "The counter, or foreign, currency.", - "default": "", - "optional": false - }, - { - "name": "last_rate", - "type": "float", - "description": "The exchange rate, relative to the base currency. Rates are expressed as the amount of foreign currency received from selling one unit of the base currency, or the quantity of foreign currency required to purchase one unit of the domestic currency. To inverse the perspective, set the 'quote_type' parameter as 'direct'.", - "default": "", - "optional": false - }, - { - "name": "open", - "type": "float", - "description": "The open price.", - "default": null, - "optional": true - }, - { - "name": "high", - "type": "float", - "description": "The high price.", - "default": null, - "optional": true - }, - { - "name": "low", - "type": "float", - "description": "The low price.", - "default": null, - "optional": true - }, - { - "name": "close", - "type": "float", - "description": "The close price.", - "default": null, - "optional": true - }, - { - "name": "volume", - "type": "int", - "description": "The trading volume.", - "default": null, - "optional": true - }, - { - "name": "prev_close", - "type": "float", - "description": "The previous close price.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "change", - "type": "float", - "description": "The change in the price from the previous close.", - "default": null, - "optional": true - }, - { - "name": "change_percent", - "type": "float", - "description": "The change in the price from the previous close, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "ma50", - "type": "float", - "description": "The 50-day moving average.", - "default": null, - "optional": true - }, - { - "name": "ma200", - "type": "float", - "description": "The 200-day moving average.", - "default": null, - "optional": true - }, - { - "name": "year_high", - "type": "float", - "description": "The 52-week high.", - "default": null, - "optional": true - }, - { - "name": "year_low", - "type": "float", - "description": "The 52-week low.", - "default": null, - "optional": true - }, - { - "name": "last_rate_timestamp", - "type": "datetime", - "description": "The timestamp of the last rate.", - "default": null, - "optional": true - } - ] - }, - "model": "CurrencySnapshots" - }, - "/derivatives/options/chains": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get the complete options chain for a ticker.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.derivatives.options.chains(symbol='AAPL', provider='intrinio')\n# Use the \"date\" parameter to get the end-of-day-data for a specific date, where supported.\nobb.derivatives.options.chains(symbol='AAPL', date=2023-01-25, provider='intrinio')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['intrinio']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'intrinio' if there is no default.", - "default": "intrinio", - "optional": true - } - ], - "intrinio": [ - { - "name": "date", - "type": "Union[date, str]", - "description": "The end-of-day date for options chains data.", - "default": null, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[OptionsChains]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['intrinio']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data. Here, it is the underlying symbol for the option.", - "default": null, - "optional": true - }, - { - "name": "contract_symbol", - "type": "str", - "description": "Contract symbol for the option.", - "default": "", - "optional": false - }, - { - "name": "eod_date", - "type": "date", - "description": "Date for which the options chains are returned.", - "default": null, - "optional": true - }, - { - "name": "expiration", - "type": "date", - "description": "Expiration date of the contract.", - "default": "", - "optional": false - }, - { - "name": "strike", - "type": "float", - "description": "Strike price of the contract.", - "default": "", - "optional": false - }, - { - "name": "option_type", - "type": "str", - "description": "Call or Put.", - "default": "", - "optional": false - }, - { - "name": "open_interest", - "type": "int", - "description": "Open interest on the contract.", - "default": null, - "optional": true - }, - { - "name": "volume", - "type": "int", - "description": "The trading volume.", - "default": null, - "optional": true - }, - { - "name": "theoretical_price", - "type": "float", - "description": "Theoretical value of the option.", - "default": null, - "optional": true - }, - { - "name": "last_trade_price", - "type": "float", - "description": "Last trade price of the option.", - "default": null, - "optional": true - }, - { - "name": "tick", - "type": "str", - "description": "Whether the last tick was up or down in price.", - "default": null, - "optional": true - }, - { - "name": "bid", - "type": "float", - "description": "Current bid price for the option.", - "default": null, - "optional": true - }, - { - "name": "bid_size", - "type": "int", - "description": "Bid size for the option.", - "default": null, - "optional": true - }, - { - "name": "ask", - "type": "float", - "description": "Current ask price for the option.", - "default": null, - "optional": true - }, - { - "name": "ask_size", - "type": "int", - "description": "Ask size for the option.", - "default": null, - "optional": true - }, - { - "name": "mark", - "type": "float", - "description": "The mid-price between the latest bid and ask.", - "default": null, - "optional": true - }, - { - "name": "open", - "type": "float", - "description": "The open price.", - "default": null, - "optional": true - }, - { - "name": "open_bid", - "type": "float", - "description": "The opening bid price for the option that day.", - "default": null, - "optional": true - }, - { - "name": "open_ask", - "type": "float", - "description": "The opening ask price for the option that day.", - "default": null, - "optional": true - }, - { - "name": "high", - "type": "float", - "description": "The high price.", - "default": null, - "optional": true - }, - { - "name": "bid_high", - "type": "float", - "description": "The highest bid price for the option that day.", - "default": null, - "optional": true - }, - { - "name": "ask_high", - "type": "float", - "description": "The highest ask price for the option that day.", - "default": null, - "optional": true - }, - { - "name": "low", - "type": "float", - "description": "The low price.", - "default": null, - "optional": true - }, - { - "name": "bid_low", - "type": "float", - "description": "The lowest bid price for the option that day.", - "default": null, - "optional": true - }, - { - "name": "ask_low", - "type": "float", - "description": "The lowest ask price for the option that day.", - "default": null, - "optional": true - }, - { - "name": "close", - "type": "float", - "description": "The close price.", - "default": null, - "optional": true - }, - { - "name": "close_size", - "type": "int", - "description": "The closing trade size for the option that day.", - "default": null, - "optional": true - }, - { - "name": "close_time", - "type": "datetime", - "description": "The time of the closing price for the option that day.", - "default": null, - "optional": true - }, - { - "name": "close_bid", - "type": "float", - "description": "The closing bid price for the option that day.", - "default": null, - "optional": true - }, - { - "name": "close_bid_size", - "type": "int", - "description": "The closing bid size for the option that day.", - "default": null, - "optional": true - }, - { - "name": "close_bid_time", - "type": "datetime", - "description": "The time of the bid closing price for the option that day.", - "default": null, - "optional": true - }, - { - "name": "close_ask", - "type": "float", - "description": "The closing ask price for the option that day.", - "default": null, - "optional": true - }, - { - "name": "close_ask_size", - "type": "int", - "description": "The closing ask size for the option that day.", - "default": null, - "optional": true - }, - { - "name": "close_ask_time", - "type": "datetime", - "description": "The time of the ask closing price for the option that day.", - "default": null, - "optional": true - }, - { - "name": "prev_close", - "type": "float", - "description": "The previous close price.", - "default": null, - "optional": true - }, - { - "name": "change", - "type": "float", - "description": "The change in the price of the option.", - "default": null, - "optional": true - }, - { - "name": "change_percent", - "type": "float", - "description": "Change, in normalizezd percentage points, of the option.", - "default": null, - "optional": true - }, - { - "name": "implied_volatility", - "type": "float", - "description": "Implied volatility of the option.", - "default": null, - "optional": true - }, - { - "name": "delta", - "type": "float", - "description": "Delta of the option.", - "default": null, - "optional": true - }, - { - "name": "gamma", - "type": "float", - "description": "Gamma of the option.", - "default": null, - "optional": true - }, - { - "name": "theta", - "type": "float", - "description": "Theta of the option.", - "default": null, - "optional": true - }, - { - "name": "vega", - "type": "float", - "description": "Vega of the option.", - "default": null, - "optional": true - }, - { - "name": "rho", - "type": "float", - "description": "Rho of the option.", - "default": null, - "optional": true - } - ], - "intrinio": [ - { - "name": "exercise_style", - "type": "str", - "description": "The exercise style of the option, American or European.", - "default": null, - "optional": true - } - ] - }, - "model": "OptionsChains" - }, - "/derivatives/options/unusual": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get the complete options chain for a ticker.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.derivatives.options.unusual(provider='intrinio')\n# Use the 'symbol' parameter to get the most recent activity for a specific symbol.\nobb.derivatives.options.unusual(symbol='TSLA', provider='intrinio')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for. (the underlying symbol)", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['intrinio']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'intrinio' if there is no default.", - "default": "intrinio", - "optional": true - } - ], - "intrinio": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format. If no symbol is supplied, requests are only allowed for a single date. Use the start_date for the target date. Intrinio appears to have data beginning Feb/2022, but is unclear when it actually began.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format. If a symbol is not supplied, do not include an end date.", - "default": null, - "optional": true - }, - { - "name": "trade_type", - "type": "Literal['block', 'sweep', 'large']", - "description": "The type of unusual activity to query for.", - "default": null, - "optional": true - }, - { - "name": "sentiment", - "type": "Literal['bullish', 'bearish', 'neutral']", - "description": "The sentiment type to query for.", - "default": null, - "optional": true - }, - { - "name": "min_value", - "type": "Union[float, int]", - "description": "The inclusive minimum total value for the unusual activity.", - "default": null, - "optional": true - }, - { - "name": "max_value", - "type": "Union[float, int]", - "description": "The inclusive maximum total value for the unusual activity.", - "default": null, - "optional": true - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return. A typical day for all symbols will yield 50-80K records. The API will paginate at 1000 records. The high default limit (100K) is to be able to reliably capture the most days. The high absolute limit (1.25M) is to allow for outlier days. Queries at the absolute limit will take a long time, and might be unreliable. Apply filters to improve performance.", - "default": 100000, - "optional": true - }, - { - "name": "source", - "type": "Literal['delayed', 'realtime']", - "description": "The source of the data. Either realtime or delayed.", - "default": "delayed", - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[OptionsUnusual]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['intrinio']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "underlying_symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data. (the underlying symbol)", - "default": null, - "optional": true - }, - { - "name": "contract_symbol", - "type": "str", - "description": "Contract symbol for the option.", - "default": "", - "optional": false - } - ], - "intrinio": [ - { - "name": "trade_timestamp", - "type": "datetime", - "description": "The datetime of order placement.", - "default": "", - "optional": false - }, - { - "name": "trade_type", - "type": "Literal['block', 'sweep', 'large']", - "description": "The type of unusual trade.", - "default": "", - "optional": false - }, - { - "name": "sentiment", - "type": "Literal['bullish', 'bearish', 'neutral']", - "description": "Bullish, Bearish, or Neutral Sentiment is estimated based on whether the trade was executed at the bid, ask, or mark price.", - "default": "", - "optional": false - }, - { - "name": "bid_at_execution", - "type": "float", - "description": "Bid price at execution.", - "default": "", - "optional": false - }, - { - "name": "ask_at_execution", - "type": "float", - "description": "Ask price at execution.", - "default": "", - "optional": false - }, - { - "name": "average_price", - "type": "float", - "description": "The average premium paid per option contract.", - "default": "", - "optional": false - }, - { - "name": "underlying_price_at_execution", - "type": "float", - "description": "Price of the underlying security at execution of trade.", - "default": null, - "optional": true - }, - { - "name": "total_size", - "type": "int", - "description": "The total number of contracts involved in a single transaction.", - "default": "", - "optional": false - }, - { - "name": "total_value", - "type": "Union[int, float]", - "description": "The aggregated value of all option contract premiums included in the trade.", - "default": "", - "optional": false - } - ] - }, - "model": "OptionsUnusual" - }, - "/derivatives/futures/historical": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Historical futures prices.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.derivatives.futures.historical(symbol='ES', provider='yfinance')\n# Enter multiple symbols.\nobb.derivatives.futures.historical(symbol='ES,NQ', provider='yfinance')\n# Enter expiration dates as \"YYYY-MM\".\nobb.derivatives.futures.historical(symbol='ES', provider='yfinance', expiration='2025-12')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. Multiple items allowed for provider(s): yfinance.", - "default": "", - "optional": false - }, - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "expiration", - "type": "str", - "description": "Future expiry date with format YYYY-MM", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'yfinance' if there is no default.", - "default": "yfinance", - "optional": true - } - ], - "yfinance": [ - { - "name": "interval", - "type": "Literal['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1W', '1M', '1Q']", - "description": "Time interval of the data to return.", - "default": "1d", - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[FuturesHistorical]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "datetime", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "open", - "type": "float", - "description": "The open price.", - "default": "", - "optional": false - }, - { - "name": "high", - "type": "float", - "description": "The high price.", - "default": "", - "optional": false - }, - { - "name": "low", - "type": "float", - "description": "The low price.", - "default": "", - "optional": false - }, - { - "name": "close", - "type": "float", - "description": "The close price.", - "default": "", - "optional": false - }, - { - "name": "volume", - "type": "float", - "description": "The trading volume.", - "default": "", - "optional": false - } - ], - "yfinance": [] - }, - "model": "FuturesHistorical" - }, - "/derivatives/futures/curve": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Futures Term Structure, current or historical.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\n# Enter a date to get the term structure from a historical date.\nobb.derivatives.futures.curve(symbol='NG', provider='yfinance', date='2023-01-01')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "date", - "type": "Union[date, str]", - "description": "A specific date to get data for.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'yfinance' if there is no default.", - "default": "yfinance", - "optional": true - } - ], - "yfinance": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[FuturesCurve]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "expiration", - "type": "str", - "description": "Futures expiration month.", - "default": "", - "optional": false - }, - { - "name": "price", - "type": "float", - "description": "The close price.", - "default": null, - "optional": true - } - ], - "yfinance": [] - }, - "model": "FuturesCurve" - }, - "/economy/gdp/forecast": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Forecasted GDP Data.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.gdp.forecast(provider='oecd')\nobb.economy.gdp.forecast(period='annual', type='real', provider='oecd')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "period", - "type": "Literal['quarter', 'annual']", - "description": "Time period of the data to return. Units for nominal GDP period. Either quarter or annual.", - "default": "annual", - "optional": true - }, - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "type", - "type": "Literal['nominal', 'real']", - "description": "Type of GDP to get forecast of. Either nominal or real.", - "default": "real", - "optional": true - }, - { - "name": "provider", - "type": "Literal['oecd']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'oecd' if there is no default.", - "default": "oecd", - "optional": true - } - ], - "oecd": [ - { - "name": "country", - "type": "Literal['argentina', 'asia', 'australia', 'austria', 'belgium', 'brazil', 'bulgaria', 'canada', 'chile', 'china', 'colombia', 'costa_rica', 'croatia', 'czech_republic', 'denmark', 'estonia', 'euro_area_17', 'finland', 'france', 'germany', 'greece', 'hungary', 'iceland', 'india', 'indonesia', 'ireland', 'israel', 'italy', 'japan', 'korea', 'latvia', 'lithuania', 'luxembourg', 'mexico', 'netherlands', 'new_zealand', 'non-oecd', 'norway', 'oecd_total', 'peru', 'poland', 'portugal', 'romania', 'russia', 'slovak_republic', 'slovenia', 'south_africa', 'spain', 'sweden', 'switzerland', 'turkey', 'united_kingdom', 'united_states', 'world']", - "description": "Country to get GDP for.", - "default": "united_states", - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[GdpForecast]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['oecd']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": null, - "optional": true - }, - { - "name": "value", - "type": "float", - "description": "Nominal GDP value on the date.", - "default": null, - "optional": true - } - ], - "oecd": [] - }, - "model": "GdpForecast" - }, - "/economy/gdp/nominal": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Nominal GDP Data.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.gdp.nominal(provider='oecd')\nobb.economy.gdp.nominal(units='usd', provider='oecd')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "units", - "type": "Literal['usd', 'usd_cap']", - "description": "The unit of measurement for the data. Units to get nominal GDP in. Either usd or usd_cap indicating per capita.", - "default": "usd", - "optional": true - }, - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['oecd']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'oecd' if there is no default.", - "default": "oecd", - "optional": true - } - ], - "oecd": [ - { - "name": "country", - "type": "Literal['australia', 'austria', 'belgium', 'brazil', 'canada', 'chile', 'colombia', 'costa_rica', 'czech_republic', 'denmark', 'estonia', 'euro_area', 'european_union', 'finland', 'france', 'germany', 'greece', 'hungary', 'iceland', 'indonesia', 'ireland', 'israel', 'italy', 'japan', 'korea', 'latvia', 'lithuania', 'luxembourg', 'mexico', 'netherlands', 'new_zealand', 'norway', 'poland', 'portugal', 'russia', 'slovak_republic', 'slovenia', 'south_africa', 'spain', 'sweden', 'switzerland', 'turkey', 'united_kingdom', 'united_states', 'all']", - "description": "Country to get GDP for.", - "default": "united_states", - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[GdpNominal]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['oecd']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": null, - "optional": true - }, - { - "name": "value", - "type": "float", - "description": "Nominal GDP value on the date.", - "default": null, - "optional": true - } - ], - "oecd": [] - }, - "model": "GdpNominal" - }, - "/economy/gdp/real": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Real GDP Data.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.gdp.real(provider='oecd')\nobb.economy.gdp.real(units='yoy', provider='oecd')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "units", - "type": "Literal['idx', 'qoq', 'yoy']", - "description": "The unit of measurement for the data. Either idx (indicating 2015=100), qoq (previous period) or yoy (same period, previous year).)", - "default": "yoy", - "optional": true - }, - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['oecd']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'oecd' if there is no default.", - "default": "oecd", - "optional": true - } - ], - "oecd": [ - { - "name": "country", - "type": "Literal['G20', 'G7', 'argentina', 'australia', 'austria', 'belgium', 'brazil', 'bulgaria', 'canada', 'chile', 'china', 'colombia', 'costa_rica', 'croatia', 'czech_republic', 'denmark', 'estonia', 'euro_area_19', 'europe', 'european_union_27', 'finland', 'france', 'germany', 'greece', 'hungary', 'iceland', 'india', 'indonesia', 'ireland', 'israel', 'italy', 'japan', 'korea', 'latvia', 'lithuania', 'luxembourg', 'mexico', 'netherlands', 'new_zealand', 'norway', 'oecd_total', 'poland', 'portugal', 'romania', 'russia', 'saudi_arabia', 'slovak_republic', 'slovenia', 'south_africa', 'spain', 'sweden', 'switzerland', 'turkey', 'united_kingdom', 'united_states', 'all']", - "description": "Country to get GDP for.", - "default": "united_states", - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[GdpReal]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['oecd']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": null, - "optional": true - }, - { - "name": "value", - "type": "float", - "description": "Nominal GDP value on the date.", - "default": null, - "optional": true - } - ], - "oecd": [] - }, - "model": "GdpReal" - }, - "/economy/calendar": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get the upcoming, or historical, economic calendar of global events.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\n# By default, the calendar will be forward-looking.\nobb.economy.calendar(provider='fmp')\nobb.economy.calendar(provider='fmp', start_date='2020-03-01', end_date='2020-03-31')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp', 'tradingeconomics']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [], - "tradingeconomics": [ - { - "name": "country", - "type": "Union[str, List[str]]", - "description": "Country of the event. Multiple items allowed for provider(s): tradingeconomics.", - "default": null, - "optional": true - }, - { - "name": "importance", - "type": "Literal['Low', 'Medium', 'High']", - "description": "Importance of the event.", - "default": null, - "optional": true - }, - { - "name": "group", - "type": "Literal['interest rate', 'inflation', 'bonds', 'consumer', 'gdp', 'government', 'housing', 'labour', 'markets', 'money', 'prices', 'trade', 'business']", - "description": "Grouping of events", - "default": null, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EconomicCalendar]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'tradingeconomics']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "datetime", - "description": "The date of the data.", - "default": null, - "optional": true - }, - { - "name": "country", - "type": "str", - "description": "Country of event.", - "default": null, - "optional": true - }, - { - "name": "event", - "type": "str", - "description": "Event name.", - "default": null, - "optional": true - }, - { - "name": "reference", - "type": "str", - "description": "Abbreviated period for which released data refers to.", - "default": null, - "optional": true - }, - { - "name": "source", - "type": "str", - "description": "Source of the data.", - "default": null, - "optional": true - }, - { - "name": "sourceurl", - "type": "str", - "description": "Source URL.", - "default": null, - "optional": true - }, - { - "name": "actual", - "type": "Union[str, float]", - "description": "Latest released value.", - "default": null, - "optional": true - }, - { - "name": "previous", - "type": "Union[str, float]", - "description": "Value for the previous period after the revision (if revision is applicable).", - "default": null, - "optional": true - }, - { - "name": "consensus", - "type": "Union[str, float]", - "description": "Average forecast among a representative group of economists.", - "default": null, - "optional": true - }, - { - "name": "forecast", - "type": "Union[str, float]", - "description": "Trading Economics projections", - "default": null, - "optional": true - }, - { - "name": "url", - "type": "str", - "description": "Trading Economics URL", - "default": null, - "optional": true - }, - { - "name": "importance", - "type": "Union[Literal[0, 1, 2, 3], str]", - "description": "Importance of the event. 1-Low, 2-Medium, 3-High", - "default": null, - "optional": true - }, - { - "name": "currency", - "type": "str", - "description": "Currency of the data.", - "default": null, - "optional": true - }, - { - "name": "unit", - "type": "str", - "description": "Unit of the data.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "change", - "type": "float", - "description": "Value change since previous.", - "default": null, - "optional": true - }, - { - "name": "change_percent", - "type": "float", - "description": "Percentage change since previous.", - "default": null, - "optional": true - }, - { - "name": "updated_at", - "type": "datetime", - "description": "Last updated timestamp.", - "default": null, - "optional": true - }, - { - "name": "created_at", - "type": "datetime", - "description": "Created at timestamp.", - "default": null, - "optional": true - } - ], - "tradingeconomics": [] - }, - "model": "EconomicCalendar" - }, - "/economy/cpi": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Consumer Price Index (CPI). Returns either the rescaled index value, or a rate of change (inflation).", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.cpi(country='japan,china,turkey', provider='fred')\n# Use the `units` parameter to define the reference period for the change in values.\nobb.economy.cpi(country='united_states,united_kingdom', units='growth_previous', provider='fred')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "country", - "type": "Union[str, List[str]]", - "description": "The country to get data. Multiple items allowed for provider(s): fred.", - "default": "", - "optional": false - }, - { - "name": "units", - "type": "Literal['growth_previous', 'growth_same', 'index_2015']", - "description": "The unit of measurement for the data. Options: - `growth_previous`: Percent growth from the previous period. If monthly data, this is month-over-month, etc - `growth_same`: Percent growth from the same period in the previous year. If looking at monthly data, this would be year-over-year, etc. - `index_2015`: Rescaled index value, such that the value in 2015 is 100.", - "default": "growth_same", - "optional": true - }, - { - "name": "frequency", - "type": "Literal['monthly', 'quarter', 'annual']", - "description": "The frequency of the data. Options: `monthly`, `quarter`, and `annual`.", - "default": "monthly", - "optional": true - }, - { - "name": "harmonized", - "type": "bool", - "description": "Whether you wish to obtain harmonized data.", - "default": false, - "optional": true - }, - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fred']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", - "default": "fred", - "optional": true - } - ], - "fred": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[ConsumerPriceIndex]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fred']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - } - ], - "fred": [] - }, - "model": "ConsumerPriceIndex" - }, - "/economy/risk_premium": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Market Risk Premium by country.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.risk_premium(provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[RiskPremium]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "country", - "type": "str", - "description": "Market country.", - "default": "", - "optional": false - }, - { - "name": "continent", - "type": "str", - "description": "Continent of the country.", - "default": null, - "optional": true - }, - { - "name": "total_equity_risk_premium", - "type": "Annotated[float, Gt(gt=0)]", - "description": "Total equity risk premium for the country.", - "default": null, - "optional": true - }, - { - "name": "country_risk_premium", - "type": "Annotated[float, Ge(ge=0)]", - "description": "Country-specific risk premium.", - "default": null, - "optional": true - } - ], - "fmp": [] - }, - "model": "RiskPremium" - }, - "/economy/fred_search": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Search for FRED series or economic releases by ID or string.\nThis does not return the observation values, only the metadata.\nUse this function to find series IDs for `fred_series()`.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.fred_search(provider='fred')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "query", - "type": "str", - "description": "The search word(s).", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fred']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", - "default": "fred", - "optional": true - } - ], - "fred": [ - { - "name": "is_release", - "type": "bool", - "description": "Is release? If True, other search filter variables are ignored. If no query text or release_id is supplied, this defaults to True.", - "default": false, - "optional": true - }, - { - "name": "release_id", - "type": "Union[int, str]", - "description": "A specific release ID to target.", - "default": null, - "optional": true - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return. (1-1000)", - "default": null, - "optional": true - }, - { - "name": "offset", - "type": "Annotated[int, Ge(ge=0)]", - "description": "Offset the results in conjunction with limit.", - "default": 0, - "optional": true - }, - { - "name": "filter_variable", - "type": "Literal[None, 'frequency', 'units', 'seasonal_adjustment']", - "description": "Filter by an attribute.", - "default": null, - "optional": true - }, - { - "name": "filter_value", - "type": "str", - "description": "String value to filter the variable by. Used in conjunction with filter_variable.", - "default": null, - "optional": true - }, - { - "name": "tag_names", - "type": "str", - "description": "A semicolon delimited list of tag names that series match all of. Example: 'japan;imports'", - "default": null, - "optional": true - }, - { - "name": "exclude_tag_names", - "type": "str", - "description": "A semicolon delimited list of tag names that series match none of. Example: 'imports;services'. Requires that variable tag_names also be set to limit the number of matching series.", - "default": null, - "optional": true - }, - { - "name": "series_id", - "type": "str", - "description": "A FRED Series ID to return series group information for. This returns the required information to query for regional data. Not all series that are in FRED have geographical data. Entering a value for series_id will override all other parameters. Multiple series_ids can be separated by commas.", - "default": null, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[FredSearch]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fred']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "release_id", - "type": "Union[int, str]", - "description": "The release ID for queries.", - "default": null, - "optional": true - }, - { - "name": "series_id", - "type": "str", - "description": "The series ID for the item in the release.", - "default": null, - "optional": true - }, - { - "name": "name", - "type": "str", - "description": "The name of the release.", - "default": null, - "optional": true - }, - { - "name": "title", - "type": "str", - "description": "The title of the series.", - "default": null, - "optional": true - }, - { - "name": "observation_start", - "type": "date", - "description": "The date of the first observation in the series.", - "default": null, - "optional": true - }, - { - "name": "observation_end", - "type": "date", - "description": "The date of the last observation in the series.", - "default": null, - "optional": true - }, - { - "name": "frequency", - "type": "str", - "description": "The frequency of the data.", - "default": null, - "optional": true - }, - { - "name": "frequency_short", - "type": "str", - "description": "Short form of the data frequency.", - "default": null, - "optional": true - }, - { - "name": "units", - "type": "str", - "description": "The units of the data.", - "default": null, - "optional": true - }, - { - "name": "units_short", - "type": "str", - "description": "Short form of the data units.", - "default": null, - "optional": true - }, - { - "name": "seasonal_adjustment", - "type": "str", - "description": "The seasonal adjustment of the data.", - "default": null, - "optional": true - }, - { - "name": "seasonal_adjustment_short", - "type": "str", - "description": "Short form of the data seasonal adjustment.", - "default": null, - "optional": true - }, - { - "name": "last_updated", - "type": "datetime", - "description": "The datetime of the last update to the data.", - "default": null, - "optional": true - }, - { - "name": "notes", - "type": "str", - "description": "Description of the release.", - "default": null, - "optional": true - }, - { - "name": "press_release", - "type": "bool", - "description": "If the release is a press release.", - "default": null, - "optional": true - }, - { - "name": "url", - "type": "str", - "description": "URL to the release.", - "default": null, - "optional": true - } - ], - "fred": [ - { - "name": "popularity", - "type": "int", - "description": "Popularity of the series", - "default": null, - "optional": true - }, - { - "name": "group_popularity", - "type": "int", - "description": "Group popularity of the release", - "default": null, - "optional": true - }, - { - "name": "region_type", - "type": "str", - "description": "The region type of the series.", - "default": null, - "optional": true - }, - { - "name": "series_group", - "type": "Union[int, str]", - "description": "The series group ID of the series. This value is used to query for regional data.", - "default": null, - "optional": true - } - ] - }, - "model": "FredSearch" - }, - "/economy/fred_series": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get data by series ID from FRED.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.fred_series(symbol='NFCI', provider='fred')\n# Multiple series can be passed in as a list.\nobb.economy.fred_series(symbol='NFCI,STLFSI4', provider='fred')\n# Use the `transform` parameter to transform the data as change, log, or percent change.\nobb.economy.fred_series(symbol='CBBTCUSD', transform=pc1, provider='fred')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. Multiple items allowed for provider(s): fred.", - "default": "", - "optional": false - }, - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": 100000, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fred', 'intrinio']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", - "default": "fred", - "optional": true - } - ], - "fred": [ - { - "name": "frequency", - "type": "Literal[None, 'a', 'q', 'm', 'w', 'd', 'wef', 'weth', 'wew', 'wetu', 'wem', 'wesu', 'wesa', 'bwew', 'bwem']", - "description": "Frequency aggregation to convert high frequency data to lower frequency. None = No change a = Annual q = Quarterly m = Monthly w = Weekly d = Daily wef = Weekly, Ending Friday weth = Weekly, Ending Thursday wew = Weekly, Ending Wednesday wetu = Weekly, Ending Tuesday wem = Weekly, Ending Monday wesu = Weekly, Ending Sunday wesa = Weekly, Ending Saturday bwew = Biweekly, Ending Wednesday bwem = Biweekly, Ending Monday", - "default": null, - "optional": true - }, - { - "name": "aggregation_method", - "type": "Literal[None, 'avg', 'sum', 'eop']", - "description": "A key that indicates the aggregation method used for frequency aggregation. This parameter has no affect if the frequency parameter is not set. avg = Average sum = Sum eop = End of Period", - "default": "eop", - "optional": true - }, - { - "name": "transform", - "type": "Literal[None, 'chg', 'ch1', 'pch', 'pc1', 'pca', 'cch', 'cca', 'log']", - "description": "Transformation type None = No transformation chg = Change ch1 = Change from Year Ago pch = Percent Change pc1 = Percent Change from Year Ago pca = Compounded Annual Rate of Change cch = Continuously Compounded Rate of Change cca = Continuously Compounded Annual Rate of Change log = Natural Log", - "default": null, - "optional": true - } - ], - "intrinio": [ - { - "name": "all_pages", - "type": "bool", - "description": "Returns all pages of data from the API call at once.", - "default": false, - "optional": true - }, - { - "name": "sleep", - "type": "float", - "description": "Time to sleep between requests to avoid rate limiting.", - "default": 1.0, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[FredSeries]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fred', 'intrinio']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - } - ], - "fred": [], - "intrinio": [ - { - "name": "value", - "type": "float", - "description": "Value of the index.", - "default": null, - "optional": true - } - ] - }, - "model": "FredSeries" - }, - "/economy/money_measures": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Money Measures (M1/M2 and components). The Federal Reserve publishes as part of the H.6 Release.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.money_measures(provider='federal_reserve')\nobb.economy.money_measures(adjusted=False, provider='federal_reserve')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "adjusted", - "type": "bool", - "description": "Whether to return seasonally adjusted data.", - "default": true, - "optional": true - }, - { - "name": "provider", - "type": "Literal['federal_reserve']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'federal_reserve' if there is no default.", - "default": "federal_reserve", - "optional": true - } - ], - "federal_reserve": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[MoneyMeasures]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['federal_reserve']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "month", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "M1", - "type": "float", - "description": "Value of the M1 money supply in billions.", - "default": "", - "optional": false - }, - { - "name": "M2", - "type": "float", - "description": "Value of the M2 money supply in billions.", - "default": "", - "optional": false - }, - { - "name": "currency", - "type": "float", - "description": "Value of currency in circulation in billions.", - "default": null, - "optional": true - }, - { - "name": "demand_deposits", - "type": "float", - "description": "Value of demand deposits in billions.", - "default": null, - "optional": true - }, - { - "name": "retail_money_market_funds", - "type": "float", - "description": "Value of retail money market funds in billions.", - "default": null, - "optional": true - }, - { - "name": "other_liquid_deposits", - "type": "float", - "description": "Value of other liquid deposits in billions.", - "default": null, - "optional": true - }, - { - "name": "small_denomination_time_deposits", - "type": "float", - "description": "Value of small denomination time deposits in billions.", - "default": null, - "optional": true - } - ], - "federal_reserve": [] - }, - "model": "MoneyMeasures" - }, - "/economy/unemployment": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Global unemployment data.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.unemployment(provider='oecd')\nobb.economy.unemployment(country=all, frequency=quarterly, provider='oecd')\n# Demographics for the statistics are selected with the `age` parameter.\nobb.economy.unemployment(country=all, frequency=quarterly, age=25-54, provider='oecd')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['oecd']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'oecd' if there is no default.", - "default": "oecd", - "optional": true - } - ], - "oecd": [ - { - "name": "country", - "type": "Literal['colombia', 'new_zealand', 'united_kingdom', 'italy', 'luxembourg', 'euro_area19', 'sweden', 'oecd', 'south_africa', 'denmark', 'canada', 'switzerland', 'slovakia', 'hungary', 'portugal', 'spain', 'france', 'czech_republic', 'costa_rica', 'japan', 'slovenia', 'russia', 'austria', 'latvia', 'netherlands', 'israel', 'iceland', 'united_states', 'ireland', 'mexico', 'germany', 'greece', 'turkey', 'australia', 'poland', 'south_korea', 'chile', 'finland', 'european_union27_2020', 'norway', 'lithuania', 'euro_area20', 'estonia', 'belgium', 'brazil', 'indonesia', 'all']", - "description": "Country to get GDP for.", - "default": "united_states", - "optional": true - }, - { - "name": "sex", - "type": "Literal['total', 'male', 'female']", - "description": "Sex to get unemployment for.", - "default": "total", - "optional": true - }, - { - "name": "frequency", - "type": "Literal['monthly', 'quarterly', 'annual']", - "description": "Frequency to get unemployment for.", - "default": "monthly", - "optional": true - }, - { - "name": "age", - "type": "Literal['total', '15-24', '15-64', '25-54', '55-64']", - "description": "Age group to get unemployment for. Total indicates 15 years or over", - "default": "total", - "optional": true - }, - { - "name": "seasonal_adjustment", - "type": "bool", - "description": "Whether to get seasonally adjusted unemployment. Defaults to False.", - "default": false, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[Unemployment]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['oecd']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": null, - "optional": true - }, - { - "name": "value", - "type": "float", - "description": "Unemployment rate (given as a whole number, i.e 10=10%)", - "default": null, - "optional": true - }, - { - "name": "country", - "type": "str", - "description": "Country for which unemployment rate is given", - "default": null, - "optional": true - } - ], - "oecd": [] - }, - "model": "Unemployment" - }, - "/economy/composite_leading_indicator": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "The composite leading indicator (CLI) is designed to provide early signals of turning points\nin business cycles showing fluctuation of the economic activity around its long term potential level.\nCLIs show short-term economic movements in qualitative rather than quantitative terms.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.composite_leading_indicator(provider='oecd')\nobb.economy.composite_leading_indicator(country=all, provider='oecd')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['oecd']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'oecd' if there is no default.", - "default": "oecd", - "optional": true - } - ], - "oecd": [ - { - "name": "country", - "type": "Literal['united_states', 'united_kingdom', 'japan', 'mexico', 'indonesia', 'australia', 'brazil', 'canada', 'italy', 'germany', 'turkey', 'france', 'south_africa', 'south_korea', 'spain', 'india', 'china', 'g7', 'g20', 'all']", - "description": "Country to get GDP for.", - "default": "united_states", - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[CLI]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['oecd']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": null, - "optional": true - }, - { - "name": "value", - "type": "float", - "description": "CLI value", - "default": null, - "optional": true - }, - { - "name": "country", - "type": "str", - "description": "Country for which CLI is given", - "default": null, - "optional": true - } - ], - "oecd": [] - }, - "model": "CLI" - }, - "/economy/short_term_interest_rate": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Short-term interest rates are the rates at which short-term borrowings are effected between\nfinancial institutions or the rate at which short-term government paper is issued or traded in the market.\nShort-term interest rates are generally averages of daily rates, measured as a percentage.\nShort-term interest rates are based on three-month money market rates where available.\nTypical standardised names are \"money market rate\" and \"treasury bill rate\".", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.short_term_interest_rate(provider='oecd')\nobb.economy.short_term_interest_rate(country=all, frequency=quarterly, provider='oecd')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['oecd']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'oecd' if there is no default.", - "default": "oecd", - "optional": true - } - ], - "oecd": [ - { - "name": "country", - "type": "Literal['belgium', 'ireland', 'mexico', 'indonesia', 'new_zealand', 'japan', 'united_kingdom', 'france', 'chile', 'canada', 'netherlands', 'united_states', 'south_korea', 'norway', 'austria', 'south_africa', 'denmark', 'switzerland', 'hungary', 'luxembourg', 'australia', 'germany', 'sweden', 'iceland', 'turkey', 'greece', 'israel', 'czech_republic', 'latvia', 'slovenia', 'poland', 'estonia', 'lithuania', 'portugal', 'costa_rica', 'slovakia', 'finland', 'spain', 'russia', 'euro_area19', 'colombia', 'italy', 'india', 'china', 'croatia', 'all']", - "description": "Country to get GDP for.", - "default": "united_states", - "optional": true - }, - { - "name": "frequency", - "type": "Literal['monthly', 'quarterly', 'annual']", - "description": "Frequency to get interest rate for for.", - "default": "monthly", - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[STIR]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['oecd']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": null, - "optional": true - }, - { - "name": "value", - "type": "float", - "description": "Interest rate (given as a whole number, i.e 10=10%)", - "default": null, - "optional": true - }, - { - "name": "country", - "type": "str", - "description": "Country for which interest rate is given", - "default": null, - "optional": true - } - ], - "oecd": [] - }, - "model": "STIR" - }, - "/economy/long_term_interest_rate": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Long-term interest rates refer to government bonds maturing in ten years.\nRates are mainly determined by the price charged by the lender, the risk from the borrower and the\nfall in the capital value. Long-term interest rates are generally averages of daily rates,\nmeasured as a percentage. These interest rates are implied by the prices at which the government bonds are\ntraded on financial markets, not the interest rates at which the loans were issued.\nIn all cases, they refer to bonds whose capital repayment is guaranteed by governments.\nLong-term interest rates are one of the determinants of business investment.\nLow long-term interest rates encourage investment in new equipment and high interest rates discourage it.\nInvestment is, in turn, a major source of economic growth.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.long_term_interest_rate(provider='oecd')\nobb.economy.long_term_interest_rate(country=all, frequency=quarterly, provider='oecd')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['oecd']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'oecd' if there is no default.", - "default": "oecd", - "optional": true - } - ], - "oecd": [ - { - "name": "country", - "type": "Literal['belgium', 'ireland', 'mexico', 'indonesia', 'new_zealand', 'japan', 'united_kingdom', 'france', 'chile', 'canada', 'netherlands', 'united_states', 'south_korea', 'norway', 'austria', 'south_africa', 'denmark', 'switzerland', 'hungary', 'luxembourg', 'australia', 'germany', 'sweden', 'iceland', 'turkey', 'greece', 'israel', 'czech_republic', 'latvia', 'slovenia', 'poland', 'estonia', 'lithuania', 'portugal', 'costa_rica', 'slovakia', 'finland', 'spain', 'russia', 'euro_area19', 'colombia', 'italy', 'india', 'china', 'croatia', 'all']", - "description": "Country to get GDP for.", - "default": "united_states", - "optional": true - }, - { - "name": "frequency", - "type": "Literal['monthly', 'quarterly', 'annual']", - "description": "Frequency to get interest rate for for.", - "default": "monthly", - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[LTIR]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['oecd']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": null, - "optional": true - }, - { - "name": "value", - "type": "float", - "description": "Interest rate (given as a whole number, i.e 10=10%)", - "default": null, - "optional": true - }, - { - "name": "country", - "type": "str", - "description": "Country for which interest rate is given", - "default": null, - "optional": true - } - ], - "oecd": [] - }, - "model": "LTIR" - }, - "/economy/fred_regional": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Query the Geo Fred API for regional economic data by series group.\nThe series group ID is found by using `fred_search` and the `series_id` parameter.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.fred_regional(symbol='NYICLAIMS', provider='fred')\n# With a date, time series data is returned.\nobb.economy.fred_regional(symbol='NYICLAIMS', start_date='2021-01-01', end_date='2021-12-31', limit=10, provider='fred')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": 100000, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fred']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", - "default": "fred", - "optional": true - } - ], - "fred": [ - { - "name": "is_series_group", - "type": "bool", - "description": "When True, the symbol provided is for a series_group, else it is for a series ID.", - "default": false, - "optional": true - }, - { - "name": "region_type", - "type": "Literal['bea', 'msa', 'frb', 'necta', 'state', 'country', 'county', 'censusregion']", - "description": "The type of regional data. Parameter is only valid when `is_series_group` is True.", - "default": null, - "optional": true - }, - { - "name": "season", - "type": "Literal['SA', 'NSA', 'SSA']", - "description": "The seasonal adjustments to the data. Parameter is only valid when `is_series_group` is True.", - "default": "NSA", - "optional": true - }, - { - "name": "units", - "type": "str", - "description": "The units of the data. This should match the units returned from searching by series ID. An incorrect field will not necessarily return an error. Parameter is only valid when `is_series_group` is True.", - "default": null, - "optional": true - }, - { - "name": "frequency", - "type": "Literal['d', 'w', 'bw', 'm', 'q', 'sa', 'a', 'wef', 'weth', 'wew', 'wetu', 'wem', 'wesu', 'wesa', 'bwew', 'bwem']", - "description": "Frequency aggregation to convert high frequency data to lower frequency. Parameter is only valid when `is_series_group` is True. a = Annual sa= Semiannual q = Quarterly m = Monthly w = Weekly d = Daily wef = Weekly, Ending Friday weth = Weekly, Ending Thursday wew = Weekly, Ending Wednesday wetu = Weekly, Ending Tuesday wem = Weekly, Ending Monday wesu = Weekly, Ending Sunday wesa = Weekly, Ending Saturday bwew = Biweekly, Ending Wednesday bwem = Biweekly, Ending Monday", - "default": null, - "optional": true - }, - { - "name": "aggregation_method", - "type": "Literal['avg', 'sum', 'eop']", - "description": "A key that indicates the aggregation method used for frequency aggregation. This parameter has no affect if the frequency parameter is not set. Only valid when `is_series_group` is True. avg = Average sum = Sum eop = End of Period", - "default": "avg", - "optional": true - }, - { - "name": "transform", - "type": "Literal['lin', 'chg', 'ch1', 'pch', 'pc1', 'pca', 'cch', 'cca', 'log']", - "description": "Transformation type. Only valid when `is_series_group` is True. lin = Levels (No transformation) chg = Change ch1 = Change from Year Ago pch = Percent Change pc1 = Percent Change from Year Ago pca = Compounded Annual Rate of Change cch = Continuously Compounded Rate of Change cca = Continuously Compounded Annual Rate of Change log = Natural Log", - "default": "lin", - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[FredRegional]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fred']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - } - ], - "fred": [ - { - "name": "region", - "type": "str", - "description": "The name of the region.", - "default": "", - "optional": false - }, - { - "name": "code", - "type": "Union[str, int]", - "description": "The code of the region.", - "default": "", - "optional": false - }, - { - "name": "value", - "type": "Union[float, int]", - "description": "The obersvation value. The units are defined in the search results by series ID.", - "default": null, - "optional": true - }, - { - "name": "series_id", - "type": "str", - "description": "The individual series ID for the region.", - "default": "", - "optional": false - } - ] - }, - "model": "FredRegional" - }, - "/equity/calendar/ipo": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get historical and upcoming initial public offerings (IPOs).", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.calendar.ipo(provider='intrinio')\n# Get all IPOs available.\nobb.equity.calendar.ipo(provider='intrinio')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": null, - "optional": true - }, - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": 100, - "optional": true - }, - { - "name": "provider", - "type": "Literal['intrinio']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'intrinio' if there is no default.", - "default": "intrinio", - "optional": true - } - ], - "intrinio": [ - { - "name": "status", - "type": "Literal['upcoming', 'priced', 'withdrawn']", - "description": "Status of the IPO. [upcoming, priced, or withdrawn]", - "default": null, - "optional": true - }, - { - "name": "min_value", - "type": "int", - "description": "Return IPOs with an offer dollar amount greater than the given amount.", - "default": null, - "optional": true - }, - { - "name": "max_value", - "type": "int", - "description": "Return IPOs with an offer dollar amount less than the given amount.", - "default": null, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[CalendarIpo]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['intrinio']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": null, - "optional": true - }, - { - "name": "ipo_date", - "type": "date", - "description": "The date of the IPO, when the stock first trades on a major exchange.", - "default": null, - "optional": true - } - ], - "intrinio": [ - { - "name": "status", - "type": "Literal['upcoming', 'priced', 'withdrawn']", - "description": "The status of the IPO. Upcoming IPOs have not taken place yet but are expected to. Priced IPOs have taken place. Withdrawn IPOs were expected to take place, but were subsequently withdrawn.", - "default": null, - "optional": true - }, - { - "name": "exchange", - "type": "str", - "description": "The acronym of the stock exchange that the company is going to trade publicly on. Typically NYSE or NASDAQ.", - "default": null, - "optional": true - }, - { - "name": "offer_amount", - "type": "float", - "description": "The total dollar amount of shares offered in the IPO. Typically this is share price * share count", - "default": null, - "optional": true - }, - { - "name": "share_price", - "type": "float", - "description": "The price per share at which the IPO was offered.", - "default": null, - "optional": true - }, - { - "name": "share_price_lowest", - "type": "float", - "description": "The expected lowest price per share at which the IPO will be offered. Before an IPO is priced, companies typically provide a range of prices per share at which they expect to offer the IPO (typically available for upcoming IPOs).", - "default": null, - "optional": true - }, - { - "name": "share_price_highest", - "type": "float", - "description": "The expected highest price per share at which the IPO will be offered. Before an IPO is priced, companies typically provide a range of prices per share at which they expect to offer the IPO (typically available for upcoming IPOs).", - "default": null, - "optional": true - }, - { - "name": "share_count", - "type": "int", - "description": "The number of shares offered in the IPO.", - "default": null, - "optional": true - }, - { - "name": "share_count_lowest", - "type": "int", - "description": "The expected lowest number of shares that will be offered in the IPO. Before an IPO is priced, companies typically provide a range of shares that they expect to offer in the IPO (typically available for upcoming IPOs).", - "default": null, - "optional": true - }, - { - "name": "share_count_highest", - "type": "int", - "description": "The expected highest number of shares that will be offered in the IPO. Before an IPO is priced, companies typically provide a range of shares that they expect to offer in the IPO (typically available for upcoming IPOs).", - "default": null, - "optional": true - }, - { - "name": "announcement_url", - "type": "str", - "description": "The URL to the company's announcement of the IPO", - "default": null, - "optional": true - }, - { - "name": "sec_report_url", - "type": "str", - "description": "The URL to the company's S-1, S-1/A, F-1, or F-1/A SEC filing, which is required to be filed before an IPO takes place.", - "default": null, - "optional": true - }, - { - "name": "open_price", - "type": "float", - "description": "The opening price at the beginning of the first trading day (only available for priced IPOs).", - "default": null, - "optional": true - }, - { - "name": "close_price", - "type": "float", - "description": "The closing price at the end of the first trading day (only available for priced IPOs).", - "default": null, - "optional": true - }, - { - "name": "volume", - "type": "int", - "description": "The volume at the end of the first trading day (only available for priced IPOs).", - "default": null, - "optional": true - }, - { - "name": "day_change", - "type": "float", - "description": "The percentage change between the open price and the close price on the first trading day (only available for priced IPOs).", - "default": null, - "optional": true - }, - { - "name": "week_change", - "type": "float", - "description": "The percentage change between the open price on the first trading day and the close price approximately a week after the first trading day (only available for priced IPOs).", - "default": null, - "optional": true - }, - { - "name": "month_change", - "type": "float", - "description": "The percentage change between the open price on the first trading day and the close price approximately a month after the first trading day (only available for priced IPOs).", - "default": null, - "optional": true - }, - { - "name": "id", - "type": "str", - "description": "The Intrinio ID of the IPO.", - "default": null, - "optional": true - }, - { - "name": "company", - "type": "IntrinioCompany", - "description": "The company that is going public via the IPO.", - "default": null, - "optional": true - }, - { - "name": "security", - "type": "IntrinioSecurity", - "description": "The primary Security for the Company that is going public via the IPO", - "default": null, - "optional": true - } - ] - }, - "model": "CalendarIpo" - }, - "/equity/calendar/dividend": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get historical and upcoming dividend payments. Includes dividend amount, ex-dividend and payment dates.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.calendar.dividend(provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[CalendarDividend]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "ex_dividend_date", - "type": "date", - "description": "The ex-dividend date - the date on which the stock begins trading without rights to the dividend.", - "default": "", - "optional": false - }, - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "amount", - "type": "float", - "description": "The dividend amount per share.", - "default": null, - "optional": true - }, - { - "name": "name", - "type": "str", - "description": "Name of the entity.", - "default": null, - "optional": true - }, - { - "name": "record_date", - "type": "date", - "description": "The record date of ownership for eligibility.", - "default": null, - "optional": true - }, - { - "name": "payment_date", - "type": "date", - "description": "The payment date of the dividend.", - "default": null, - "optional": true - }, - { - "name": "declaration_date", - "type": "date", - "description": "Declaration date of the dividend.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "adjusted_amount", - "type": "float", - "description": "The adjusted-dividend amount.", - "default": null, - "optional": true - }, - { - "name": "label", - "type": "str", - "description": "Ex-dividend date formatted for display.", - "default": null, - "optional": true - } - ] - }, - "model": "CalendarDividend" - }, - "/equity/calendar/splits": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get historical and upcoming stock split operations.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.calendar.splits(provider='fmp')\n# Get stock splits calendar for specific dates.\nobb.equity.calendar.splits(start_date='2024-02-01', end_date='2024-02-07', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[CalendarSplits]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "label", - "type": "str", - "description": "Label of the stock splits.", - "default": "", - "optional": false - }, - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "numerator", - "type": "float", - "description": "Numerator of the stock splits.", - "default": "", - "optional": false - }, - { - "name": "denominator", - "type": "float", - "description": "Denominator of the stock splits.", - "default": "", - "optional": false - } - ], - "fmp": [] - }, - "model": "CalendarSplits" - }, - "/equity/calendar/earnings": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get historical and upcoming company earnings releases. Includes earnings per share (EPS) and revenue data.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.calendar.earnings(provider='fmp')\n# Get earnings calendar for specific dates.\nobb.equity.calendar.earnings(start_date='2024-02-01', end_date='2024-02-07', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[CalendarEarnings]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "report_date", - "type": "date", - "description": "The date of the earnings report.", - "default": "", - "optional": false - }, - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "name", - "type": "str", - "description": "Name of the entity.", - "default": null, - "optional": true - }, - { - "name": "eps_previous", - "type": "float", - "description": "The earnings-per-share from the same previously reported period.", - "default": null, - "optional": true - }, - { - "name": "eps_consensus", - "type": "float", - "description": "The analyst conesus earnings-per-share estimate.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "eps_actual", - "type": "float", - "description": "The actual earnings per share announced.", - "default": null, - "optional": true - }, - { - "name": "revenue_actual", - "type": "float", - "description": "The actual reported revenue.", - "default": null, - "optional": true - }, - { - "name": "revenue_consensus", - "type": "float", - "description": "The revenue forecast consensus.", - "default": null, - "optional": true - }, - { - "name": "period_ending", - "type": "date", - "description": "The fiscal period end date.", - "default": null, - "optional": true - }, - { - "name": "reporting_time", - "type": "str", - "description": "The reporting time - e.g. after market close.", - "default": null, - "optional": true - }, - { - "name": "updated_date", - "type": "date", - "description": "The date the data was updated last.", - "default": null, - "optional": true - } - ] - }, - "model": "CalendarEarnings" - }, - "/equity/compare/peers": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get the closest peers for a given company.\n\nPeers consist of companies trading on the same exchange, operating within the same sector\nand with comparable market capitalizations.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.compare.peers(symbol='AAPL', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EquityPeers]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "peers_list", - "type": "List[str]", - "description": "A list of equity peers based on sector, exchange and market cap.", - "default": "", - "optional": true - } - ], - "fmp": [] - }, - "model": "EquityPeers" - }, - "/equity/estimates/price_target": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get analyst price targets by company.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.estimates.price_target(provider='benzinga')\n# Get price targets for Microsoft using 'benzinga' as provider.\nobb.equity.estimates.price_target(start_date=2020-01-01, end_date=2024-02-16, limit=10, symbol='msft', provider='benzinga', action=downgrades)\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. Multiple items allowed for provider(s): benzinga, fmp.", - "default": null, - "optional": true - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": 200, - "optional": true - }, - { - "name": "provider", - "type": "Literal['benzinga', 'fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'benzinga' if there is no default.", - "default": "benzinga", - "optional": true - } - ], - "benzinga": [ - { - "name": "page", - "type": "int", - "description": "Page offset. For optimization, performance and technical reasons, page offsets are limited from 0 - 100000. Limit the query results by other parameters such as date. Used in conjunction with the limit and date parameters.", - "default": 0, - "optional": true - }, - { - "name": "date", - "type": "Union[date, str]", - "description": "Date for calendar data, shorthand for date_from and date_to.", - "default": null, - "optional": true - }, - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "updated", - "type": "Union[date, int]", - "description": "Records last Updated Unix timestamp (UTC). This will force the sort order to be Greater Than or Equal to the timestamp indicated. The date can be a date string or a Unix timestamp. The date string must be in the format of YYYY-MM-DD.", - "default": null, - "optional": true - }, - { - "name": "importance", - "type": "int", - "description": "Importance level to filter by. Uses Greater Than or Equal To the importance indicated", - "default": null, - "optional": true - }, - { - "name": "action", - "type": "Literal['downgrades', 'maintains', 'reinstates', 'reiterates', 'upgrades', 'assumes', 'initiates', 'terminates', 'removes', 'suspends', 'firm_dissolved']", - "description": "Filter by a specific action_company.", - "default": null, - "optional": true - }, - { - "name": "analyst_ids", - "type": "Union[List[str], str]", - "description": "Comma-separated list of analyst (person) IDs. Omitting will bring back all available analysts.", - "default": null, - "optional": true - }, - { - "name": "firm_ids", - "type": "Union[List[str], str]", - "description": "Comma-separated list of firm IDs.", - "default": null, - "optional": true - }, - { - "name": "fields", - "type": "Union[List[str], str]", - "description": "Comma-separated list of fields to include in the response. See https://docs.benzinga.io/benzinga-apis/calendar/get-ratings to learn about the available fields.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "with_grade", - "type": "bool", - "description": "Include upgrades and downgrades in the response.", - "default": false, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[PriceTarget]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['benzinga', 'fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "published_date", - "type": "Union[date, datetime]", - "description": "Published date of the price target.", - "default": "", - "optional": false - }, - { - "name": "published_time", - "type": "datetime.time", - "description": "Time of the original rating, UTC.", - "default": null, - "optional": true - }, - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "exchange", - "type": "str", - "description": "Exchange where the company is traded.", - "default": null, - "optional": true - }, - { - "name": "company_name", - "type": "str", - "description": "Name of company that is the subject of rating.", - "default": null, - "optional": true - }, - { - "name": "analyst_name", - "type": "str", - "description": "Analyst name.", - "default": null, - "optional": true - }, - { - "name": "analyst_firm", - "type": "str", - "description": "Name of the analyst firm that published the price target.", - "default": null, - "optional": true - }, - { - "name": "currency", - "type": "str", - "description": "Currency the data is denominated in.", - "default": null, - "optional": true - }, - { - "name": "price_target", - "type": "float", - "description": "The current price target.", - "default": null, - "optional": true - }, - { - "name": "adj_price_target", - "type": "float", - "description": "Adjusted price target for splits and stock dividends.", - "default": null, - "optional": true - }, - { - "name": "price_target_previous", - "type": "float", - "description": "Previous price target.", - "default": null, - "optional": true - }, - { - "name": "previous_adj_price_target", - "type": "float", - "description": "Previous adjusted price target.", - "default": null, - "optional": true - }, - { - "name": "price_when_posted", - "type": "float", - "description": "Price when posted.", - "default": null, - "optional": true - }, - { - "name": "rating_current", - "type": "str", - "description": "The analyst's rating for the company.", - "default": null, - "optional": true - }, - { - "name": "rating_previous", - "type": "str", - "description": "Previous analyst rating for the company.", - "default": null, - "optional": true - }, - { - "name": "action", - "type": "str", - "description": "Description of the change in rating from firm's last rating.", - "default": null, - "optional": true - } - ], - "benzinga": [ - { - "name": "action_change", - "type": "Literal['Announces', 'Maintains', 'Lowers', 'Raises', 'Removes', 'Adjusts']", - "description": "Description of the change in price target from firm's last price target.", - "default": null, - "optional": true - }, - { - "name": "importance", - "type": "Literal[0, 1, 2, 3, 4, 5]", - "description": "Subjective Basis of How Important Event is to Market. 5 = High", - "default": null, - "optional": true - }, - { - "name": "notes", - "type": "str", - "description": "Notes of the price target.", - "default": null, - "optional": true - }, - { - "name": "analyst_id", - "type": "str", - "description": "Id of the analyst.", - "default": null, - "optional": true - }, - { - "name": "url_news", - "type": "str", - "description": "URL for analyst ratings news articles for this ticker on Benzinga.com.", - "default": null, - "optional": true - }, - { - "name": "url_analyst", - "type": "str", - "description": "URL for analyst ratings page for this ticker on Benzinga.com.", - "default": null, - "optional": true - }, - { - "name": "id", - "type": "str", - "description": "Unique ID of this entry.", - "default": null, - "optional": true - }, - { - "name": "last_updated", - "type": "datetime", - "description": "Last updated timestamp, UTC.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "news_url", - "type": "str", - "description": "News URL of the price target.", - "default": null, - "optional": true - }, - { - "name": "news_title", - "type": "str", - "description": "News title of the price target.", - "default": null, - "optional": true - }, - { - "name": "news_publisher", - "type": "str", - "description": "News publisher of the price target.", - "default": null, - "optional": true - }, - { - "name": "news_base_url", - "type": "str", - "description": "News base URL of the price target.", - "default": null, - "optional": true - } - ] - }, - "model": "PriceTarget" - }, - "/equity/estimates/historical": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get historical analyst estimates for earnings and revenue.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.estimates.historical(symbol='AAPL', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [ - { - "name": "period", - "type": "Literal['quarter', 'annual']", - "description": "Time period of the data to return.", - "default": "annual", - "optional": true - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": null, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[AnalystEstimates]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "estimated_revenue_low", - "type": "int", - "description": "Estimated revenue low.", - "default": null, - "optional": true - }, - { - "name": "estimated_revenue_high", - "type": "int", - "description": "Estimated revenue high.", - "default": null, - "optional": true - }, - { - "name": "estimated_revenue_avg", - "type": "int", - "description": "Estimated revenue average.", - "default": null, - "optional": true - }, - { - "name": "estimated_sga_expense_low", - "type": "int", - "description": "Estimated SGA expense low.", - "default": null, - "optional": true - }, - { - "name": "estimated_sga_expense_high", - "type": "int", - "description": "Estimated SGA expense high.", - "default": null, - "optional": true - }, - { - "name": "estimated_sga_expense_avg", - "type": "int", - "description": "Estimated SGA expense average.", - "default": null, - "optional": true - }, - { - "name": "estimated_ebitda_low", - "type": "int", - "description": "Estimated EBITDA low.", - "default": null, - "optional": true - }, - { - "name": "estimated_ebitda_high", - "type": "int", - "description": "Estimated EBITDA high.", - "default": null, - "optional": true - }, - { - "name": "estimated_ebitda_avg", - "type": "int", - "description": "Estimated EBITDA average.", - "default": null, - "optional": true - }, - { - "name": "estimated_ebit_low", - "type": "int", - "description": "Estimated EBIT low.", - "default": null, - "optional": true - }, - { - "name": "estimated_ebit_high", - "type": "int", - "description": "Estimated EBIT high.", - "default": null, - "optional": true - }, - { - "name": "estimated_ebit_avg", - "type": "int", - "description": "Estimated EBIT average.", - "default": null, - "optional": true - }, - { - "name": "estimated_net_income_low", - "type": "int", - "description": "Estimated net income low.", - "default": null, - "optional": true - }, - { - "name": "estimated_net_income_high", - "type": "int", - "description": "Estimated net income high.", - "default": null, - "optional": true - }, - { - "name": "estimated_net_income_avg", - "type": "int", - "description": "Estimated net income average.", - "default": null, - "optional": true - }, - { - "name": "estimated_eps_avg", - "type": "float", - "description": "Estimated EPS average.", - "default": null, - "optional": true - }, - { - "name": "estimated_eps_high", - "type": "float", - "description": "Estimated EPS high.", - "default": null, - "optional": true - }, - { - "name": "estimated_eps_low", - "type": "float", - "description": "Estimated EPS low.", - "default": null, - "optional": true - }, - { - "name": "number_analyst_estimated_revenue", - "type": "int", - "description": "Number of analysts who estimated revenue.", - "default": null, - "optional": true - }, - { - "name": "number_analysts_estimated_eps", - "type": "int", - "description": "Number of analysts who estimated EPS.", - "default": null, - "optional": true - } - ], - "fmp": [] - }, - "model": "AnalystEstimates" - }, - "/equity/estimates/consensus": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get consensus price target and recommendation.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.estimates.consensus(symbol='AAPL', provider='fmp')\nobb.equity.estimates.consensus(symbol='AAPL,MSFT', provider='yfinance')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, yfinance.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['fmp', 'yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [], - "yfinance": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[PriceTargetConsensus]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "target_high", - "type": "float", - "description": "High target of the price target consensus.", - "default": null, - "optional": true - }, - { - "name": "target_low", - "type": "float", - "description": "Low target of the price target consensus.", - "default": null, - "optional": true - }, - { - "name": "target_consensus", - "type": "float", - "description": "Consensus target of the price target consensus.", - "default": null, - "optional": true - }, - { - "name": "target_median", - "type": "float", - "description": "Median target of the price target consensus.", - "default": null, - "optional": true - } - ], - "fmp": [], - "yfinance": [ - { - "name": "recommendation", - "type": "str", - "description": "Recommendation - buy, sell, etc.", - "default": null, - "optional": true - }, - { - "name": "recommendation_mean", - "type": "float", - "description": "Mean recommendation score where 1 is strong buy and 5 is strong sell.", - "default": null, - "optional": true - }, - { - "name": "number_of_analysts", - "type": "int", - "description": "Number of analysts providing opinions.", - "default": null, - "optional": true - }, - { - "name": "current_price", - "type": "float", - "description": "Current price of the stock.", - "default": null, - "optional": true - }, - { - "name": "currency", - "type": "str", - "description": "Currency the stock is priced in.", - "default": null, - "optional": true - } - ] - }, - "model": "PriceTargetConsensus" - }, - "/equity/estimates/analyst_search": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Search for specific analysts and get their forecast track record.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.estimates.analyst_search(provider='benzinga')\nobb.equity.estimates.analyst_search(firm_name='Wedbush', provider='benzinga')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "analyst_name", - "type": "Union[str, List[str]]", - "description": "Analyst names to return. Omitting will return all available analysts. Multiple items allowed for provider(s): benzinga.", - "default": null, - "optional": true - }, - { - "name": "firm_name", - "type": "Union[str, List[str]]", - "description": "Firm names to return. Omitting will return all available firms. Multiple items allowed for provider(s): benzinga.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['benzinga']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'benzinga' if there is no default.", - "default": "benzinga", - "optional": true - } - ], - "benzinga": [ - { - "name": "analyst_ids", - "type": "Union[str, List[str]]", - "description": "List of analyst IDs to return. Multiple items allowed for provider(s): benzinga.", - "default": null, - "optional": true - }, - { - "name": "firm_ids", - "type": "Union[str, List[str]]", - "description": "Firm IDs to return. Multiple items allowed for provider(s): benzinga.", - "default": null, - "optional": true - }, - { - "name": "limit", - "type": "int", - "description": "Number of results returned. Limit 1000.", - "default": 100, - "optional": true - }, - { - "name": "page", - "type": "int", - "description": "Page offset. For optimization, performance and technical reasons, page offsets are limited from 0 - 100000. Limit the query results by other parameters such as date.", - "default": 0, - "optional": true - }, - { - "name": "fields", - "type": "Union[str, List[str]]", - "description": "Fields to include in the response. See https://docs.benzinga.io/benzinga-apis/calendar/get-ratings to learn about the available fields. Multiple items allowed for provider(s): benzinga.", - "default": null, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[AnalystSearch]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['benzinga']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "last_updated", - "type": "datetime", - "description": "Date of the last update.", - "default": null, - "optional": true - }, - { - "name": "firm_name", - "type": "str", - "description": "Firm name of the analyst.", - "default": null, - "optional": true - }, - { - "name": "name_first", - "type": "str", - "description": "Analyst first name.", - "default": null, - "optional": true - }, - { - "name": "name_last", - "type": "str", - "description": "Analyst last name.", - "default": null, - "optional": true - }, - { - "name": "name_full", - "type": "str", - "description": "Analyst full name.", - "default": "", - "optional": false - } - ], - "benzinga": [ - { - "name": "analyst_id", - "type": "str", - "description": "ID of the analyst.", - "default": null, - "optional": true - }, - { - "name": "firm_id", - "type": "str", - "description": "ID of the analyst firm.", - "default": null, - "optional": true - }, - { - "name": "smart_score", - "type": "float", - "description": "A weighted average of the total_ratings_percentile, overall_avg_return_percentile, and overall_success_rate", - "default": null, - "optional": true - }, - { - "name": "overall_success_rate", - "type": "float", - "description": "The percentage (normalized) of gain/loss ratings that resulted in a gain overall.", - "default": null, - "optional": true - }, - { - "name": "overall_avg_return_percentile", - "type": "float", - "description": "The percentile (normalized) of this analyst's overall average return per rating in comparison to other analysts' overall average returns per rating.", - "default": null, - "optional": true - }, - { - "name": "total_ratings_percentile", - "type": "float", - "description": "The percentile (normalized) of this analyst's total number of ratings in comparison to the total number of ratings published by all other analysts", - "default": null, - "optional": true - }, - { - "name": "total_ratings", - "type": "int", - "description": "Number of recommendations made by this analyst.", - "default": null, - "optional": true - }, - { - "name": "overall_gain_count", - "type": "int", - "description": "The number of ratings that have gained value since the date of recommendation", - "default": null, - "optional": true - }, - { - "name": "overall_loss_count", - "type": "int", - "description": "The number of ratings that have lost value since the date of recommendation", - "default": null, - "optional": true - }, - { - "name": "overall_average_return", - "type": "float", - "description": "The average percent (normalized) price difference per rating since the date of recommendation", - "default": null, - "optional": true - }, - { - "name": "overall_std_dev", - "type": "float", - "description": "The standard deviation in percent (normalized) price difference in the analyst's ratings since the date of recommendation", - "default": null, - "optional": true - }, - { - "name": "gain_count_1m", - "type": "int", - "description": "The number of ratings that have gained value over the last month", - "default": null, - "optional": true - }, - { - "name": "loss_count_1m", - "type": "int", - "description": "The number of ratings that have lost value over the last month", - "default": null, - "optional": true - }, - { - "name": "average_return_1m", - "type": "float", - "description": "The average percent (normalized) price difference per rating over the last month", - "default": null, - "optional": true - }, - { - "name": "std_dev_1m", - "type": "float", - "description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last month", - "default": null, - "optional": true - }, - { - "name": "gain_count_3m", - "type": "int", - "description": "The number of ratings that have gained value over the last 3 months", - "default": null, - "optional": true - }, - { - "name": "loss_count_3m", - "type": "int", - "description": "The number of ratings that have lost value over the last 3 months", - "default": null, - "optional": true - }, - { - "name": "average_return_3m", - "type": "float", - "description": "The average percent (normalized) price difference per rating over the last 3 months", - "default": null, - "optional": true - }, - { - "name": "std_dev_3m", - "type": "float", - "description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 3 months", - "default": null, - "optional": true - }, - { - "name": "gain_count_6m", - "type": "int", - "description": "The number of ratings that have gained value over the last 6 months", - "default": null, - "optional": true - }, - { - "name": "loss_count_6m", - "type": "int", - "description": "The number of ratings that have lost value over the last 6 months", - "default": null, - "optional": true - }, - { - "name": "average_return_6m", - "type": "float", - "description": "The average percent (normalized) price difference per rating over the last 6 months", - "default": null, - "optional": true - }, - { - "name": "std_dev_6m", - "type": "float", - "description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 6 months", - "default": null, - "optional": true - }, - { - "name": "gain_count_9m", - "type": "int", - "description": "The number of ratings that have gained value over the last 9 months", - "default": null, - "optional": true - }, - { - "name": "loss_count_9m", - "type": "int", - "description": "The number of ratings that have lost value over the last 9 months", - "default": null, - "optional": true - }, - { - "name": "average_return_9m", - "type": "float", - "description": "The average percent (normalized) price difference per rating over the last 9 months", - "default": null, - "optional": true - }, - { - "name": "std_dev_9m", - "type": "float", - "description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 9 months", - "default": null, - "optional": true - }, - { - "name": "gain_count_1y", - "type": "int", - "description": "The number of ratings that have gained value over the last 1 year", - "default": null, - "optional": true - }, - { - "name": "loss_count_1y", - "type": "int", - "description": "The number of ratings that have lost value over the last 1 year", - "default": null, - "optional": true - }, - { - "name": "average_return_1y", - "type": "float", - "description": "The average percent (normalized) price difference per rating over the last 1 year", - "default": null, - "optional": true - }, - { - "name": "std_dev_1y", - "type": "float", - "description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 1 year", - "default": null, - "optional": true - }, - { - "name": "gain_count_2y", - "type": "int", - "description": "The number of ratings that have gained value over the last 2 years", - "default": null, - "optional": true - }, - { - "name": "loss_count_2y", - "type": "int", - "description": "The number of ratings that have lost value over the last 2 years", - "default": null, - "optional": true - }, - { - "name": "average_return_2y", - "type": "float", - "description": "The average percent (normalized) price difference per rating over the last 2 years", - "default": null, - "optional": true - }, - { - "name": "std_dev_2y", - "type": "float", - "description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 2 years", - "default": null, - "optional": true - }, - { - "name": "gain_count_3y", - "type": "int", - "description": "The number of ratings that have gained value over the last 3 years", - "default": null, - "optional": true - }, - { - "name": "loss_count_3y", - "type": "int", - "description": "The number of ratings that have lost value over the last 3 years", - "default": null, - "optional": true - }, - { - "name": "average_return_3y", - "type": "float", - "description": "The average percent (normalized) price difference per rating over the last 3 years", - "default": null, - "optional": true - }, - { - "name": "std_dev_3y", - "type": "float", - "description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 3 years", - "default": null, - "optional": true - } - ] - }, - "model": "AnalystSearch" - }, - "/equity/discovery/gainers": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get the top price gainers in the stock market.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.discovery.gainers(provider='yfinance')\nobb.equity.discovery.gainers(sort='desc', provider='yfinance')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "sort", - "type": "Literal['asc', 'desc']", - "description": "Sort order. Possible values: 'asc', 'desc'. Default: 'desc'.", - "default": "desc", - "optional": true - }, - { - "name": "provider", - "type": "Literal['yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'yfinance' if there is no default.", - "default": "yfinance", - "optional": true - } - ], - "yfinance": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EquityGainers]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "name", - "type": "str", - "description": "Name of the entity.", - "default": "", - "optional": false - }, - { - "name": "price", - "type": "float", - "description": "Last price.", - "default": "", - "optional": false - }, - { - "name": "change", - "type": "float", - "description": "Change in price value.", - "default": "", - "optional": false - }, - { - "name": "percent_change", - "type": "float", - "description": "Percent change.", - "default": "", - "optional": false - }, - { - "name": "volume", - "type": "float", - "description": "The trading volume.", - "default": "", - "optional": false - } - ], - "yfinance": [ - { - "name": "market_cap", - "type": "float", - "description": "Market Cap.", - "default": "", - "optional": false - }, - { - "name": "avg_volume_3_months", - "type": "float", - "description": "Average volume over the last 3 months in millions.", - "default": "", - "optional": false - }, - { - "name": "pe_ratio_ttm", - "type": "float", - "description": "PE Ratio (TTM).", - "default": null, - "optional": true - } - ] - }, - "model": "EquityGainers" - }, - "/equity/discovery/losers": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get the top price losers in the stock market.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.discovery.losers(provider='yfinance')\nobb.equity.discovery.losers(sort='desc', provider='yfinance')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "sort", - "type": "Literal['asc', 'desc']", - "description": "Sort order. Possible values: 'asc', 'desc'. Default: 'desc'.", - "default": "desc", - "optional": true - }, - { - "name": "provider", - "type": "Literal['yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'yfinance' if there is no default.", - "default": "yfinance", - "optional": true - } - ], - "yfinance": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EquityLosers]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "name", - "type": "str", - "description": "Name of the entity.", - "default": "", - "optional": false - }, - { - "name": "price", - "type": "float", - "description": "Last price.", - "default": "", - "optional": false - }, - { - "name": "change", - "type": "float", - "description": "Change in price value.", - "default": "", - "optional": false - }, - { - "name": "percent_change", - "type": "float", - "description": "Percent change.", - "default": "", - "optional": false - }, - { - "name": "volume", - "type": "float", - "description": "The trading volume.", - "default": "", - "optional": false - } - ], - "yfinance": [ - { - "name": "market_cap", - "type": "float", - "description": "Market Cap.", - "default": "", - "optional": false - }, - { - "name": "avg_volume_3_months", - "type": "float", - "description": "Average volume over the last 3 months in millions.", - "default": "", - "optional": false - }, - { - "name": "pe_ratio_ttm", - "type": "float", - "description": "PE Ratio (TTM).", - "default": null, - "optional": true - } - ] - }, - "model": "EquityLosers" - }, - "/equity/discovery/active": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get the most actively traded stocks based on volume.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.discovery.active(provider='yfinance')\nobb.equity.discovery.active(sort='desc', provider='yfinance')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "sort", - "type": "Literal['asc', 'desc']", - "description": "Sort order. Possible values: 'asc', 'desc'. Default: 'desc'.", - "default": "desc", - "optional": true - }, - { - "name": "provider", - "type": "Literal['yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'yfinance' if there is no default.", - "default": "yfinance", - "optional": true - } - ], - "yfinance": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EquityActive]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "name", - "type": "str", - "description": "Name of the entity.", - "default": "", - "optional": false - }, - { - "name": "price", - "type": "float", - "description": "Last price.", - "default": "", - "optional": false - }, - { - "name": "change", - "type": "float", - "description": "Change in price value.", - "default": "", - "optional": false - }, - { - "name": "percent_change", - "type": "float", - "description": "Percent change.", - "default": "", - "optional": false - }, - { - "name": "volume", - "type": "float", - "description": "The trading volume.", - "default": "", - "optional": false - } - ], - "yfinance": [ - { - "name": "market_cap", - "type": "float", - "description": "Market Cap displayed in billions.", - "default": "", - "optional": false - }, - { - "name": "avg_volume_3_months", - "type": "float", - "description": "Average volume over the last 3 months in millions.", - "default": "", - "optional": false - }, - { - "name": "pe_ratio_ttm", - "type": "float", - "description": "PE Ratio (TTM).", - "default": null, - "optional": true - } - ] - }, - "model": "EquityActive" - }, - "/equity/discovery/undervalued_large_caps": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get potentially undervalued large cap stocks.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.discovery.undervalued_large_caps(provider='yfinance')\nobb.equity.discovery.undervalued_large_caps(sort='desc', provider='yfinance')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "sort", - "type": "Literal['asc', 'desc']", - "description": "Sort order. Possible values: 'asc', 'desc'. Default: 'desc'.", - "default": "desc", - "optional": true - }, - { - "name": "provider", - "type": "Literal['yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'yfinance' if there is no default.", - "default": "yfinance", - "optional": true - } - ], - "yfinance": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EquityUndervaluedLargeCaps]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "name", - "type": "str", - "description": "Name of the entity.", - "default": "", - "optional": false - }, - { - "name": "price", - "type": "float", - "description": "Last price.", - "default": "", - "optional": false - }, - { - "name": "change", - "type": "float", - "description": "Change in price value.", - "default": "", - "optional": false - }, - { - "name": "percent_change", - "type": "float", - "description": "Percent change.", - "default": "", - "optional": false - }, - { - "name": "volume", - "type": "float", - "description": "The trading volume.", - "default": "", - "optional": false - } - ], - "yfinance": [ - { - "name": "market_cap", - "type": "float", - "description": "Market Cap.", - "default": null, - "optional": true - }, - { - "name": "avg_volume_3_months", - "type": "float", - "description": "Average volume over the last 3 months in millions.", - "default": null, - "optional": true - }, - { - "name": "pe_ratio_ttm", - "type": "float", - "description": "PE Ratio (TTM).", - "default": null, - "optional": true - } - ] - }, - "model": "EquityUndervaluedLargeCaps" - }, - "/equity/discovery/undervalued_growth": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get potentially undervalued growth stocks.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.discovery.undervalued_growth(provider='yfinance')\nobb.equity.discovery.undervalued_growth(sort='desc', provider='yfinance')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "sort", - "type": "Literal['asc', 'desc']", - "description": "Sort order. Possible values: 'asc', 'desc'. Default: 'desc'.", - "default": "desc", - "optional": true - }, - { - "name": "provider", - "type": "Literal['yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'yfinance' if there is no default.", - "default": "yfinance", - "optional": true - } - ], - "yfinance": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EquityUndervaluedGrowth]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "name", - "type": "str", - "description": "Name of the entity.", - "default": "", - "optional": false - }, - { - "name": "price", - "type": "float", - "description": "Last price.", - "default": "", - "optional": false - }, - { - "name": "change", - "type": "float", - "description": "Change in price value.", - "default": "", - "optional": false - }, - { - "name": "percent_change", - "type": "float", - "description": "Percent change.", - "default": "", - "optional": false - }, - { - "name": "volume", - "type": "float", - "description": "The trading volume.", - "default": "", - "optional": false - } - ], - "yfinance": [ - { - "name": "market_cap", - "type": "float", - "description": "Market Cap.", - "default": null, - "optional": true - }, - { - "name": "avg_volume_3_months", - "type": "float", - "description": "Average volume over the last 3 months in millions.", - "default": null, - "optional": true - }, - { - "name": "pe_ratio_ttm", - "type": "float", - "description": "PE Ratio (TTM).", - "default": null, - "optional": true - } - ] - }, - "model": "EquityUndervaluedGrowth" - }, - "/equity/discovery/aggressive_small_caps": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get top small cap stocks based on earnings growth.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.discovery.aggressive_small_caps(provider='yfinance')\nobb.equity.discovery.aggressive_small_caps(sort='desc', provider='yfinance')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "sort", - "type": "Literal['asc', 'desc']", - "description": "Sort order. Possible values: 'asc', 'desc'. Default: 'desc'.", - "default": "desc", - "optional": true - }, - { - "name": "provider", - "type": "Literal['yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'yfinance' if there is no default.", - "default": "yfinance", - "optional": true - } - ], - "yfinance": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EquityAggressiveSmallCaps]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "name", - "type": "str", - "description": "Name of the entity.", - "default": "", - "optional": false - }, - { - "name": "price", - "type": "float", - "description": "Last price.", - "default": "", - "optional": false - }, - { - "name": "change", - "type": "float", - "description": "Change in price value.", - "default": "", - "optional": false - }, - { - "name": "percent_change", - "type": "float", - "description": "Percent change.", - "default": "", - "optional": false - }, - { - "name": "volume", - "type": "float", - "description": "The trading volume.", - "default": "", - "optional": false - } - ], - "yfinance": [ - { - "name": "market_cap", - "type": "float", - "description": "Market Cap.", - "default": null, - "optional": true - }, - { - "name": "avg_volume_3_months", - "type": "float", - "description": "Average volume over the last 3 months in millions.", - "default": null, - "optional": true - }, - { - "name": "pe_ratio_ttm", - "type": "float", - "description": "PE Ratio (TTM).", - "default": null, - "optional": true - } - ] - }, - "model": "EquityAggressiveSmallCaps" - }, - "/equity/discovery/growth_tech": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get top tech stocks based on revenue and earnings growth.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.discovery.growth_tech(provider='yfinance')\nobb.equity.discovery.growth_tech(sort='desc', provider='yfinance')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "sort", - "type": "Literal['asc', 'desc']", - "description": "Sort order. Possible values: 'asc', 'desc'. Default: 'desc'.", - "default": "desc", - "optional": true - }, - { - "name": "provider", - "type": "Literal['yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'yfinance' if there is no default.", - "default": "yfinance", - "optional": true - } - ], - "yfinance": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[GrowthTechEquities]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "name", - "type": "str", - "description": "Name of the entity.", - "default": "", - "optional": false - }, - { - "name": "price", - "type": "float", - "description": "Last price.", - "default": "", - "optional": false - }, - { - "name": "change", - "type": "float", - "description": "Change in price value.", - "default": "", - "optional": false - }, - { - "name": "percent_change", - "type": "float", - "description": "Percent change.", - "default": "", - "optional": false - }, - { - "name": "volume", - "type": "float", - "description": "The trading volume.", - "default": "", - "optional": false - } - ], - "yfinance": [ - { - "name": "market_cap", - "type": "float", - "description": "Market Cap.", - "default": null, - "optional": true - }, - { - "name": "avg_volume_3_months", - "type": "float", - "description": "Average volume over the last 3 months in millions.", - "default": null, - "optional": true - }, - { - "name": "pe_ratio_ttm", - "type": "float", - "description": "PE Ratio (TTM).", - "default": null, - "optional": true - } - ] - }, - "model": "GrowthTechEquities" - }, - "/equity/discovery/filings": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get the URLs to SEC filings reported to EDGAR database, such as 10-K, 10-Q, 8-K, and more. SEC\nfilings include Form 10-K, Form 10-Q, Form 8-K, the proxy statement, Forms 3, 4, and 5, Schedule 13, Form 114,\nForeign Investment Disclosures and others. The annual 10-K report is required to be\nfiled annually and includes the company's financial statements, management discussion and analysis,\nand audited financial statements.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.discovery.filings(provider='fmp')\n# Get filings for the year 2023, limited to 100 results\nobb.equity.discovery.filings(start_date='2023-01-01', end_date='2023-12-31', limit=100, provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "form_type", - "type": "str", - "description": "Filter by form type. Visit https://www.sec.gov/forms for a list of supported form types.", - "default": null, - "optional": true - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": 100, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [ - { - "name": "is_done", - "type": "bool", - "description": "Flag for whether or not the filing is done.", - "default": null, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[DiscoveryFilings]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "cik", - "type": "str", - "description": "Central Index Key (CIK) for the requested entity.", - "default": "", - "optional": false - }, - { - "name": "title", - "type": "str", - "description": "Title of the filing.", - "default": "", - "optional": false - }, - { - "name": "date", - "type": "datetime", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "form_type", - "type": "str", - "description": "The form type of the filing", - "default": "", - "optional": false - }, - { - "name": "link", - "type": "str", - "description": "URL to the filing page on the SEC site.", - "default": "", - "optional": false - } - ], - "fmp": [] - }, - "model": "DiscoveryFilings" - }, - "/equity/fundamental/multiples": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get equity valuation multiples for a given company.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.multiples(symbol='AAPL', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EquityValuationMultiples]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "revenue_per_share_ttm", - "type": "float", - "description": "Revenue per share calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "net_income_per_share_ttm", - "type": "float", - "description": "Net income per share calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "operating_cash_flow_per_share_ttm", - "type": "float", - "description": "Operating cash flow per share calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "free_cash_flow_per_share_ttm", - "type": "float", - "description": "Free cash flow per share calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "cash_per_share_ttm", - "type": "float", - "description": "Cash per share calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "book_value_per_share_ttm", - "type": "float", - "description": "Book value per share calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "tangible_book_value_per_share_ttm", - "type": "float", - "description": "Tangible book value per share calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "shareholders_equity_per_share_ttm", - "type": "float", - "description": "Shareholders equity per share calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "interest_debt_per_share_ttm", - "type": "float", - "description": "Interest debt per share calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "market_cap_ttm", - "type": "float", - "description": "Market capitalization calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "enterprise_value_ttm", - "type": "float", - "description": "Enterprise value calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "pe_ratio_ttm", - "type": "float", - "description": "Price-to-earnings ratio (P/E ratio) calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "price_to_sales_ratio_ttm", - "type": "float", - "description": "Price-to-sales ratio calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "pocf_ratio_ttm", - "type": "float", - "description": "Price-to-operating cash flow ratio calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "pfcf_ratio_ttm", - "type": "float", - "description": "Price-to-free cash flow ratio calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "pb_ratio_ttm", - "type": "float", - "description": "Price-to-book ratio calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "ptb_ratio_ttm", - "type": "float", - "description": "Price-to-tangible book ratio calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "ev_to_sales_ttm", - "type": "float", - "description": "Enterprise value-to-sales ratio calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "enterprise_value_over_ebitda_ttm", - "type": "float", - "description": "Enterprise value-to-EBITDA ratio calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "ev_to_operating_cash_flow_ttm", - "type": "float", - "description": "Enterprise value-to-operating cash flow ratio calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "ev_to_free_cash_flow_ttm", - "type": "float", - "description": "Enterprise value-to-free cash flow ratio calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "earnings_yield_ttm", - "type": "float", - "description": "Earnings yield calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "free_cash_flow_yield_ttm", - "type": "float", - "description": "Free cash flow yield calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "debt_to_equity_ttm", - "type": "float", - "description": "Debt-to-equity ratio calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "debt_to_assets_ttm", - "type": "float", - "description": "Debt-to-assets ratio calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "net_debt_to_ebitda_ttm", - "type": "float", - "description": "Net debt-to-EBITDA ratio calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "current_ratio_ttm", - "type": "float", - "description": "Current ratio calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "interest_coverage_ttm", - "type": "float", - "description": "Interest coverage calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "income_quality_ttm", - "type": "float", - "description": "Income quality calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "dividend_yield_ttm", - "type": "float", - "description": "Dividend yield calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "dividend_yield_percentage_ttm", - "type": "float", - "description": "Dividend yield percentage calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "dividend_to_market_cap_ttm", - "type": "float", - "description": "Dividend to market capitalization ratio calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "dividend_per_share_ttm", - "type": "float", - "description": "Dividend per share calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "payout_ratio_ttm", - "type": "float", - "description": "Payout ratio calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "sales_general_and_administrative_to_revenue_ttm", - "type": "float", - "description": "Sales general and administrative expenses-to-revenue ratio calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "research_and_development_to_revenue_ttm", - "type": "float", - "description": "Research and development expenses-to-revenue ratio calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "intangibles_to_total_assets_ttm", - "type": "float", - "description": "Intangibles-to-total assets ratio calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "capex_to_operating_cash_flow_ttm", - "type": "float", - "description": "Capital expenditures-to-operating cash flow ratio calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "capex_to_revenue_ttm", - "type": "float", - "description": "Capital expenditures-to-revenue ratio calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "capex_to_depreciation_ttm", - "type": "float", - "description": "Capital expenditures-to-depreciation ratio calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "stock_based_compensation_to_revenue_ttm", - "type": "float", - "description": "Stock-based compensation-to-revenue ratio calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "graham_number_ttm", - "type": "float", - "description": "Graham number calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "roic_ttm", - "type": "float", - "description": "Return on invested capital calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "return_on_tangible_assets_ttm", - "type": "float", - "description": "Return on tangible assets calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "graham_net_net_ttm", - "type": "float", - "description": "Graham net-net working capital calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "working_capital_ttm", - "type": "float", - "description": "Working capital calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "tangible_asset_value_ttm", - "type": "float", - "description": "Tangible asset value calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "net_current_asset_value_ttm", - "type": "float", - "description": "Net current asset value calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "invested_capital_ttm", - "type": "float", - "description": "Invested capital calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "average_receivables_ttm", - "type": "float", - "description": "Average receivables calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "average_payables_ttm", - "type": "float", - "description": "Average payables calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "average_inventory_ttm", - "type": "float", - "description": "Average inventory calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "days_sales_outstanding_ttm", - "type": "float", - "description": "Days sales outstanding calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "days_payables_outstanding_ttm", - "type": "float", - "description": "Days payables outstanding calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "days_of_inventory_on_hand_ttm", - "type": "float", - "description": "Days of inventory on hand calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "receivables_turnover_ttm", - "type": "float", - "description": "Receivables turnover calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "payables_turnover_ttm", - "type": "float", - "description": "Payables turnover calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "inventory_turnover_ttm", - "type": "float", - "description": "Inventory turnover calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "roe_ttm", - "type": "float", - "description": "Return on equity calculated as trailing twelve months.", - "default": null, - "optional": true - }, - { - "name": "capex_per_share_ttm", - "type": "float", - "description": "Capital expenditures per share calculated as trailing twelve months.", - "default": null, - "optional": true - } - ], - "fmp": [] - }, - "model": "EquityValuationMultiples" - }, - "/equity/fundamental/balance": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get the balance sheet for a given company.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.balance(symbol='AAPL', provider='fmp')\nobb.equity.fundamental.balance(symbol='AAPL', period='annual', limit=5, provider='intrinio')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "period", - "type": "str", - "description": "Time period of the data to return.", - "default": "annual", - "optional": true - }, - { - "name": "limit", - "type": "Annotated[int, Ge(ge=0)]", - "description": "The number of data entries to return.", - "default": 5, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp', 'intrinio', 'polygon', 'yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [], - "intrinio": [ - { - "name": "fiscal_year", - "type": "int", - "description": "The specific fiscal year. Reports do not go beyond 2008.", - "default": null, - "optional": true - } - ], - "polygon": [ - { - "name": "filing_date", - "type": "date", - "description": "Filing date of the financial statement.", - "default": null, - "optional": true - }, - { - "name": "filing_date_lt", - "type": "date", - "description": "Filing date less than the given date.", - "default": null, - "optional": true - }, - { - "name": "filing_date_lte", - "type": "date", - "description": "Filing date less than or equal to the given date.", - "default": null, - "optional": true - }, - { - "name": "filing_date_gt", - "type": "date", - "description": "Filing date greater than the given date.", - "default": null, - "optional": true - }, - { - "name": "filing_date_gte", - "type": "date", - "description": "Filing date greater than or equal to the given date.", - "default": null, - "optional": true - }, - { - "name": "period_of_report_date", - "type": "date", - "description": "Period of report date of the financial statement.", - "default": null, - "optional": true - }, - { - "name": "period_of_report_date_lt", - "type": "date", - "description": "Period of report date less than the given date.", - "default": null, - "optional": true - }, - { - "name": "period_of_report_date_lte", - "type": "date", - "description": "Period of report date less than or equal to the given date.", - "default": null, - "optional": true - }, - { - "name": "period_of_report_date_gt", - "type": "date", - "description": "Period of report date greater than the given date.", - "default": null, - "optional": true - }, - { - "name": "period_of_report_date_gte", - "type": "date", - "description": "Period of report date greater than or equal to the given date.", - "default": null, - "optional": true - }, - { - "name": "include_sources", - "type": "bool", - "description": "Whether to include the sources of the financial statement.", - "default": true, - "optional": true - }, - { - "name": "order", - "type": "Literal['asc', 'desc']", - "description": "Order of the financial statement.", - "default": null, - "optional": true - }, - { - "name": "sort", - "type": "Literal['filing_date', 'period_of_report_date']", - "description": "Sort of the financial statement.", - "default": null, - "optional": true - } - ], - "yfinance": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[BalanceSheet]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'intrinio', 'polygon', 'yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "period_ending", - "type": "date", - "description": "The end date of the reporting period.", - "default": "", - "optional": false - }, - { - "name": "fiscal_period", - "type": "str", - "description": "The fiscal period of the report.", - "default": null, - "optional": true - }, - { - "name": "fiscal_year", - "type": "int", - "description": "The fiscal year of the fiscal period.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "filing_date", - "type": "date", - "description": "The date when the filing was made.", - "default": null, - "optional": true - }, - { - "name": "accepted_date", - "type": "datetime", - "description": "The date and time when the filing was accepted.", - "default": null, - "optional": true - }, - { - "name": "reported_currency", - "type": "str", - "description": "The currency in which the balance sheet was reported.", - "default": null, - "optional": true - }, - { - "name": "cash_and_cash_equivalents", - "type": "float", - "description": "Cash and cash equivalents.", - "default": null, - "optional": true - }, - { - "name": "short_term_investments", - "type": "float", - "description": "Short term investments.", - "default": null, - "optional": true - }, - { - "name": "cash_and_short_term_investments", - "type": "float", - "description": "Cash and short term investments.", - "default": null, - "optional": true - }, - { - "name": "net_receivables", - "type": "float", - "description": "Net receivables.", - "default": null, - "optional": true - }, - { - "name": "inventory", - "type": "float", - "description": "Inventory.", - "default": null, - "optional": true - }, - { - "name": "other_current_assets", - "type": "float", - "description": "Other current assets.", - "default": null, - "optional": true - }, - { - "name": "total_current_assets", - "type": "float", - "description": "Total current assets.", - "default": null, - "optional": true - }, - { - "name": "plant_property_equipment_net", - "type": "float", - "description": "Plant property equipment net.", - "default": null, - "optional": true - }, - { - "name": "goodwill", - "type": "float", - "description": "Goodwill.", - "default": null, - "optional": true - }, - { - "name": "intangible_assets", - "type": "float", - "description": "Intangible assets.", - "default": null, - "optional": true - }, - { - "name": "goodwill_and_intangible_assets", - "type": "float", - "description": "Goodwill and intangible assets.", - "default": null, - "optional": true - }, - { - "name": "long_term_investments", - "type": "float", - "description": "Long term investments.", - "default": null, - "optional": true - }, - { - "name": "tax_assets", - "type": "float", - "description": "Tax assets.", - "default": null, - "optional": true - }, - { - "name": "other_non_current_assets", - "type": "float", - "description": "Other non current assets.", - "default": null, - "optional": true - }, - { - "name": "non_current_assets", - "type": "float", - "description": "Total non current assets.", - "default": null, - "optional": true - }, - { - "name": "other_assets", - "type": "float", - "description": "Other assets.", - "default": null, - "optional": true - }, - { - "name": "total_assets", - "type": "float", - "description": "Total assets.", - "default": null, - "optional": true - }, - { - "name": "accounts_payable", - "type": "float", - "description": "Accounts payable.", - "default": null, - "optional": true - }, - { - "name": "short_term_debt", - "type": "float", - "description": "Short term debt.", - "default": null, - "optional": true - }, - { - "name": "tax_payables", - "type": "float", - "description": "Tax payables.", - "default": null, - "optional": true - }, - { - "name": "current_deferred_revenue", - "type": "float", - "description": "Current deferred revenue.", - "default": null, - "optional": true - }, - { - "name": "other_current_liabilities", - "type": "float", - "description": "Other current liabilities.", - "default": null, - "optional": true - }, - { - "name": "total_current_liabilities", - "type": "float", - "description": "Total current liabilities.", - "default": null, - "optional": true - }, - { - "name": "long_term_debt", - "type": "float", - "description": "Long term debt.", - "default": null, - "optional": true - }, - { - "name": "deferred_revenue_non_current", - "type": "float", - "description": "Non current deferred revenue.", - "default": null, - "optional": true - }, - { - "name": "deferred_tax_liabilities_non_current", - "type": "float", - "description": "Deferred tax liabilities non current.", - "default": null, - "optional": true - }, - { - "name": "other_non_current_liabilities", - "type": "float", - "description": "Other non current liabilities.", - "default": null, - "optional": true - }, - { - "name": "total_non_current_liabilities", - "type": "float", - "description": "Total non current liabilities.", - "default": null, - "optional": true - }, - { - "name": "other_liabilities", - "type": "float", - "description": "Other liabilities.", - "default": null, - "optional": true - }, - { - "name": "capital_lease_obligations", - "type": "float", - "description": "Capital lease obligations.", - "default": null, - "optional": true - }, - { - "name": "total_liabilities", - "type": "float", - "description": "Total liabilities.", - "default": null, - "optional": true - }, - { - "name": "preferred_stock", - "type": "float", - "description": "Preferred stock.", - "default": null, - "optional": true - }, - { - "name": "common_stock", - "type": "float", - "description": "Common stock.", - "default": null, - "optional": true - }, - { - "name": "retained_earnings", - "type": "float", - "description": "Retained earnings.", - "default": null, - "optional": true - }, - { - "name": "accumulated_other_comprehensive_income", - "type": "float", - "description": "Accumulated other comprehensive income (loss).", - "default": null, - "optional": true - }, - { - "name": "other_shareholders_equity", - "type": "float", - "description": "Other shareholders equity.", - "default": null, - "optional": true - }, - { - "name": "other_total_shareholders_equity", - "type": "float", - "description": "Other total shareholders equity.", - "default": null, - "optional": true - }, - { - "name": "total_common_equity", - "type": "float", - "description": "Total common equity.", - "default": null, - "optional": true - }, - { - "name": "total_equity_non_controlling_interests", - "type": "float", - "description": "Total equity non controlling interests.", - "default": null, - "optional": true - }, - { - "name": "total_liabilities_and_shareholders_equity", - "type": "float", - "description": "Total liabilities and shareholders equity.", - "default": null, - "optional": true - }, - { - "name": "minority_interest", - "type": "float", - "description": "Minority interest.", - "default": null, - "optional": true - }, - { - "name": "total_liabilities_and_total_equity", - "type": "float", - "description": "Total liabilities and total equity.", - "default": null, - "optional": true - }, - { - "name": "total_investments", - "type": "float", - "description": "Total investments.", - "default": null, - "optional": true - }, - { - "name": "total_debt", - "type": "float", - "description": "Total debt.", - "default": null, - "optional": true - }, - { - "name": "net_debt", - "type": "float", - "description": "Net debt.", - "default": null, - "optional": true - }, - { - "name": "link", - "type": "str", - "description": "Link to the filing.", - "default": null, - "optional": true - }, - { - "name": "final_link", - "type": "str", - "description": "Link to the filing document.", - "default": null, - "optional": true - } - ], - "intrinio": [ - { - "name": "reported_currency", - "type": "str", - "description": "The currency in which the balance sheet is reported.", - "default": null, - "optional": true - }, - { - "name": "cash_and_cash_equivalents", - "type": "float", - "description": "Cash and cash equivalents.", - "default": null, - "optional": true - }, - { - "name": "cash_and_due_from_banks", - "type": "float", - "description": "Cash and due from banks.", - "default": null, - "optional": true - }, - { - "name": "restricted_cash", - "type": "float", - "description": "Restricted cash.", - "default": null, - "optional": true - }, - { - "name": "short_term_investments", - "type": "float", - "description": "Short term investments.", - "default": null, - "optional": true - }, - { - "name": "federal_funds_sold", - "type": "float", - "description": "Federal funds sold.", - "default": null, - "optional": true - }, - { - "name": "accounts_receivable", - "type": "float", - "description": "Accounts receivable.", - "default": null, - "optional": true - }, - { - "name": "note_and_lease_receivable", - "type": "float", - "description": "Note and lease receivable. (Vendor non-trade receivables)", - "default": null, - "optional": true - }, - { - "name": "inventories", - "type": "float", - "description": "Net Inventories.", - "default": null, - "optional": true - }, - { - "name": "customer_and_other_receivables", - "type": "float", - "description": "Customer and other receivables.", - "default": null, - "optional": true - }, - { - "name": "interest_bearing_deposits_at_other_banks", - "type": "float", - "description": "Interest bearing deposits at other banks.", - "default": null, - "optional": true - }, - { - "name": "time_deposits_placed_and_other_short_term_investments", - "type": "float", - "description": "Time deposits placed and other short term investments.", - "default": null, - "optional": true - }, - { - "name": "trading_account_securities", - "type": "float", - "description": "Trading account securities.", - "default": null, - "optional": true - }, - { - "name": "loans_and_leases", - "type": "float", - "description": "Loans and leases.", - "default": null, - "optional": true - }, - { - "name": "allowance_for_loan_and_lease_losses", - "type": "float", - "description": "Allowance for loan and lease losses.", - "default": null, - "optional": true - }, - { - "name": "current_deferred_refundable_income_taxes", - "type": "float", - "description": "Current deferred refundable income taxes.", - "default": null, - "optional": true - }, - { - "name": "other_current_assets", - "type": "float", - "description": "Other current assets.", - "default": null, - "optional": true - }, - { - "name": "loans_and_leases_net_of_allowance", - "type": "float", - "description": "Loans and leases net of allowance.", - "default": null, - "optional": true - }, - { - "name": "accrued_investment_income", - "type": "float", - "description": "Accrued investment income.", - "default": null, - "optional": true - }, - { - "name": "other_current_non_operating_assets", - "type": "float", - "description": "Other current non-operating assets.", - "default": null, - "optional": true - }, - { - "name": "loans_held_for_sale", - "type": "float", - "description": "Loans held for sale.", - "default": null, - "optional": true - }, - { - "name": "prepaid_expenses", - "type": "float", - "description": "Prepaid expenses.", - "default": null, - "optional": true - }, - { - "name": "total_current_assets", - "type": "float", - "description": "Total current assets.", - "default": null, - "optional": true - }, - { - "name": "plant_property_equipment_gross", - "type": "float", - "description": "Plant property equipment gross.", - "default": null, - "optional": true - }, - { - "name": "accumulated_depreciation", - "type": "float", - "description": "Accumulated depreciation.", - "default": null, - "optional": true - }, - { - "name": "premises_and_equipment_net", - "type": "float", - "description": "Net premises and equipment.", - "default": null, - "optional": true - }, - { - "name": "plant_property_equipment_net", - "type": "float", - "description": "Net plant property equipment.", - "default": null, - "optional": true - }, - { - "name": "long_term_investments", - "type": "float", - "description": "Long term investments.", - "default": null, - "optional": true - }, - { - "name": "mortgage_servicing_rights", - "type": "float", - "description": "Mortgage servicing rights.", - "default": null, - "optional": true - }, - { - "name": "unearned_premiums_asset", - "type": "float", - "description": "Unearned premiums asset.", - "default": null, - "optional": true - }, - { - "name": "non_current_note_lease_receivables", - "type": "float", - "description": "Non-current note lease receivables.", - "default": null, - "optional": true - }, - { - "name": "deferred_acquisition_cost", - "type": "float", - "description": "Deferred acquisition cost.", - "default": null, - "optional": true - }, - { - "name": "goodwill", - "type": "float", - "description": "Goodwill.", - "default": null, - "optional": true - }, - { - "name": "separate_account_business_assets", - "type": "float", - "description": "Separate account business assets.", - "default": null, - "optional": true - }, - { - "name": "non_current_deferred_refundable_income_taxes", - "type": "float", - "description": "Noncurrent deferred refundable income taxes.", - "default": null, - "optional": true - }, - { - "name": "intangible_assets", - "type": "float", - "description": "Intangible assets.", - "default": null, - "optional": true - }, - { - "name": "employee_benefit_assets", - "type": "float", - "description": "Employee benefit assets.", - "default": null, - "optional": true - }, - { - "name": "other_assets", - "type": "float", - "description": "Other assets.", - "default": null, - "optional": true - }, - { - "name": "other_non_current_operating_assets", - "type": "float", - "description": "Other noncurrent operating assets.", - "default": null, - "optional": true - }, - { - "name": "other_non_current_non_operating_assets", - "type": "float", - "description": "Other noncurrent non-operating assets.", - "default": null, - "optional": true - }, - { - "name": "interest_bearing_deposits", - "type": "float", - "description": "Interest bearing deposits.", - "default": null, - "optional": true - }, - { - "name": "total_non_current_assets", - "type": "float", - "description": "Total noncurrent assets.", - "default": null, - "optional": true - }, - { - "name": "total_assets", - "type": "float", - "description": "Total assets.", - "default": null, - "optional": true - }, - { - "name": "non_interest_bearing_deposits", - "type": "float", - "description": "Non interest bearing deposits.", - "default": null, - "optional": true - }, - { - "name": "federal_funds_purchased_and_securities_sold", - "type": "float", - "description": "Federal funds purchased and securities sold.", - "default": null, - "optional": true - }, - { - "name": "bankers_acceptance_outstanding", - "type": "float", - "description": "Bankers acceptance outstanding.", - "default": null, - "optional": true - }, - { - "name": "short_term_debt", - "type": "float", - "description": "Short term debt.", - "default": null, - "optional": true - }, - { - "name": "accounts_payable", - "type": "float", - "description": "Accounts payable.", - "default": null, - "optional": true - }, - { - "name": "current_deferred_revenue", - "type": "float", - "description": "Current deferred revenue.", - "default": null, - "optional": true - }, - { - "name": "current_deferred_payable_income_tax_liabilities", - "type": "float", - "description": "Current deferred payable income tax liabilities.", - "default": null, - "optional": true - }, - { - "name": "accrued_interest_payable", - "type": "float", - "description": "Accrued interest payable.", - "default": null, - "optional": true - }, - { - "name": "accrued_expenses", - "type": "float", - "description": "Accrued expenses.", - "default": null, - "optional": true - }, - { - "name": "other_short_term_payables", - "type": "float", - "description": "Other short term payables.", - "default": null, - "optional": true - }, - { - "name": "customer_deposits", - "type": "float", - "description": "Customer deposits.", - "default": null, - "optional": true - }, - { - "name": "dividends_payable", - "type": "float", - "description": "Dividends payable.", - "default": null, - "optional": true - }, - { - "name": "claims_and_claim_expense", - "type": "float", - "description": "Claims and claim expense.", - "default": null, - "optional": true - }, - { - "name": "future_policy_benefits", - "type": "float", - "description": "Future policy benefits.", - "default": null, - "optional": true - }, - { - "name": "current_employee_benefit_liabilities", - "type": "float", - "description": "Current employee benefit liabilities.", - "default": null, - "optional": true - }, - { - "name": "unearned_premiums_liability", - "type": "float", - "description": "Unearned premiums liability.", - "default": null, - "optional": true - }, - { - "name": "other_taxes_payable", - "type": "float", - "description": "Other taxes payable.", - "default": null, - "optional": true - }, - { - "name": "policy_holder_funds", - "type": "float", - "description": "Policy holder funds.", - "default": null, - "optional": true - }, - { - "name": "other_current_liabilities", - "type": "float", - "description": "Other current liabilities.", - "default": null, - "optional": true - }, - { - "name": "other_current_non_operating_liabilities", - "type": "float", - "description": "Other current non-operating liabilities.", - "default": null, - "optional": true - }, - { - "name": "separate_account_business_liabilities", - "type": "float", - "description": "Separate account business liabilities.", - "default": null, - "optional": true - }, - { - "name": "total_current_liabilities", - "type": "float", - "description": "Total current liabilities.", - "default": null, - "optional": true - }, - { - "name": "long_term_debt", - "type": "float", - "description": "Long term debt.", - "default": null, - "optional": true - }, - { - "name": "other_long_term_liabilities", - "type": "float", - "description": "Other long term liabilities.", - "default": null, - "optional": true - }, - { - "name": "non_current_deferred_revenue", - "type": "float", - "description": "Non-current deferred revenue.", - "default": null, - "optional": true - }, - { - "name": "non_current_deferred_payable_income_tax_liabilities", - "type": "float", - "description": "Non-current deferred payable income tax liabilities.", - "default": null, - "optional": true - }, - { - "name": "non_current_employee_benefit_liabilities", - "type": "float", - "description": "Non-current employee benefit liabilities.", - "default": null, - "optional": true - }, - { - "name": "other_non_current_operating_liabilities", - "type": "float", - "description": "Other non-current operating liabilities.", - "default": null, - "optional": true - }, - { - "name": "other_non_current_non_operating_liabilities", - "type": "float", - "description": "Other non-current, non-operating liabilities.", - "default": null, - "optional": true - }, - { - "name": "total_non_current_liabilities", - "type": "float", - "description": "Total non-current liabilities.", - "default": null, - "optional": true - }, - { - "name": "capital_lease_obligations", - "type": "float", - "description": "Capital lease obligations.", - "default": null, - "optional": true - }, - { - "name": "asset_retirement_reserve_litigation_obligation", - "type": "float", - "description": "Asset retirement reserve litigation obligation.", - "default": null, - "optional": true - }, - { - "name": "total_liabilities", - "type": "float", - "description": "Total liabilities.", - "default": null, - "optional": true - }, - { - "name": "commitments_contingencies", - "type": "float", - "description": "Commitments contingencies.", - "default": null, - "optional": true - }, - { - "name": "redeemable_non_controlling_interest", - "type": "float", - "description": "Redeemable non-controlling interest.", - "default": null, - "optional": true - }, - { - "name": "preferred_stock", - "type": "float", - "description": "Preferred stock.", - "default": null, - "optional": true - }, - { - "name": "common_stock", - "type": "float", - "description": "Common stock.", - "default": null, - "optional": true - }, - { - "name": "retained_earnings", - "type": "float", - "description": "Retained earnings.", - "default": null, - "optional": true - }, - { - "name": "treasury_stock", - "type": "float", - "description": "Treasury stock.", - "default": null, - "optional": true - }, - { - "name": "accumulated_other_comprehensive_income", - "type": "float", - "description": "Accumulated other comprehensive income.", - "default": null, - "optional": true - }, - { - "name": "participating_policy_holder_equity", - "type": "float", - "description": "Participating policy holder equity.", - "default": null, - "optional": true - }, - { - "name": "other_equity_adjustments", - "type": "float", - "description": "Other equity adjustments.", - "default": null, - "optional": true - }, - { - "name": "total_common_equity", - "type": "float", - "description": "Total common equity.", - "default": null, - "optional": true - }, - { - "name": "total_preferred_common_equity", - "type": "float", - "description": "Total preferred common equity.", - "default": null, - "optional": true - }, - { - "name": "non_controlling_interest", - "type": "float", - "description": "Non-controlling interest.", - "default": null, - "optional": true - }, - { - "name": "total_equity_non_controlling_interests", - "type": "float", - "description": "Total equity non-controlling interests.", - "default": null, - "optional": true - }, - { - "name": "total_liabilities_shareholders_equity", - "type": "float", - "description": "Total liabilities and shareholders equity.", - "default": null, - "optional": true - } - ], - "polygon": [ - { - "name": "accounts_receivable", - "type": "int", - "description": "Accounts receivable", - "default": null, - "optional": true - }, - { - "name": "marketable_securities", - "type": "int", - "description": "Marketable securities", - "default": null, - "optional": true - }, - { - "name": "prepaid_expenses", - "type": "int", - "description": "Prepaid expenses", - "default": null, - "optional": true - }, - { - "name": "other_current_assets", - "type": "int", - "description": "Other current assets", - "default": null, - "optional": true - }, - { - "name": "total_current_assets", - "type": "int", - "description": "Total current assets", - "default": null, - "optional": true - }, - { - "name": "property_plant_equipment_net", - "type": "int", - "description": "Property plant and equipment net", - "default": null, - "optional": true - }, - { - "name": "inventory", - "type": "int", - "description": "Inventory", - "default": null, - "optional": true - }, - { - "name": "other_non_current_assets", - "type": "int", - "description": "Other non-current assets", - "default": null, - "optional": true - }, - { - "name": "total_non_current_assets", - "type": "int", - "description": "Total non-current assets", - "default": null, - "optional": true - }, - { - "name": "intangible_assets", - "type": "int", - "description": "Intangible assets", - "default": null, - "optional": true - }, - { - "name": "total_assets", - "type": "int", - "description": "Total assets", - "default": null, - "optional": true - }, - { - "name": "accounts_payable", - "type": "int", - "description": "Accounts payable", - "default": null, - "optional": true - }, - { - "name": "employee_wages", - "type": "int", - "description": "Employee wages", - "default": null, - "optional": true - }, - { - "name": "other_current_liabilities", - "type": "int", - "description": "Other current liabilities", - "default": null, - "optional": true - }, - { - "name": "total_current_liabilities", - "type": "int", - "description": "Total current liabilities", - "default": null, - "optional": true - }, - { - "name": "other_non_current_liabilities", - "type": "int", - "description": "Other non-current liabilities", - "default": null, - "optional": true - }, - { - "name": "total_non_current_liabilities", - "type": "int", - "description": "Total non-current liabilities", - "default": null, - "optional": true - }, - { - "name": "long_term_debt", - "type": "int", - "description": "Long term debt", - "default": null, - "optional": true - }, - { - "name": "total_liabilities", - "type": "int", - "description": "Total liabilities", - "default": null, - "optional": true - }, - { - "name": "minority_interest", - "type": "int", - "description": "Minority interest", - "default": null, - "optional": true - }, - { - "name": "temporary_equity_attributable_to_parent", - "type": "int", - "description": "Temporary equity attributable to parent", - "default": null, - "optional": true - }, - { - "name": "equity_attributable_to_parent", - "type": "int", - "description": "Equity attributable to parent", - "default": null, - "optional": true - }, - { - "name": "temporary_equity", - "type": "int", - "description": "Temporary equity", - "default": null, - "optional": true - }, - { - "name": "preferred_stock", - "type": "int", - "description": "Preferred stock", - "default": null, - "optional": true - }, - { - "name": "redeemable_non_controlling_interest", - "type": "int", - "description": "Redeemable non-controlling interest", - "default": null, - "optional": true - }, - { - "name": "redeemable_non_controlling_interest_other", - "type": "int", - "description": "Redeemable non-controlling interest other", - "default": null, - "optional": true - }, - { - "name": "total_stock_holders_equity", - "type": "int", - "description": "Total stock holders equity", - "default": null, - "optional": true - }, - { - "name": "total_liabilities_and_stock_holders_equity", - "type": "int", - "description": "Total liabilities and stockholders equity", - "default": null, - "optional": true - }, - { - "name": "total_equity", - "type": "int", - "description": "Total equity", - "default": null, - "optional": true - } - ], - "yfinance": [] - }, - "model": "BalanceSheet" - }, - "/equity/fundamental/balance_growth": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get the growth of a company's balance sheet items over time.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.balance_growth(symbol='AAPL', provider='fmp')\nobb.equity.fundamental.balance_growth(symbol='AAPL', limit=10, provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": 10, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[BalanceSheetGrowth]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": null, - "optional": true - }, - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "period", - "type": "str", - "description": "Reporting period.", - "default": "", - "optional": false - }, - { - "name": "growth_cash_and_cash_equivalents", - "type": "float", - "description": "Growth rate of cash and cash equivalents.", - "default": "", - "optional": false - }, - { - "name": "growth_short_term_investments", - "type": "float", - "description": "Growth rate of short-term investments.", - "default": "", - "optional": false - }, - { - "name": "growth_cash_and_short_term_investments", - "type": "float", - "description": "Growth rate of cash and short-term investments.", - "default": "", - "optional": false - }, - { - "name": "growth_net_receivables", - "type": "float", - "description": "Growth rate of net receivables.", - "default": "", - "optional": false - }, - { - "name": "growth_inventory", - "type": "float", - "description": "Growth rate of inventory.", - "default": "", - "optional": false - }, - { - "name": "growth_other_current_assets", - "type": "float", - "description": "Growth rate of other current assets.", - "default": "", - "optional": false - }, - { - "name": "growth_total_current_assets", - "type": "float", - "description": "Growth rate of total current assets.", - "default": "", - "optional": false - }, - { - "name": "growth_property_plant_equipment_net", - "type": "float", - "description": "Growth rate of net property, plant, and equipment.", - "default": "", - "optional": false - }, - { - "name": "growth_goodwill", - "type": "float", - "description": "Growth rate of goodwill.", - "default": "", - "optional": false - }, - { - "name": "growth_intangible_assets", - "type": "float", - "description": "Growth rate of intangible assets.", - "default": "", - "optional": false - }, - { - "name": "growth_goodwill_and_intangible_assets", - "type": "float", - "description": "Growth rate of goodwill and intangible assets.", - "default": "", - "optional": false - }, - { - "name": "growth_long_term_investments", - "type": "float", - "description": "Growth rate of long-term investments.", - "default": "", - "optional": false - }, - { - "name": "growth_tax_assets", - "type": "float", - "description": "Growth rate of tax assets.", - "default": "", - "optional": false - }, - { - "name": "growth_other_non_current_assets", - "type": "float", - "description": "Growth rate of other non-current assets.", - "default": "", - "optional": false - }, - { - "name": "growth_total_non_current_assets", - "type": "float", - "description": "Growth rate of total non-current assets.", - "default": "", - "optional": false - }, - { - "name": "growth_other_assets", - "type": "float", - "description": "Growth rate of other assets.", - "default": "", - "optional": false - }, - { - "name": "growth_total_assets", - "type": "float", - "description": "Growth rate of total assets.", - "default": "", - "optional": false - }, - { - "name": "growth_account_payables", - "type": "float", - "description": "Growth rate of accounts payable.", - "default": "", - "optional": false - }, - { - "name": "growth_short_term_debt", - "type": "float", - "description": "Growth rate of short-term debt.", - "default": "", - "optional": false - }, - { - "name": "growth_tax_payables", - "type": "float", - "description": "Growth rate of tax payables.", - "default": "", - "optional": false - }, - { - "name": "growth_deferred_revenue", - "type": "float", - "description": "Growth rate of deferred revenue.", - "default": "", - "optional": false - }, - { - "name": "growth_other_current_liabilities", - "type": "float", - "description": "Growth rate of other current liabilities.", - "default": "", - "optional": false - }, - { - "name": "growth_total_current_liabilities", - "type": "float", - "description": "Growth rate of total current liabilities.", - "default": "", - "optional": false - }, - { - "name": "growth_long_term_debt", - "type": "float", - "description": "Growth rate of long-term debt.", - "default": "", - "optional": false - }, - { - "name": "growth_deferred_revenue_non_current", - "type": "float", - "description": "Growth rate of non-current deferred revenue.", - "default": "", - "optional": false - }, - { - "name": "growth_deferrred_tax_liabilities_non_current", - "type": "float", - "description": "Growth rate of non-current deferred tax liabilities.", - "default": "", - "optional": false - }, - { - "name": "growth_other_non_current_liabilities", - "type": "float", - "description": "Growth rate of other non-current liabilities.", - "default": "", - "optional": false - }, - { - "name": "growth_total_non_current_liabilities", - "type": "float", - "description": "Growth rate of total non-current liabilities.", - "default": "", - "optional": false - }, - { - "name": "growth_other_liabilities", - "type": "float", - "description": "Growth rate of other liabilities.", - "default": "", - "optional": false - }, - { - "name": "growth_total_liabilities", - "type": "float", - "description": "Growth rate of total liabilities.", - "default": "", - "optional": false - }, - { - "name": "growth_common_stock", - "type": "float", - "description": "Growth rate of common stock.", - "default": "", - "optional": false - }, - { - "name": "growth_retained_earnings", - "type": "float", - "description": "Growth rate of retained earnings.", - "default": "", - "optional": false - }, - { - "name": "growth_accumulated_other_comprehensive_income_loss", - "type": "float", - "description": "Growth rate of accumulated other comprehensive income/loss.", - "default": "", - "optional": false - }, - { - "name": "growth_othertotal_stockholders_equity", - "type": "float", - "description": "Growth rate of other total stockholders' equity.", - "default": "", - "optional": false - }, - { - "name": "growth_total_stockholders_equity", - "type": "float", - "description": "Growth rate of total stockholders' equity.", - "default": "", - "optional": false - }, - { - "name": "growth_total_liabilities_and_stockholders_equity", - "type": "float", - "description": "Growth rate of total liabilities and stockholders' equity.", - "default": "", - "optional": false - }, - { - "name": "growth_total_investments", - "type": "float", - "description": "Growth rate of total investments.", - "default": "", - "optional": false - }, - { - "name": "growth_total_debt", - "type": "float", - "description": "Growth rate of total debt.", - "default": "", - "optional": false - }, - { - "name": "growth_net_debt", - "type": "float", - "description": "Growth rate of net debt.", - "default": "", - "optional": false - } - ], - "fmp": [] - }, - "model": "BalanceSheetGrowth" - }, - "/equity/fundamental/cash": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get the cash flow statement for a given company.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.cash(symbol='AAPL', provider='fmp')\nobb.equity.fundamental.cash(symbol='AAPL', period='annual', limit=5, provider='intrinio')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "period", - "type": "str", - "description": "Time period of the data to return.", - "default": "annual", - "optional": true - }, - { - "name": "limit", - "type": "Annotated[int, Ge(ge=0)]", - "description": "The number of data entries to return.", - "default": 5, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp', 'intrinio', 'polygon', 'yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [], - "intrinio": [ - { - "name": "fiscal_year", - "type": "int", - "description": "The specific fiscal year. Reports do not go beyond 2008.", - "default": null, - "optional": true - } - ], - "polygon": [ - { - "name": "filing_date", - "type": "date", - "description": "Filing date of the financial statement.", - "default": null, - "optional": true - }, - { - "name": "filing_date_lt", - "type": "date", - "description": "Filing date less than the given date.", - "default": null, - "optional": true - }, - { - "name": "filing_date_lte", - "type": "date", - "description": "Filing date less than or equal to the given date.", - "default": null, - "optional": true - }, - { - "name": "filing_date_gt", - "type": "date", - "description": "Filing date greater than the given date.", - "default": null, - "optional": true - }, - { - "name": "filing_date_gte", - "type": "date", - "description": "Filing date greater than or equal to the given date.", - "default": null, - "optional": true - }, - { - "name": "period_of_report_date", - "type": "date", - "description": "Period of report date of the financial statement.", - "default": null, - "optional": true - }, - { - "name": "period_of_report_date_lt", - "type": "date", - "description": "Period of report date less than the given date.", - "default": null, - "optional": true - }, - { - "name": "period_of_report_date_lte", - "type": "date", - "description": "Period of report date less than or equal to the given date.", - "default": null, - "optional": true - }, - { - "name": "period_of_report_date_gt", - "type": "date", - "description": "Period of report date greater than the given date.", - "default": null, - "optional": true - }, - { - "name": "period_of_report_date_gte", - "type": "date", - "description": "Period of report date greater than or equal to the given date.", - "default": null, - "optional": true - }, - { - "name": "include_sources", - "type": "bool", - "description": "Whether to include the sources of the financial statement.", - "default": false, - "optional": true - }, - { - "name": "order", - "type": "Literal[None, 'asc', 'desc']", - "description": "Order of the financial statement.", - "default": null, - "optional": true - }, - { - "name": "sort", - "type": "Literal[None, 'filing_date', 'period_of_report_date']", - "description": "Sort of the financial statement.", - "default": null, - "optional": true - } - ], - "yfinance": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[CashFlowStatement]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'intrinio', 'polygon', 'yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "period_ending", - "type": "date", - "description": "The end date of the reporting period.", - "default": "", - "optional": false - }, - { - "name": "fiscal_period", - "type": "str", - "description": "The fiscal period of the report.", - "default": null, - "optional": true - }, - { - "name": "fiscal_year", - "type": "int", - "description": "The fiscal year of the fiscal period.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "filing_date", - "type": "date", - "description": "The date of the filing.", - "default": null, - "optional": true - }, - { - "name": "accepted_date", - "type": "datetime", - "description": "The date the filing was accepted.", - "default": null, - "optional": true - }, - { - "name": "reported_currency", - "type": "str", - "description": "The currency in which the cash flow statement was reported.", - "default": null, - "optional": true - }, - { - "name": "net_income", - "type": "float", - "description": "Net income.", - "default": null, - "optional": true - }, - { - "name": "depreciation_and_amortization", - "type": "float", - "description": "Depreciation and amortization.", - "default": null, - "optional": true - }, - { - "name": "deferred_income_tax", - "type": "float", - "description": "Deferred income tax.", - "default": null, - "optional": true - }, - { - "name": "stock_based_compensation", - "type": "float", - "description": "Stock-based compensation.", - "default": null, - "optional": true - }, - { - "name": "change_in_working_capital", - "type": "float", - "description": "Change in working capital.", - "default": null, - "optional": true - }, - { - "name": "change_in_account_receivables", - "type": "float", - "description": "Change in account receivables.", - "default": null, - "optional": true - }, - { - "name": "change_in_inventory", - "type": "float", - "description": "Change in inventory.", - "default": null, - "optional": true - }, - { - "name": "change_in_account_payable", - "type": "float", - "description": "Change in account payable.", - "default": null, - "optional": true - }, - { - "name": "change_in_other_working_capital", - "type": "float", - "description": "Change in other working capital.", - "default": null, - "optional": true - }, - { - "name": "change_in_other_non_cash_items", - "type": "float", - "description": "Change in other non-cash items.", - "default": null, - "optional": true - }, - { - "name": "net_cash_from_operating_activities", - "type": "float", - "description": "Net cash from operating activities.", - "default": null, - "optional": true - }, - { - "name": "purchase_of_property_plant_and_equipment", - "type": "float", - "description": "Purchase of property, plant and equipment.", - "default": null, - "optional": true - }, - { - "name": "acquisitions", - "type": "float", - "description": "Acquisitions.", - "default": null, - "optional": true - }, - { - "name": "purchase_of_investment_securities", - "type": "float", - "description": "Purchase of investment securities.", - "default": null, - "optional": true - }, - { - "name": "sale_and_maturity_of_investments", - "type": "float", - "description": "Sale and maturity of investments.", - "default": null, - "optional": true - }, - { - "name": "other_investing_activities", - "type": "float", - "description": "Other investing activities.", - "default": null, - "optional": true - }, - { - "name": "net_cash_from_investing_activities", - "type": "float", - "description": "Net cash from investing activities.", - "default": null, - "optional": true - }, - { - "name": "repayment_of_debt", - "type": "float", - "description": "Repayment of debt.", - "default": null, - "optional": true - }, - { - "name": "issuance_of_common_equity", - "type": "float", - "description": "Issuance of common equity.", - "default": null, - "optional": true - }, - { - "name": "repurchase_of_common_equity", - "type": "float", - "description": "Repurchase of common equity.", - "default": null, - "optional": true - }, - { - "name": "payment_of_dividends", - "type": "float", - "description": "Payment of dividends.", - "default": null, - "optional": true - }, - { - "name": "other_financing_activities", - "type": "float", - "description": "Other financing activities.", - "default": null, - "optional": true - }, - { - "name": "net_cash_from_financing_activities", - "type": "float", - "description": "Net cash from financing activities.", - "default": null, - "optional": true - }, - { - "name": "effect_of_exchange_rate_changes_on_cash", - "type": "float", - "description": "Effect of exchange rate changes on cash.", - "default": null, - "optional": true - }, - { - "name": "net_change_in_cash_and_equivalents", - "type": "float", - "description": "Net change in cash and equivalents.", - "default": null, - "optional": true - }, - { - "name": "cash_at_beginning_of_period", - "type": "float", - "description": "Cash at beginning of period.", - "default": null, - "optional": true - }, - { - "name": "cash_at_end_of_period", - "type": "float", - "description": "Cash at end of period.", - "default": null, - "optional": true - }, - { - "name": "operating_cash_flow", - "type": "float", - "description": "Operating cash flow.", - "default": null, - "optional": true - }, - { - "name": "capital_expenditure", - "type": "float", - "description": "Capital expenditure.", - "default": null, - "optional": true - }, - { - "name": "free_cash_flow", - "type": "float", - "description": "None", - "default": null, - "optional": true - }, - { - "name": "link", - "type": "str", - "description": "Link to the filing.", - "default": null, - "optional": true - }, - { - "name": "final_link", - "type": "str", - "description": "Link to the filing document.", - "default": null, - "optional": true - } - ], - "intrinio": [ - { - "name": "reported_currency", - "type": "str", - "description": "The currency in which the balance sheet is reported.", - "default": null, - "optional": true - }, - { - "name": "net_income_continuing_operations", - "type": "float", - "description": "Net Income (Continuing Operations)", - "default": null, - "optional": true - }, - { - "name": "net_income_discontinued_operations", - "type": "float", - "description": "Net Income (Discontinued Operations)", - "default": null, - "optional": true - }, - { - "name": "net_income", - "type": "float", - "description": "Consolidated Net Income.", - "default": null, - "optional": true - }, - { - "name": "provision_for_loan_losses", - "type": "float", - "description": "Provision for Loan Losses", - "default": null, - "optional": true - }, - { - "name": "provision_for_credit_losses", - "type": "float", - "description": "Provision for credit losses", - "default": null, - "optional": true - }, - { - "name": "depreciation_expense", - "type": "float", - "description": "Depreciation Expense.", - "default": null, - "optional": true - }, - { - "name": "amortization_expense", - "type": "float", - "description": "Amortization Expense.", - "default": null, - "optional": true - }, - { - "name": "share_based_compensation", - "type": "float", - "description": "Share-based compensation.", - "default": null, - "optional": true - }, - { - "name": "non_cash_adjustments_to_reconcile_net_income", - "type": "float", - "description": "Non-Cash Adjustments to Reconcile Net Income.", - "default": null, - "optional": true - }, - { - "name": "changes_in_operating_assets_and_liabilities", - "type": "float", - "description": "Changes in Operating Assets and Liabilities (Net)", - "default": null, - "optional": true - }, - { - "name": "net_cash_from_continuing_operating_activities", - "type": "float", - "description": "Net Cash from Continuing Operating Activities", - "default": null, - "optional": true - }, - { - "name": "net_cash_from_discontinued_operating_activities", - "type": "float", - "description": "Net Cash from Discontinued Operating Activities", - "default": null, - "optional": true - }, - { - "name": "net_cash_from_operating_activities", - "type": "float", - "description": "Net Cash from Operating Activities", - "default": null, - "optional": true - }, - { - "name": "divestitures", - "type": "float", - "description": "Divestitures", - "default": null, - "optional": true - }, - { - "name": "sale_of_property_plant_and_equipment", - "type": "float", - "description": "Sale of Property, Plant, and Equipment", - "default": null, - "optional": true - }, - { - "name": "acquisitions", - "type": "float", - "description": "Acquisitions", - "default": null, - "optional": true - }, - { - "name": "purchase_of_investments", - "type": "float", - "description": "Purchase of Investments", - "default": null, - "optional": true - }, - { - "name": "purchase_of_investment_securities", - "type": "float", - "description": "Purchase of Investment Securities", - "default": null, - "optional": true - }, - { - "name": "sale_and_maturity_of_investments", - "type": "float", - "description": "Sale and Maturity of Investments", - "default": null, - "optional": true - }, - { - "name": "loans_held_for_sale", - "type": "float", - "description": "Loans Held for Sale (Net)", - "default": null, - "optional": true - }, - { - "name": "purchase_of_property_plant_and_equipment", - "type": "float", - "description": "Purchase of Property, Plant, and Equipment", - "default": null, - "optional": true - }, - { - "name": "other_investing_activities", - "type": "float", - "description": "Other Investing Activities (Net)", - "default": null, - "optional": true - }, - { - "name": "net_cash_from_continuing_investing_activities", - "type": "float", - "description": "Net Cash from Continuing Investing Activities", - "default": null, - "optional": true - }, - { - "name": "net_cash_from_discontinued_investing_activities", - "type": "float", - "description": "Net Cash from Discontinued Investing Activities", - "default": null, - "optional": true - }, - { - "name": "net_cash_from_investing_activities", - "type": "float", - "description": "Net Cash from Investing Activities", - "default": null, - "optional": true - }, - { - "name": "payment_of_dividends", - "type": "float", - "description": "Payment of Dividends", - "default": null, - "optional": true - }, - { - "name": "repurchase_of_common_equity", - "type": "float", - "description": "Repurchase of Common Equity", - "default": null, - "optional": true - }, - { - "name": "repurchase_of_preferred_equity", - "type": "float", - "description": "Repurchase of Preferred Equity", - "default": null, - "optional": true - }, - { - "name": "issuance_of_common_equity", - "type": "float", - "description": "Issuance of Common Equity", - "default": null, - "optional": true - }, - { - "name": "issuance_of_preferred_equity", - "type": "float", - "description": "Issuance of Preferred Equity", - "default": null, - "optional": true - }, - { - "name": "issuance_of_debt", - "type": "float", - "description": "Issuance of Debt", - "default": null, - "optional": true - }, - { - "name": "repayment_of_debt", - "type": "float", - "description": "Repayment of Debt", - "default": null, - "optional": true - }, - { - "name": "other_financing_activities", - "type": "float", - "description": "Other Financing Activities (Net)", - "default": null, - "optional": true - }, - { - "name": "cash_interest_received", - "type": "float", - "description": "Cash Interest Received", - "default": null, - "optional": true - }, - { - "name": "net_change_in_deposits", - "type": "float", - "description": "Net Change in Deposits", - "default": null, - "optional": true - }, - { - "name": "net_increase_in_fed_funds_sold", - "type": "float", - "description": "Net Increase in Fed Funds Sold", - "default": null, - "optional": true - }, - { - "name": "net_cash_from_continuing_financing_activities", - "type": "float", - "description": "Net Cash from Continuing Financing Activities", - "default": null, - "optional": true - }, - { - "name": "net_cash_from_discontinued_financing_activities", - "type": "float", - "description": "Net Cash from Discontinued Financing Activities", - "default": null, - "optional": true - }, - { - "name": "net_cash_from_financing_activities", - "type": "float", - "description": "Net Cash from Financing Activities", - "default": null, - "optional": true - }, - { - "name": "effect_of_exchange_rate_changes", - "type": "float", - "description": "Effect of Exchange Rate Changes", - "default": null, - "optional": true - }, - { - "name": "other_net_changes_in_cash", - "type": "float", - "description": "Other Net Changes in Cash", - "default": null, - "optional": true - }, - { - "name": "net_change_in_cash_and_equivalents", - "type": "float", - "description": "Net Change in Cash and Equivalents", - "default": null, - "optional": true - }, - { - "name": "cash_income_taxes_paid", - "type": "float", - "description": "Cash Income Taxes Paid", - "default": null, - "optional": true - }, - { - "name": "cash_interest_paid", - "type": "float", - "description": "Cash Interest Paid", - "default": null, - "optional": true - } - ], - "polygon": [ - { - "name": "net_cash_flow_from_operating_activities_continuing", - "type": "int", - "description": "Net cash flow from operating activities continuing.", - "default": null, - "optional": true - }, - { - "name": "net_cash_flow_from_operating_activities_discontinued", - "type": "int", - "description": "Net cash flow from operating activities discontinued.", - "default": null, - "optional": true - }, - { - "name": "net_cash_flow_from_operating_activities", - "type": "int", - "description": "Net cash flow from operating activities.", - "default": null, - "optional": true - }, - { - "name": "net_cash_flow_from_investing_activities_continuing", - "type": "int", - "description": "Net cash flow from investing activities continuing.", - "default": null, - "optional": true - }, - { - "name": "net_cash_flow_from_investing_activities_discontinued", - "type": "int", - "description": "Net cash flow from investing activities discontinued.", - "default": null, - "optional": true - }, - { - "name": "net_cash_flow_from_investing_activities", - "type": "int", - "description": "Net cash flow from investing activities.", - "default": null, - "optional": true - }, - { - "name": "net_cash_flow_from_financing_activities_continuing", - "type": "int", - "description": "Net cash flow from financing activities continuing.", - "default": null, - "optional": true - }, - { - "name": "net_cash_flow_from_financing_activities_discontinued", - "type": "int", - "description": "Net cash flow from financing activities discontinued.", - "default": null, - "optional": true - }, - { - "name": "net_cash_flow_from_financing_activities", - "type": "int", - "description": "Net cash flow from financing activities.", - "default": null, - "optional": true - }, - { - "name": "net_cash_flow_continuing", - "type": "int", - "description": "Net cash flow continuing.", - "default": null, - "optional": true - }, - { - "name": "net_cash_flow_discontinued", - "type": "int", - "description": "Net cash flow discontinued.", - "default": null, - "optional": true - }, - { - "name": "exchange_gains_losses", - "type": "int", - "description": "Exchange gains losses.", - "default": null, - "optional": true - }, - { - "name": "net_cash_flow", - "type": "int", - "description": "Net cash flow.", - "default": null, - "optional": true - } - ], - "yfinance": [] - }, - "model": "CashFlowStatement" - }, - "/equity/fundamental/reported_financials": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get financial statements as reported by the company.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.reported_financials(symbol='AAPL', provider='intrinio')\n# Get AAPL balance sheet with a limit of 10 items.\nobb.equity.fundamental.reported_financials(symbol='AAPL', period='annual', statement_type='balance', limit=10, provider='intrinio')\n# Get reported income statement\nobb.equity.fundamental.reported_financials(symbol='AAPL', statement_type='income', provider='intrinio')\n# Get reported cash flow statement\nobb.equity.fundamental.reported_financials(symbol='AAPL', statement_type='cash', provider='intrinio')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "period", - "type": "str", - "description": "Time period of the data to return.", - "default": "annual", - "optional": true - }, - { - "name": "statement_type", - "type": "str", - "description": "The type of financial statement - i.e, balance, income, cash.", - "default": "balance", - "optional": true - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return. Although the response object contains multiple results, because of the variance in the fields, year-to-year and quarter-to-quarter, it is recommended to view results in small chunks.", - "default": 100, - "optional": true - }, - { - "name": "provider", - "type": "Literal['intrinio']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'intrinio' if there is no default.", - "default": "intrinio", - "optional": true - } - ], - "intrinio": [ - { - "name": "fiscal_year", - "type": "int", - "description": "The specific fiscal year. Reports do not go beyond 2008.", - "default": null, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[ReportedFinancials]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['intrinio']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "period_ending", - "type": "date", - "description": "The ending date of the reporting period.", - "default": "", - "optional": false - }, - { - "name": "fiscal_period", - "type": "str", - "description": "The fiscal period of the report (e.g. FY, Q1, etc.).", - "default": "", - "optional": false - }, - { - "name": "fiscal_year", - "type": "int", - "description": "The fiscal year of the fiscal period.", - "default": null, - "optional": true - } - ], - "intrinio": [] - }, - "model": "ReportedFinancials" - }, - "/equity/fundamental/cash_growth": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get the growth of a company's cash flow statement items over time.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.cash_growth(symbol='AAPL', provider='fmp')\nobb.equity.fundamental.cash_growth(symbol='AAPL', limit=10, provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": 10, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[CashFlowStatementGrowth]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": null, - "optional": true - }, - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "period", - "type": "str", - "description": "Period the statement is returned for.", - "default": "", - "optional": false - }, - { - "name": "growth_net_income", - "type": "float", - "description": "Growth rate of net income.", - "default": "", - "optional": false - }, - { - "name": "growth_depreciation_and_amortization", - "type": "float", - "description": "Growth rate of depreciation and amortization.", - "default": "", - "optional": false - }, - { - "name": "growth_deferred_income_tax", - "type": "float", - "description": "Growth rate of deferred income tax.", - "default": "", - "optional": false - }, - { - "name": "growth_stock_based_compensation", - "type": "float", - "description": "Growth rate of stock-based compensation.", - "default": "", - "optional": false - }, - { - "name": "growth_change_in_working_capital", - "type": "float", - "description": "Growth rate of change in working capital.", - "default": "", - "optional": false - }, - { - "name": "growth_accounts_receivables", - "type": "float", - "description": "Growth rate of accounts receivables.", - "default": "", - "optional": false - }, - { - "name": "growth_inventory", - "type": "float", - "description": "Growth rate of inventory.", - "default": "", - "optional": false - }, - { - "name": "growth_accounts_payables", - "type": "float", - "description": "Growth rate of accounts payables.", - "default": "", - "optional": false - }, - { - "name": "growth_other_working_capital", - "type": "float", - "description": "Growth rate of other working capital.", - "default": "", - "optional": false - }, - { - "name": "growth_other_non_cash_items", - "type": "float", - "description": "Growth rate of other non-cash items.", - "default": "", - "optional": false - }, - { - "name": "growth_net_cash_provided_by_operating_activities", - "type": "float", - "description": "Growth rate of net cash provided by operating activities.", - "default": "", - "optional": false - }, - { - "name": "growth_investments_in_property_plant_and_equipment", - "type": "float", - "description": "Growth rate of investments in property, plant, and equipment.", - "default": "", - "optional": false - }, - { - "name": "growth_acquisitions_net", - "type": "float", - "description": "Growth rate of net acquisitions.", - "default": "", - "optional": false - }, - { - "name": "growth_purchases_of_investments", - "type": "float", - "description": "Growth rate of purchases of investments.", - "default": "", - "optional": false - }, - { - "name": "growth_sales_maturities_of_investments", - "type": "float", - "description": "Growth rate of sales maturities of investments.", - "default": "", - "optional": false - }, - { - "name": "growth_other_investing_activities", - "type": "float", - "description": "Growth rate of other investing activities.", - "default": "", - "optional": false - }, - { - "name": "growth_net_cash_used_for_investing_activities", - "type": "float", - "description": "Growth rate of net cash used for investing activities.", - "default": "", - "optional": false - }, - { - "name": "growth_debt_repayment", - "type": "float", - "description": "Growth rate of debt repayment.", - "default": "", - "optional": false - }, - { - "name": "growth_common_stock_issued", - "type": "float", - "description": "Growth rate of common stock issued.", - "default": "", - "optional": false - }, - { - "name": "growth_common_stock_repurchased", - "type": "float", - "description": "Growth rate of common stock repurchased.", - "default": "", - "optional": false - }, - { - "name": "growth_dividends_paid", - "type": "float", - "description": "Growth rate of dividends paid.", - "default": "", - "optional": false - }, - { - "name": "growth_other_financing_activities", - "type": "float", - "description": "Growth rate of other financing activities.", - "default": "", - "optional": false - }, - { - "name": "growth_net_cash_used_provided_by_financing_activities", - "type": "float", - "description": "Growth rate of net cash used/provided by financing activities.", - "default": "", - "optional": false - }, - { - "name": "growth_effect_of_forex_changes_on_cash", - "type": "float", - "description": "Growth rate of the effect of foreign exchange changes on cash.", - "default": "", - "optional": false - }, - { - "name": "growth_net_change_in_cash", - "type": "float", - "description": "Growth rate of net change in cash.", - "default": "", - "optional": false - }, - { - "name": "growth_cash_at_end_of_period", - "type": "float", - "description": "Growth rate of cash at the end of the period.", - "default": "", - "optional": false - }, - { - "name": "growth_cash_at_beginning_of_period", - "type": "float", - "description": "Growth rate of cash at the beginning of the period.", - "default": "", - "optional": false - }, - { - "name": "growth_operating_cash_flow", - "type": "float", - "description": "Growth rate of operating cash flow.", - "default": "", - "optional": false - }, - { - "name": "growth_capital_expenditure", - "type": "float", - "description": "Growth rate of capital expenditure.", - "default": "", - "optional": false - }, - { - "name": "growth_free_cash_flow", - "type": "float", - "description": "Growth rate of free cash flow.", - "default": "", - "optional": false - } - ], - "fmp": [] - }, - "model": "CashFlowStatementGrowth" - }, - "/equity/fundamental/dividends": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get historical dividend data for a given company.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.dividends(symbol='AAPL', provider='intrinio')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp', 'intrinio', 'yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [], - "intrinio": [ - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": 100, - "optional": true - } - ], - "yfinance": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[HistoricalDividends]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'intrinio', 'yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "ex_dividend_date", - "type": "date", - "description": "The ex-dividend date - the date on which the stock begins trading without rights to the dividend.", - "default": "", - "optional": false - }, - { - "name": "amount", - "type": "float", - "description": "The dividend amount per share.", - "default": "", - "optional": false - } - ], - "fmp": [ - { - "name": "label", - "type": "str", - "description": "Label of the historical dividends.", - "default": "", - "optional": false - }, - { - "name": "adj_dividend", - "type": "float", - "description": "Adjusted dividend of the historical dividends.", - "default": "", - "optional": false - }, - { - "name": "record_date", - "type": "date", - "description": "Record date of the historical dividends.", - "default": null, - "optional": true - }, - { - "name": "payment_date", - "type": "date", - "description": "Payment date of the historical dividends.", - "default": null, - "optional": true - }, - { - "name": "declaration_date", - "type": "date", - "description": "Declaration date of the historical dividends.", - "default": null, - "optional": true - } - ], - "intrinio": [ - { - "name": "factor", - "type": "float", - "description": "factor by which to multiply stock prices before this date, in order to calculate historically-adjusted stock prices.", - "default": null, - "optional": true - }, - { - "name": "currency", - "type": "str", - "description": "The currency in which the dividend is paid.", - "default": null, - "optional": true - }, - { - "name": "split_ratio", - "type": "float", - "description": "The ratio of the stock split, if a stock split occurred.", - "default": null, - "optional": true - } - ], - "yfinance": [] - }, - "model": "HistoricalDividends" - }, - "/equity/fundamental/historical_eps": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get historical earnings per share data for a given company.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.historical_eps(symbol='AAPL', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [ - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": null, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[HistoricalEps]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": null, - "optional": true - }, - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "announce_time", - "type": "str", - "description": "Timing of the earnings announcement.", - "default": null, - "optional": true - }, - { - "name": "eps_actual", - "type": "float", - "description": "Actual EPS from the earnings date.", - "default": null, - "optional": true - }, - { - "name": "eps_estimated", - "type": "float", - "description": "Estimated EPS for the earnings date.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "revenue_estimated", - "type": "float", - "description": "Estimated consensus revenue for the reporting period.", - "default": null, - "optional": true - }, - { - "name": "revenue_actual", - "type": "float", - "description": "The actual reported revenue.", - "default": null, - "optional": true - }, - { - "name": "reporting_time", - "type": "str", - "description": "The reporting time - e.g. after market close.", - "default": null, - "optional": true - }, - { - "name": "updated_at", - "type": "date", - "description": "The date when the data was last updated.", - "default": null, - "optional": true - }, - { - "name": "period_ending", - "type": "date", - "description": "The fiscal period end date.", - "default": null, - "optional": true - } - ] - }, - "model": "HistoricalEps" - }, - "/equity/fundamental/employee_count": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get historical employee count data for a given company.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.employee_count(symbol='AAPL', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[HistoricalEmployees]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "cik", - "type": "int", - "description": "Central Index Key (CIK) for the requested entity.", - "default": "", - "optional": false - }, - { - "name": "acceptance_time", - "type": "datetime", - "description": "Time of acceptance of the company employee.", - "default": "", - "optional": false - }, - { - "name": "period_of_report", - "type": "date", - "description": "Date of reporting of the company employee.", - "default": "", - "optional": false - }, - { - "name": "company_name", - "type": "str", - "description": "Registered name of the company to retrieve the historical employees of.", - "default": "", - "optional": false - }, - { - "name": "form_type", - "type": "str", - "description": "Form type of the company employee.", - "default": "", - "optional": false - }, - { - "name": "filing_date", - "type": "date", - "description": "Filing date of the company employee", - "default": "", - "optional": false - }, - { - "name": "employee_count", - "type": "int", - "description": "Count of employees of the company.", - "default": "", - "optional": false - }, - { - "name": "source", - "type": "str", - "description": "Source URL which retrieves this data for the company.", - "default": "", - "optional": false - } - ], - "fmp": [] - }, - "model": "HistoricalEmployees" - }, - "/equity/fundamental/search_attributes": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Search Intrinio data tags to search in latest or historical attributes.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.search_attributes(query='ebitda', provider='intrinio')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "query", - "type": "str", - "description": "Query to search for.", - "default": "", - "optional": false - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": 1000, - "optional": true - }, - { - "name": "provider", - "type": "Literal['intrinio']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'intrinio' if there is no default.", - "default": "intrinio", - "optional": true - } - ], - "intrinio": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[SearchAttributes]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['intrinio']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "id", - "type": "str", - "description": "ID of the financial attribute.", - "default": "", - "optional": false - }, - { - "name": "name", - "type": "str", - "description": "Name of the financial attribute.", - "default": "", - "optional": false - }, - { - "name": "tag", - "type": "str", - "description": "Tag of the financial attribute.", - "default": "", - "optional": false - }, - { - "name": "statement_code", - "type": "str", - "description": "Code of the financial statement.", - "default": "", - "optional": false - }, - { - "name": "statement_type", - "type": "str", - "description": "Type of the financial statement.", - "default": null, - "optional": true - }, - { - "name": "parent_name", - "type": "str", - "description": "Parent's name of the financial attribute.", - "default": null, - "optional": true - }, - { - "name": "sequence", - "type": "int", - "description": "Sequence of the financial statement.", - "default": null, - "optional": true - }, - { - "name": "factor", - "type": "str", - "description": "Unit of the financial attribute.", - "default": null, - "optional": true - }, - { - "name": "transaction", - "type": "str", - "description": "Transaction type (credit/debit) of the financial attribute.", - "default": null, - "optional": true - }, - { - "name": "type", - "type": "str", - "description": "Type of the financial attribute.", - "default": null, - "optional": true - }, - { - "name": "unit", - "type": "str", - "description": "Unit of the financial attribute.", - "default": null, - "optional": true - } - ], - "intrinio": [] - }, - "model": "SearchAttributes" - }, - "/equity/fundamental/latest_attributes": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get the latest value of a data tag from Intrinio.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.latest_attributes(symbol='AAPL', tag='ceo', provider='intrinio')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. Multiple items allowed for provider(s): intrinio.", - "default": "", - "optional": false - }, - { - "name": "tag", - "type": "Union[str, List[str]]", - "description": "Intrinio data tag ID or code. Multiple items allowed for provider(s): intrinio.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['intrinio']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'intrinio' if there is no default.", - "default": "intrinio", - "optional": true - } - ], - "intrinio": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[LatestAttributes]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['intrinio']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "tag", - "type": "str", - "description": "Tag name for the fetched data.", - "default": null, - "optional": true - }, - { - "name": "value", - "type": "Union[str, float]", - "description": "The value of the data.", - "default": null, - "optional": true - } - ], - "intrinio": [] - }, - "model": "LatestAttributes" - }, - "/equity/fundamental/historical_attributes": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get the historical values of a data tag from Intrinio.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.historical_attributes(symbol='AAPL', tag='ebitda', provider='intrinio')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. Multiple items allowed for provider(s): intrinio.", - "default": "", - "optional": false - }, - { - "name": "tag", - "type": "Union[str, List[str]]", - "description": "Intrinio data tag ID or code. Multiple items allowed for provider(s): intrinio.", - "default": "", - "optional": false - }, - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "frequency", - "type": "Literal['daily', 'weekly', 'monthly', 'quarterly', 'yearly']", - "description": "The frequency of the data.", - "default": "yearly", - "optional": true - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": 1000, - "optional": true - }, - { - "name": "tag_type", - "type": "str", - "description": "Filter by type, when applicable.", - "default": null, - "optional": true - }, - { - "name": "sort", - "type": "Literal['asc', 'desc']", - "description": "Sort order.", - "default": "desc", - "optional": true - }, - { - "name": "provider", - "type": "Literal['intrinio']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'intrinio' if there is no default.", - "default": "intrinio", - "optional": true - } - ], - "intrinio": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[HistoricalAttributes]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['intrinio']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "tag", - "type": "str", - "description": "Tag name for the fetched data.", - "default": null, - "optional": true - }, - { - "name": "value", - "type": "float", - "description": "The value of the data.", - "default": null, - "optional": true - } - ], - "intrinio": [] - }, - "model": "HistoricalAttributes" - }, - "/equity/fundamental/income": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get the income statement for a given company.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.income(symbol='AAPL', provider='fmp')\nobb.equity.fundamental.income(symbol='AAPL', period='annual', limit=5, provider='intrinio')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "period", - "type": "str", - "description": "Time period of the data to return.", - "default": "annual", - "optional": true - }, - { - "name": "limit", - "type": "Annotated[int, Ge(ge=0)]", - "description": "The number of data entries to return.", - "default": 5, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp', 'intrinio', 'polygon', 'yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [], - "intrinio": [ - { - "name": "fiscal_year", - "type": "int", - "description": "The specific fiscal year. Reports do not go beyond 2008.", - "default": null, - "optional": true - } - ], - "polygon": [ - { - "name": "filing_date", - "type": "date", - "description": "Filing date of the financial statement.", - "default": null, - "optional": true - }, - { - "name": "filing_date_lt", - "type": "date", - "description": "Filing date less than the given date.", - "default": null, - "optional": true - }, - { - "name": "filing_date_lte", - "type": "date", - "description": "Filing date less than or equal to the given date.", - "default": null, - "optional": true - }, - { - "name": "filing_date_gt", - "type": "date", - "description": "Filing date greater than the given date.", - "default": null, - "optional": true - }, - { - "name": "filing_date_gte", - "type": "date", - "description": "Filing date greater than or equal to the given date.", - "default": null, - "optional": true - }, - { - "name": "period_of_report_date", - "type": "date", - "description": "Period of report date of the financial statement.", - "default": null, - "optional": true - }, - { - "name": "period_of_report_date_lt", - "type": "date", - "description": "Period of report date less than the given date.", - "default": null, - "optional": true - }, - { - "name": "period_of_report_date_lte", - "type": "date", - "description": "Period of report date less than or equal to the given date.", - "default": null, - "optional": true - }, - { - "name": "period_of_report_date_gt", - "type": "date", - "description": "Period of report date greater than the given date.", - "default": null, - "optional": true - }, - { - "name": "period_of_report_date_gte", - "type": "date", - "description": "Period of report date greater than or equal to the given date.", - "default": null, - "optional": true - }, - { - "name": "include_sources", - "type": "bool", - "description": "Whether to include the sources of the financial statement.", - "default": null, - "optional": true - }, - { - "name": "order", - "type": "Literal['asc', 'desc']", - "description": "Order of the financial statement.", - "default": null, - "optional": true - }, - { - "name": "sort", - "type": "Literal['filing_date', 'period_of_report_date']", - "description": "Sort of the financial statement.", - "default": null, - "optional": true - } - ], - "yfinance": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[IncomeStatement]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'intrinio', 'polygon', 'yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "period_ending", - "type": "date", - "description": "The end date of the reporting period.", - "default": "", - "optional": false - }, - { - "name": "fiscal_period", - "type": "str", - "description": "The fiscal period of the report.", - "default": null, - "optional": true - }, - { - "name": "fiscal_year", - "type": "int", - "description": "The fiscal year of the fiscal period.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "filing_date", - "type": "date", - "description": "The date when the filing was made.", - "default": null, - "optional": true - }, - { - "name": "accepted_date", - "type": "datetime", - "description": "The date and time when the filing was accepted.", - "default": null, - "optional": true - }, - { - "name": "reported_currency", - "type": "str", - "description": "The currency in which the balance sheet was reported.", - "default": null, - "optional": true - }, - { - "name": "revenue", - "type": "float", - "description": "Total revenue.", - "default": null, - "optional": true - }, - { - "name": "cost_of_revenue", - "type": "float", - "description": "Cost of revenue.", - "default": null, - "optional": true - }, - { - "name": "gross_profit", - "type": "float", - "description": "Gross profit.", - "default": null, - "optional": true - }, - { - "name": "gross_profit_margin", - "type": "float", - "description": "Gross profit margin.", - "default": null, - "optional": true - }, - { - "name": "general_and_admin_expense", - "type": "float", - "description": "General and administrative expenses.", - "default": null, - "optional": true - }, - { - "name": "research_and_development_expense", - "type": "float", - "description": "Research and development expenses.", - "default": null, - "optional": true - }, - { - "name": "selling_and_marketing_expense", - "type": "float", - "description": "Selling and marketing expenses.", - "default": null, - "optional": true - }, - { - "name": "selling_general_and_admin_expense", - "type": "float", - "description": "Selling, general and administrative expenses.", - "default": null, - "optional": true - }, - { - "name": "other_expenses", - "type": "float", - "description": "Other expenses.", - "default": null, - "optional": true - }, - { - "name": "total_operating_expenses", - "type": "float", - "description": "Total operating expenses.", - "default": null, - "optional": true - }, - { - "name": "cost_and_expenses", - "type": "float", - "description": "Cost and expenses.", - "default": null, - "optional": true - }, - { - "name": "interest_income", - "type": "float", - "description": "Interest income.", - "default": null, - "optional": true - }, - { - "name": "total_interest_expense", - "type": "float", - "description": "Total interest expenses.", - "default": null, - "optional": true - }, - { - "name": "depreciation_and_amortization", - "type": "float", - "description": "Depreciation and amortization.", - "default": null, - "optional": true - }, - { - "name": "ebitda", - "type": "float", - "description": "EBITDA.", - "default": null, - "optional": true - }, - { - "name": "ebitda_margin", - "type": "float", - "description": "EBITDA margin.", - "default": null, - "optional": true - }, - { - "name": "total_operating_income", - "type": "float", - "description": "Total operating income.", - "default": null, - "optional": true - }, - { - "name": "operating_income_margin", - "type": "float", - "description": "Operating income margin.", - "default": null, - "optional": true - }, - { - "name": "total_other_income_expenses", - "type": "float", - "description": "Total other income and expenses.", - "default": null, - "optional": true - }, - { - "name": "total_pre_tax_income", - "type": "float", - "description": "Total pre-tax income.", - "default": null, - "optional": true - }, - { - "name": "pre_tax_income_margin", - "type": "float", - "description": "Pre-tax income margin.", - "default": null, - "optional": true - }, - { - "name": "income_tax_expense", - "type": "float", - "description": "Income tax expense.", - "default": null, - "optional": true - }, - { - "name": "consolidated_net_income", - "type": "float", - "description": "Consolidated net income.", - "default": null, - "optional": true - }, - { - "name": "net_income_margin", - "type": "float", - "description": "Net income margin.", - "default": null, - "optional": true - }, - { - "name": "basic_earnings_per_share", - "type": "float", - "description": "Basic earnings per share.", - "default": null, - "optional": true - }, - { - "name": "diluted_earnings_per_share", - "type": "float", - "description": "Diluted earnings per share.", - "default": null, - "optional": true - }, - { - "name": "weighted_average_basic_shares_outstanding", - "type": "float", - "description": "Weighted average basic shares outstanding.", - "default": null, - "optional": true - }, - { - "name": "weighted_average_diluted_shares_outstanding", - "type": "float", - "description": "Weighted average diluted shares outstanding.", - "default": null, - "optional": true - }, - { - "name": "link", - "type": "str", - "description": "Link to the filing.", - "default": null, - "optional": true - }, - { - "name": "final_link", - "type": "str", - "description": "Link to the filing document.", - "default": null, - "optional": true - } - ], - "intrinio": [ - { - "name": "reported_currency", - "type": "str", - "description": "The currency in which the balance sheet is reported.", - "default": null, - "optional": true - }, - { - "name": "revenue", - "type": "float", - "description": "Total revenue", - "default": null, - "optional": true - }, - { - "name": "operating_revenue", - "type": "float", - "description": "Total operating revenue", - "default": null, - "optional": true - }, - { - "name": "cost_of_revenue", - "type": "float", - "description": "Total cost of revenue", - "default": null, - "optional": true - }, - { - "name": "operating_cost_of_revenue", - "type": "float", - "description": "Total operating cost of revenue", - "default": null, - "optional": true - }, - { - "name": "gross_profit", - "type": "float", - "description": "Total gross profit", - "default": null, - "optional": true - }, - { - "name": "gross_profit_margin", - "type": "float", - "description": "Gross margin ratio.", - "default": null, - "optional": true - }, - { - "name": "provision_for_credit_losses", - "type": "float", - "description": "Provision for credit losses", - "default": null, - "optional": true - }, - { - "name": "research_and_development_expense", - "type": "float", - "description": "Research and development expense", - "default": null, - "optional": true - }, - { - "name": "selling_general_and_admin_expense", - "type": "float", - "description": "Selling, general, and admin expense", - "default": null, - "optional": true - }, - { - "name": "salaries_and_employee_benefits", - "type": "float", - "description": "Salaries and employee benefits", - "default": null, - "optional": true - }, - { - "name": "marketing_expense", - "type": "float", - "description": "Marketing expense", - "default": null, - "optional": true - }, - { - "name": "net_occupancy_and_equipment_expense", - "type": "float", - "description": "Net occupancy and equipment expense", - "default": null, - "optional": true - }, - { - "name": "other_operating_expenses", - "type": "float", - "description": "Other operating expenses", - "default": null, - "optional": true - }, - { - "name": "depreciation_expense", - "type": "float", - "description": "Depreciation expense", - "default": null, - "optional": true - }, - { - "name": "amortization_expense", - "type": "float", - "description": "Amortization expense", - "default": null, - "optional": true - }, - { - "name": "amortization_of_deferred_policy_acquisition_costs", - "type": "float", - "description": "Amortization of deferred policy acquisition costs", - "default": null, - "optional": true - }, - { - "name": "exploration_expense", - "type": "float", - "description": "Exploration expense", - "default": null, - "optional": true - }, - { - "name": "depletion_expense", - "type": "float", - "description": "Depletion expense", - "default": null, - "optional": true - }, - { - "name": "total_operating_expenses", - "type": "float", - "description": "Total operating expenses", - "default": null, - "optional": true - }, - { - "name": "total_operating_income", - "type": "float", - "description": "Total operating income", - "default": null, - "optional": true - }, - { - "name": "deposits_and_money_market_investments_interest_income", - "type": "float", - "description": "Deposits and money market investments interest income", - "default": null, - "optional": true - }, - { - "name": "federal_funds_sold_and_securities_borrowed_interest_income", - "type": "float", - "description": "Federal funds sold and securities borrowed interest income", - "default": null, - "optional": true - }, - { - "name": "investment_securities_interest_income", - "type": "float", - "description": "Investment securities interest income", - "default": null, - "optional": true - }, - { - "name": "loans_and_leases_interest_income", - "type": "float", - "description": "Loans and leases interest income", - "default": null, - "optional": true - }, - { - "name": "trading_account_interest_income", - "type": "float", - "description": "Trading account interest income", - "default": null, - "optional": true - }, - { - "name": "other_interest_income", - "type": "float", - "description": "Other interest income", - "default": null, - "optional": true - }, - { - "name": "total_non_interest_income", - "type": "float", - "description": "Total non-interest income", - "default": null, - "optional": true - }, - { - "name": "interest_and_investment_income", - "type": "float", - "description": "Interest and investment income", - "default": null, - "optional": true - }, - { - "name": "short_term_borrowings_interest_expense", - "type": "float", - "description": "Short-term borrowings interest expense", - "default": null, - "optional": true - }, - { - "name": "long_term_debt_interest_expense", - "type": "float", - "description": "Long-term debt interest expense", - "default": null, - "optional": true - }, - { - "name": "capitalized_lease_obligations_interest_expense", - "type": "float", - "description": "Capitalized lease obligations interest expense", - "default": null, - "optional": true - }, - { - "name": "deposits_interest_expense", - "type": "float", - "description": "Deposits interest expense", - "default": null, - "optional": true - }, - { - "name": "federal_funds_purchased_and_securities_sold_interest_expense", - "type": "float", - "description": "Federal funds purchased and securities sold interest expense", - "default": null, - "optional": true - }, - { - "name": "other_interest_expense", - "type": "float", - "description": "Other interest expense", - "default": null, - "optional": true - }, - { - "name": "total_interest_expense", - "type": "float", - "description": "Total interest expense", - "default": null, - "optional": true - }, - { - "name": "net_interest_income", - "type": "float", - "description": "Net interest income", - "default": null, - "optional": true - }, - { - "name": "other_non_interest_income", - "type": "float", - "description": "Other non-interest income", - "default": null, - "optional": true - }, - { - "name": "investment_banking_income", - "type": "float", - "description": "Investment banking income", - "default": null, - "optional": true - }, - { - "name": "trust_fees_by_commissions", - "type": "float", - "description": "Trust fees by commissions", - "default": null, - "optional": true - }, - { - "name": "premiums_earned", - "type": "float", - "description": "Premiums earned", - "default": null, - "optional": true - }, - { - "name": "insurance_policy_acquisition_costs", - "type": "float", - "description": "Insurance policy acquisition costs", - "default": null, - "optional": true - }, - { - "name": "current_and_future_benefits", - "type": "float", - "description": "Current and future benefits", - "default": null, - "optional": true - }, - { - "name": "property_and_liability_insurance_claims", - "type": "float", - "description": "Property and liability insurance claims", - "default": null, - "optional": true - }, - { - "name": "total_non_interest_expense", - "type": "float", - "description": "Total non-interest expense", - "default": null, - "optional": true - }, - { - "name": "net_realized_and_unrealized_capital_gains_on_investments", - "type": "float", - "description": "Net realized and unrealized capital gains on investments", - "default": null, - "optional": true - }, - { - "name": "other_gains", - "type": "float", - "description": "Other gains", - "default": null, - "optional": true - }, - { - "name": "non_operating_income", - "type": "float", - "description": "Non-operating income", - "default": null, - "optional": true - }, - { - "name": "other_income", - "type": "float", - "description": "Other income", - "default": null, - "optional": true - }, - { - "name": "other_revenue", - "type": "float", - "description": "Other revenue", - "default": null, - "optional": true - }, - { - "name": "extraordinary_income", - "type": "float", - "description": "Extraordinary income", - "default": null, - "optional": true - }, - { - "name": "total_other_income", - "type": "float", - "description": "Total other income", - "default": null, - "optional": true - }, - { - "name": "ebitda", - "type": "float", - "description": "Earnings Before Interest, Taxes, Depreciation and Amortization.", - "default": null, - "optional": true - }, - { - "name": "ebitda_margin", - "type": "float", - "description": "Margin on Earnings Before Interest, Taxes, Depreciation and Amortization.", - "default": null, - "optional": true - }, - { - "name": "total_pre_tax_income", - "type": "float", - "description": "Total pre-tax income", - "default": null, - "optional": true - }, - { - "name": "ebit", - "type": "float", - "description": "Earnings Before Interest and Taxes.", - "default": null, - "optional": true - }, - { - "name": "pre_tax_income_margin", - "type": "float", - "description": "Pre-Tax Income Margin.", - "default": null, - "optional": true - }, - { - "name": "income_tax_expense", - "type": "float", - "description": "Income tax expense", - "default": null, - "optional": true - }, - { - "name": "impairment_charge", - "type": "float", - "description": "Impairment charge", - "default": null, - "optional": true - }, - { - "name": "restructuring_charge", - "type": "float", - "description": "Restructuring charge", - "default": null, - "optional": true - }, - { - "name": "service_charges_on_deposit_accounts", - "type": "float", - "description": "Service charges on deposit accounts", - "default": null, - "optional": true - }, - { - "name": "other_service_charges", - "type": "float", - "description": "Other service charges", - "default": null, - "optional": true - }, - { - "name": "other_special_charges", - "type": "float", - "description": "Other special charges", - "default": null, - "optional": true - }, - { - "name": "other_cost_of_revenue", - "type": "float", - "description": "Other cost of revenue", - "default": null, - "optional": true - }, - { - "name": "net_income_continuing_operations", - "type": "float", - "description": "Net income (continuing operations)", - "default": null, - "optional": true - }, - { - "name": "net_income_discontinued_operations", - "type": "float", - "description": "Net income (discontinued operations)", - "default": null, - "optional": true - }, - { - "name": "consolidated_net_income", - "type": "float", - "description": "Consolidated net income", - "default": null, - "optional": true - }, - { - "name": "other_adjustments_to_consolidated_net_income", - "type": "float", - "description": "Other adjustments to consolidated net income", - "default": null, - "optional": true - }, - { - "name": "other_adjustment_to_net_income_attributable_to_common_shareholders", - "type": "float", - "description": "Other adjustment to net income attributable to common shareholders", - "default": null, - "optional": true - }, - { - "name": "net_income_attributable_to_noncontrolling_interest", - "type": "float", - "description": "Net income attributable to noncontrolling interest", - "default": null, - "optional": true - }, - { - "name": "net_income_attributable_to_common_shareholders", - "type": "float", - "description": "Net income attributable to common shareholders", - "default": null, - "optional": true - }, - { - "name": "basic_earnings_per_share", - "type": "float", - "description": "Basic earnings per share", - "default": null, - "optional": true - }, - { - "name": "diluted_earnings_per_share", - "type": "float", - "description": "Diluted earnings per share", - "default": null, - "optional": true - }, - { - "name": "basic_and_diluted_earnings_per_share", - "type": "float", - "description": "Basic and diluted earnings per share", - "default": null, - "optional": true - }, - { - "name": "cash_dividends_to_common_per_share", - "type": "float", - "description": "Cash dividends to common per share", - "default": null, - "optional": true - }, - { - "name": "preferred_stock_dividends_declared", - "type": "float", - "description": "Preferred stock dividends declared", - "default": null, - "optional": true - }, - { - "name": "weighted_average_basic_shares_outstanding", - "type": "float", - "description": "Weighted average basic shares outstanding", - "default": null, - "optional": true - }, - { - "name": "weighted_average_diluted_shares_outstanding", - "type": "float", - "description": "Weighted average diluted shares outstanding", - "default": null, - "optional": true - }, - { - "name": "weighted_average_basic_and_diluted_shares_outstanding", - "type": "float", - "description": "Weighted average basic and diluted shares outstanding", - "default": null, - "optional": true - } - ], - "polygon": [ - { - "name": "revenue", - "type": "float", - "description": "Total Revenue", - "default": null, - "optional": true - }, - { - "name": "cost_of_revenue_goods", - "type": "float", - "description": "Cost of Revenue - Goods", - "default": null, - "optional": true - }, - { - "name": "cost_of_revenue_services", - "type": "float", - "description": "Cost of Revenue - Services", - "default": null, - "optional": true - }, - { - "name": "cost_of_revenue", - "type": "float", - "description": "Cost of Revenue", - "default": null, - "optional": true - }, - { - "name": "gross_profit", - "type": "float", - "description": "Gross Profit", - "default": null, - "optional": true - }, - { - "name": "provisions_for_loan_lease_and_other_losses", - "type": "float", - "description": "Provisions for loan lease and other losses", - "default": null, - "optional": true - }, - { - "name": "depreciation_and_amortization", - "type": "float", - "description": "Depreciation and Amortization", - "default": null, - "optional": true - }, - { - "name": "income_tax_expense_benefit_current", - "type": "float", - "description": "Income tax expense benefit current", - "default": null, - "optional": true - }, - { - "name": "deferred_tax_benefit", - "type": "float", - "description": "Deferred tax benefit", - "default": null, - "optional": true - }, - { - "name": "benefits_costs_expenses", - "type": "float", - "description": "Benefits, costs and expenses", - "default": null, - "optional": true - }, - { - "name": "selling_general_and_administrative_expense", - "type": "float", - "description": "Selling, general and administrative expense", - "default": null, - "optional": true - }, - { - "name": "research_and_development", - "type": "float", - "description": "Research and development", - "default": null, - "optional": true - }, - { - "name": "costs_and_expenses", - "type": "float", - "description": "Costs and expenses", - "default": null, - "optional": true - }, - { - "name": "other_operating_expenses", - "type": "float", - "description": "Other Operating Expenses", - "default": null, - "optional": true - }, - { - "name": "operating_expenses", - "type": "float", - "description": "Operating expenses", - "default": null, - "optional": true - }, - { - "name": "operating_income", - "type": "float", - "description": "Operating Income/Loss", - "default": null, - "optional": true - }, - { - "name": "non_operating_income", - "type": "float", - "description": "Non Operating Income/Loss", - "default": null, - "optional": true - }, - { - "name": "interest_and_dividend_income", - "type": "float", - "description": "Interest and Dividend Income", - "default": null, - "optional": true - }, - { - "name": "total_interest_expense", - "type": "float", - "description": "Interest Expense", - "default": null, - "optional": true - }, - { - "name": "interest_and_debt_expense", - "type": "float", - "description": "Interest and Debt Expense", - "default": null, - "optional": true - }, - { - "name": "net_interest_income", - "type": "float", - "description": "Interest Income Net", - "default": null, - "optional": true - }, - { - "name": "interest_income_after_provision_for_losses", - "type": "float", - "description": "Interest Income After Provision for Losses", - "default": null, - "optional": true - }, - { - "name": "non_interest_expense", - "type": "float", - "description": "Non-Interest Expense", - "default": null, - "optional": true - }, - { - "name": "non_interest_income", - "type": "float", - "description": "Non-Interest Income", - "default": null, - "optional": true - }, - { - "name": "income_from_discontinued_operations_net_of_tax_on_disposal", - "type": "float", - "description": "Income From Discontinued Operations Net of Tax on Disposal", - "default": null, - "optional": true - }, - { - "name": "income_from_discontinued_operations_net_of_tax", - "type": "float", - "description": "Income From Discontinued Operations Net of Tax", - "default": null, - "optional": true - }, - { - "name": "income_before_equity_method_investments", - "type": "float", - "description": "Income Before Equity Method Investments", - "default": null, - "optional": true - }, - { - "name": "income_from_equity_method_investments", - "type": "float", - "description": "Income From Equity Method Investments", - "default": null, - "optional": true - }, - { - "name": "total_pre_tax_income", - "type": "float", - "description": "Income Before Tax", - "default": null, - "optional": true - }, - { - "name": "income_tax_expense", - "type": "float", - "description": "Income Tax Expense", - "default": null, - "optional": true - }, - { - "name": "income_after_tax", - "type": "float", - "description": "Income After Tax", - "default": null, - "optional": true - }, - { - "name": "consolidated_net_income", - "type": "float", - "description": "Net Income/Loss", - "default": null, - "optional": true - }, - { - "name": "net_income_attributable_noncontrolling_interest", - "type": "float", - "description": "Net income (loss) attributable to noncontrolling interest", - "default": null, - "optional": true - }, - { - "name": "net_income_attributable_to_parent", - "type": "float", - "description": "Net income (loss) attributable to parent", - "default": null, - "optional": true - }, - { - "name": "net_income_attributable_to_common_shareholders", - "type": "float", - "description": "Net Income/Loss Available To Common Stockholders Basic", - "default": null, - "optional": true - }, - { - "name": "participating_securities_earnings", - "type": "float", - "description": "Participating Securities Distributed And Undistributed Earnings Loss Basic", - "default": null, - "optional": true - }, - { - "name": "undistributed_earnings_allocated_to_participating_securities", - "type": "float", - "description": "Undistributed Earnings Allocated To Participating Securities", - "default": null, - "optional": true - }, - { - "name": "common_stock_dividends", - "type": "float", - "description": "Common Stock Dividends", - "default": null, - "optional": true - }, - { - "name": "preferred_stock_dividends_and_other_adjustments", - "type": "float", - "description": "Preferred stock dividends and other adjustments", - "default": null, - "optional": true - }, - { - "name": "basic_earnings_per_share", - "type": "float", - "description": "Earnings Per Share", - "default": null, - "optional": true - }, - { - "name": "diluted_earnings_per_share", - "type": "float", - "description": "Diluted Earnings Per Share", - "default": null, - "optional": true - }, - { - "name": "weighted_average_basic_shares_outstanding", - "type": "float", - "description": "Basic Average Shares", - "default": null, - "optional": true - }, - { - "name": "weighted_average_diluted_shares_outstanding", - "type": "float", - "description": "Diluted Average Shares", - "default": null, - "optional": true - } - ], - "yfinance": [] - }, - "model": "IncomeStatement" - }, - "/equity/fundamental/income_growth": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get the growth of a company's income statement items over time.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.income_growth(symbol='AAPL', provider='fmp')\nobb.equity.fundamental.income_growth(symbol='AAPL', limit=10, period='annual', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": 10, - "optional": true - }, - { - "name": "period", - "type": "Literal['annual', 'quarter']", - "description": "Time period of the data to return.", - "default": "annual", - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[IncomeStatementGrowth]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": null, - "optional": true - }, - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "period", - "type": "str", - "description": "Period the statement is returned for.", - "default": "", - "optional": false - }, - { - "name": "growth_revenue", - "type": "float", - "description": "Growth rate of total revenue.", - "default": "", - "optional": false - }, - { - "name": "growth_cost_of_revenue", - "type": "float", - "description": "Growth rate of cost of goods sold.", - "default": "", - "optional": false - }, - { - "name": "growth_gross_profit", - "type": "float", - "description": "Growth rate of gross profit.", - "default": "", - "optional": false - }, - { - "name": "growth_gross_profit_ratio", - "type": "float", - "description": "Growth rate of gross profit as a percentage of revenue.", - "default": "", - "optional": false - }, - { - "name": "growth_research_and_development_expenses", - "type": "float", - "description": "Growth rate of expenses on research and development.", - "default": "", - "optional": false - }, - { - "name": "growth_general_and_administrative_expenses", - "type": "float", - "description": "Growth rate of general and administrative expenses.", - "default": "", - "optional": false - }, - { - "name": "growth_selling_and_marketing_expenses", - "type": "float", - "description": "Growth rate of expenses on selling and marketing activities.", - "default": "", - "optional": false - }, - { - "name": "growth_other_expenses", - "type": "float", - "description": "Growth rate of other operating expenses.", - "default": "", - "optional": false - }, - { - "name": "growth_operating_expenses", - "type": "float", - "description": "Growth rate of total operating expenses.", - "default": "", - "optional": false - }, - { - "name": "growth_cost_and_expenses", - "type": "float", - "description": "Growth rate of total costs and expenses.", - "default": "", - "optional": false - }, - { - "name": "growth_interest_expense", - "type": "float", - "description": "Growth rate of interest expenses.", - "default": "", - "optional": false - }, - { - "name": "growth_depreciation_and_amortization", - "type": "float", - "description": "Growth rate of depreciation and amortization expenses.", - "default": "", - "optional": false - }, - { - "name": "growth_ebitda", - "type": "float", - "description": "Growth rate of Earnings Before Interest, Taxes, Depreciation, and Amortization.", - "default": "", - "optional": false - }, - { - "name": "growth_ebitda_ratio", - "type": "float", - "description": "Growth rate of EBITDA as a percentage of revenue.", - "default": "", - "optional": false - }, - { - "name": "growth_operating_income", - "type": "float", - "description": "Growth rate of operating income.", - "default": "", - "optional": false - }, - { - "name": "growth_operating_income_ratio", - "type": "float", - "description": "Growth rate of operating income as a percentage of revenue.", - "default": "", - "optional": false - }, - { - "name": "growth_total_other_income_expenses_net", - "type": "float", - "description": "Growth rate of net total other income and expenses.", - "default": "", - "optional": false - }, - { - "name": "growth_income_before_tax", - "type": "float", - "description": "Growth rate of income before taxes.", - "default": "", - "optional": false - }, - { - "name": "growth_income_before_tax_ratio", - "type": "float", - "description": "Growth rate of income before taxes as a percentage of revenue.", - "default": "", - "optional": false - }, - { - "name": "growth_income_tax_expense", - "type": "float", - "description": "Growth rate of income tax expenses.", - "default": "", - "optional": false - }, - { - "name": "growth_net_income", - "type": "float", - "description": "Growth rate of net income.", - "default": "", - "optional": false - }, - { - "name": "growth_net_income_ratio", - "type": "float", - "description": "Growth rate of net income as a percentage of revenue.", - "default": "", - "optional": false - }, - { - "name": "growth_eps", - "type": "float", - "description": "Growth rate of Earnings Per Share (EPS).", - "default": "", - "optional": false - }, - { - "name": "growth_eps_diluted", - "type": "float", - "description": "Growth rate of diluted Earnings Per Share (EPS).", - "default": "", - "optional": false - }, - { - "name": "growth_weighted_average_shs_out", - "type": "float", - "description": "Growth rate of weighted average shares outstanding.", - "default": "", - "optional": false - }, - { - "name": "growth_weighted_average_shs_out_dil", - "type": "float", - "description": "Growth rate of diluted weighted average shares outstanding.", - "default": "", - "optional": false - } - ], - "fmp": [] - }, - "model": "IncomeStatementGrowth" - }, - "/equity/fundamental/metrics": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get fundamental metrics for a given company.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.metrics(symbol='AAPL', provider='fmp')\nobb.equity.fundamental.metrics(symbol='AAPL', period='annual', limit=100, provider='intrinio')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio, yfinance.", - "default": "", - "optional": false - }, - { - "name": "period", - "type": "Literal['annual', 'quarter']", - "description": "Time period of the data to return.", - "default": "annual", - "optional": true - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": 100, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp', 'intrinio', 'yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [ - { - "name": "with_ttm", - "type": "bool", - "description": "Include trailing twelve months (TTM) data.", - "default": false, - "optional": true - } - ], - "intrinio": [], - "yfinance": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[KeyMetrics]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'intrinio', 'yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": null, - "optional": true - }, - { - "name": "market_cap", - "type": "float", - "description": "Market capitalization", - "default": null, - "optional": true - }, - { - "name": "pe_ratio", - "type": "float", - "description": "Price-to-earnings ratio (P/E ratio)", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "period", - "type": "str", - "description": "Period of the data.", - "default": "", - "optional": false - }, - { - "name": "calendar_year", - "type": "int", - "description": "Calendar year.", - "default": null, - "optional": true - }, - { - "name": "revenue_per_share", - "type": "float", - "description": "Revenue per share", - "default": null, - "optional": true - }, - { - "name": "net_income_per_share", - "type": "float", - "description": "Net income per share", - "default": null, - "optional": true - }, - { - "name": "operating_cash_flow_per_share", - "type": "float", - "description": "Operating cash flow per share", - "default": null, - "optional": true - }, - { - "name": "free_cash_flow_per_share", - "type": "float", - "description": "Free cash flow per share", - "default": null, - "optional": true - }, - { - "name": "cash_per_share", - "type": "float", - "description": "Cash per share", - "default": null, - "optional": true - }, - { - "name": "book_value_per_share", - "type": "float", - "description": "Book value per share", - "default": null, - "optional": true - }, - { - "name": "tangible_book_value_per_share", - "type": "float", - "description": "Tangible book value per share", - "default": null, - "optional": true - }, - { - "name": "shareholders_equity_per_share", - "type": "float", - "description": "Shareholders equity per share", - "default": null, - "optional": true - }, - { - "name": "interest_debt_per_share", - "type": "float", - "description": "Interest debt per share", - "default": null, - "optional": true - }, - { - "name": "enterprise_value", - "type": "float", - "description": "Enterprise value", - "default": null, - "optional": true - }, - { - "name": "price_to_sales_ratio", - "type": "float", - "description": "Price-to-sales ratio", - "default": null, - "optional": true - }, - { - "name": "pocf_ratio", - "type": "float", - "description": "Price-to-operating cash flow ratio", - "default": null, - "optional": true - }, - { - "name": "pfcf_ratio", - "type": "float", - "description": "Price-to-free cash flow ratio", - "default": null, - "optional": true - }, - { - "name": "pb_ratio", - "type": "float", - "description": "Price-to-book ratio", - "default": null, - "optional": true - }, - { - "name": "ptb_ratio", - "type": "float", - "description": "Price-to-tangible book ratio", - "default": null, - "optional": true - }, - { - "name": "ev_to_sales", - "type": "float", - "description": "Enterprise value-to-sales ratio", - "default": null, - "optional": true - }, - { - "name": "enterprise_value_over_ebitda", - "type": "float", - "description": "Enterprise value-to-EBITDA ratio", - "default": null, - "optional": true - }, - { - "name": "ev_to_operating_cash_flow", - "type": "float", - "description": "Enterprise value-to-operating cash flow ratio", - "default": null, - "optional": true - }, - { - "name": "ev_to_free_cash_flow", - "type": "float", - "description": "Enterprise value-to-free cash flow ratio", - "default": null, - "optional": true - }, - { - "name": "earnings_yield", - "type": "float", - "description": "Earnings yield", - "default": null, - "optional": true - }, - { - "name": "free_cash_flow_yield", - "type": "float", - "description": "Free cash flow yield", - "default": null, - "optional": true - }, - { - "name": "debt_to_equity", - "type": "float", - "description": "Debt-to-equity ratio", - "default": null, - "optional": true - }, - { - "name": "debt_to_assets", - "type": "float", - "description": "Debt-to-assets ratio", - "default": null, - "optional": true - }, - { - "name": "net_debt_to_ebitda", - "type": "float", - "description": "Net debt-to-EBITDA ratio", - "default": null, - "optional": true - }, - { - "name": "current_ratio", - "type": "float", - "description": "Current ratio", - "default": null, - "optional": true - }, - { - "name": "interest_coverage", - "type": "float", - "description": "Interest coverage", - "default": null, - "optional": true - }, - { - "name": "income_quality", - "type": "float", - "description": "Income quality", - "default": null, - "optional": true - }, - { - "name": "dividend_yield", - "type": "float", - "description": "Dividend yield, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "payout_ratio", - "type": "float", - "description": "Payout ratio", - "default": null, - "optional": true - }, - { - "name": "sales_general_and_administrative_to_revenue", - "type": "float", - "description": "Sales general and administrative expenses-to-revenue ratio", - "default": null, - "optional": true - }, - { - "name": "research_and_development_to_revenue", - "type": "float", - "description": "Research and development expenses-to-revenue ratio", - "default": null, - "optional": true - }, - { - "name": "intangibles_to_total_assets", - "type": "float", - "description": "Intangibles-to-total assets ratio", - "default": null, - "optional": true - }, - { - "name": "capex_to_operating_cash_flow", - "type": "float", - "description": "Capital expenditures-to-operating cash flow ratio", - "default": null, - "optional": true - }, - { - "name": "capex_to_revenue", - "type": "float", - "description": "Capital expenditures-to-revenue ratio", - "default": null, - "optional": true - }, - { - "name": "capex_to_depreciation", - "type": "float", - "description": "Capital expenditures-to-depreciation ratio", - "default": null, - "optional": true - }, - { - "name": "stock_based_compensation_to_revenue", - "type": "float", - "description": "Stock-based compensation-to-revenue ratio", - "default": null, - "optional": true - }, - { - "name": "graham_number", - "type": "float", - "description": "Graham number", - "default": null, - "optional": true - }, - { - "name": "roic", - "type": "float", - "description": "Return on invested capital", - "default": null, - "optional": true - }, - { - "name": "return_on_tangible_assets", - "type": "float", - "description": "Return on tangible assets", - "default": null, - "optional": true - }, - { - "name": "graham_net_net", - "type": "float", - "description": "Graham net-net working capital", - "default": null, - "optional": true - }, - { - "name": "working_capital", - "type": "float", - "description": "Working capital", - "default": null, - "optional": true - }, - { - "name": "tangible_asset_value", - "type": "float", - "description": "Tangible asset value", - "default": null, - "optional": true - }, - { - "name": "net_current_asset_value", - "type": "float", - "description": "Net current asset value", - "default": null, - "optional": true - }, - { - "name": "invested_capital", - "type": "float", - "description": "Invested capital", - "default": null, - "optional": true - }, - { - "name": "average_receivables", - "type": "float", - "description": "Average receivables", - "default": null, - "optional": true - }, - { - "name": "average_payables", - "type": "float", - "description": "Average payables", - "default": null, - "optional": true - }, - { - "name": "average_inventory", - "type": "float", - "description": "Average inventory", - "default": null, - "optional": true - }, - { - "name": "days_sales_outstanding", - "type": "float", - "description": "Days sales outstanding", - "default": null, - "optional": true - }, - { - "name": "days_payables_outstanding", - "type": "float", - "description": "Days payables outstanding", - "default": null, - "optional": true - }, - { - "name": "days_of_inventory_on_hand", - "type": "float", - "description": "Days of inventory on hand", - "default": null, - "optional": true - }, - { - "name": "receivables_turnover", - "type": "float", - "description": "Receivables turnover", - "default": null, - "optional": true - }, - { - "name": "payables_turnover", - "type": "float", - "description": "Payables turnover", - "default": null, - "optional": true - }, - { - "name": "inventory_turnover", - "type": "float", - "description": "Inventory turnover", - "default": null, - "optional": true - }, - { - "name": "roe", - "type": "float", - "description": "Return on equity", - "default": null, - "optional": true - }, - { - "name": "capex_per_share", - "type": "float", - "description": "Capital expenditures per share", - "default": null, - "optional": true - } - ], - "intrinio": [ - { - "name": "price_to_book", - "type": "float", - "description": "Price to book ratio.", - "default": null, - "optional": true - }, - { - "name": "price_to_tangible_book", - "type": "float", - "description": "Price to tangible book ratio.", - "default": null, - "optional": true - }, - { - "name": "price_to_revenue", - "type": "float", - "description": "Price to revenue ratio.", - "default": null, - "optional": true - }, - { - "name": "quick_ratio", - "type": "float", - "description": "Quick ratio.", - "default": null, - "optional": true - }, - { - "name": "gross_margin", - "type": "float", - "description": "Gross margin, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "ebit_margin", - "type": "float", - "description": "EBIT margin, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "profit_margin", - "type": "float", - "description": "Profit margin, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "eps", - "type": "float", - "description": "Basic earnings per share.", - "default": null, - "optional": true - }, - { - "name": "eps_growth", - "type": "float", - "description": "EPS growth, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "revenue_growth", - "type": "float", - "description": "Revenue growth, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "ebitda_growth", - "type": "float", - "description": "EBITDA growth, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "ebit_growth", - "type": "float", - "description": "EBIT growth, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "net_income_growth", - "type": "float", - "description": "Net income growth, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "free_cash_flow_to_firm_growth", - "type": "float", - "description": "Free cash flow to firm growth, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "invested_capital_growth", - "type": "float", - "description": "Invested capital growth, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "return_on_assets", - "type": "float", - "description": "Return on assets, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "return_on_equity", - "type": "float", - "description": "Return on equity, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "return_on_invested_capital", - "type": "float", - "description": "Return on invested capital, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "ebitda", - "type": "int", - "description": "Earnings before interest, taxes, depreciation, and amortization.", - "default": null, - "optional": true - }, - { - "name": "ebit", - "type": "int", - "description": "Earnings before interest and taxes.", - "default": null, - "optional": true - }, - { - "name": "long_term_debt", - "type": "int", - "description": "Long-term debt.", - "default": null, - "optional": true - }, - { - "name": "total_debt", - "type": "int", - "description": "Total debt.", - "default": null, - "optional": true - }, - { - "name": "total_capital", - "type": "int", - "description": "The sum of long-term debt and total shareholder equity.", - "default": null, - "optional": true - }, - { - "name": "enterprise_value", - "type": "int", - "description": "Enterprise value.", - "default": null, - "optional": true - }, - { - "name": "free_cash_flow_to_firm", - "type": "int", - "description": "Free cash flow to firm.", - "default": null, - "optional": true - }, - { - "name": "altman_z_score", - "type": "float", - "description": "Altman Z-score.", - "default": null, - "optional": true - }, - { - "name": "beta", - "type": "float", - "description": "Beta relative to the broad market (rolling three-year).", - "default": null, - "optional": true - }, - { - "name": "dividend_yield", - "type": "float", - "description": "Dividend yield, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "earnings_yield", - "type": "float", - "description": "Earnings yield, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "last_price", - "type": "float", - "description": "Last price of the stock.", - "default": null, - "optional": true - }, - { - "name": "year_high", - "type": "float", - "description": "52 week high", - "default": null, - "optional": true - }, - { - "name": "year_low", - "type": "float", - "description": "52 week low", - "default": null, - "optional": true - }, - { - "name": "volume_avg", - "type": "int", - "description": "Average daily volume.", - "default": null, - "optional": true - }, - { - "name": "short_interest", - "type": "int", - "description": "Number of shares reported as sold short.", - "default": null, - "optional": true - }, - { - "name": "shares_outstanding", - "type": "int", - "description": "Weighted average shares outstanding (TTM).", - "default": null, - "optional": true - }, - { - "name": "days_to_cover", - "type": "float", - "description": "Days to cover short interest, based on average daily volume.", - "default": null, - "optional": true - } - ], - "yfinance": [ - { - "name": "forward_pe", - "type": "float", - "description": "Forward price-to-earnings ratio.", - "default": null, - "optional": true - }, - { - "name": "peg_ratio", - "type": "float", - "description": "PEG ratio (5-year expected).", - "default": null, - "optional": true - }, - { - "name": "peg_ratio_ttm", - "type": "float", - "description": "PEG ratio (TTM).", - "default": null, - "optional": true - }, - { - "name": "eps_ttm", - "type": "float", - "description": "Earnings per share (TTM).", - "default": null, - "optional": true - }, - { - "name": "eps_forward", - "type": "float", - "description": "Forward earnings per share.", - "default": null, - "optional": true - }, - { - "name": "enterprise_to_ebitda", - "type": "float", - "description": "Enterprise value to EBITDA ratio.", - "default": null, - "optional": true - }, - { - "name": "earnings_growth", - "type": "float", - "description": "Earnings growth (Year Over Year), as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "earnings_growth_quarterly", - "type": "float", - "description": "Quarterly earnings growth (Year Over Year), as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "revenue_per_share", - "type": "float", - "description": "Revenue per share (TTM).", - "default": null, - "optional": true - }, - { - "name": "revenue_growth", - "type": "float", - "description": "Revenue growth (Year Over Year), as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "enterprise_to_revenue", - "type": "float", - "description": "Enterprise value to revenue ratio.", - "default": null, - "optional": true - }, - { - "name": "cash_per_share", - "type": "float", - "description": "Cash per share.", - "default": null, - "optional": true - }, - { - "name": "quick_ratio", - "type": "float", - "description": "Quick ratio.", - "default": null, - "optional": true - }, - { - "name": "current_ratio", - "type": "float", - "description": "Current ratio.", - "default": null, - "optional": true - }, - { - "name": "debt_to_equity", - "type": "float", - "description": "Debt-to-equity ratio.", - "default": null, - "optional": true - }, - { - "name": "gross_margin", - "type": "float", - "description": "Gross margin, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "operating_margin", - "type": "float", - "description": "Operating margin, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "ebitda_margin", - "type": "float", - "description": "EBITDA margin, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "profit_margin", - "type": "float", - "description": "Profit margin, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "return_on_assets", - "type": "float", - "description": "Return on assets, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "return_on_equity", - "type": "float", - "description": "Return on equity, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "dividend_yield", - "type": "float", - "description": "Dividend yield, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "dividend_yield_5y_avg", - "type": "float", - "description": "5-year average dividend yield, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "payout_ratio", - "type": "float", - "description": "Payout ratio.", - "default": null, - "optional": true - }, - { - "name": "book_value", - "type": "float", - "description": "Book value per share.", - "default": null, - "optional": true - }, - { - "name": "price_to_book", - "type": "float", - "description": "Price-to-book ratio.", - "default": null, - "optional": true - }, - { - "name": "enterprise_value", - "type": "int", - "description": "Enterprise value.", - "default": null, - "optional": true - }, - { - "name": "overall_risk", - "type": "float", - "description": "Overall risk score.", - "default": null, - "optional": true - }, - { - "name": "audit_risk", - "type": "float", - "description": "Audit risk score.", - "default": null, - "optional": true - }, - { - "name": "board_risk", - "type": "float", - "description": "Board risk score.", - "default": null, - "optional": true - }, - { - "name": "compensation_risk", - "type": "float", - "description": "Compensation risk score.", - "default": null, - "optional": true - }, - { - "name": "shareholder_rights_risk", - "type": "float", - "description": "Shareholder rights risk score.", - "default": null, - "optional": true - }, - { - "name": "beta", - "type": "float", - "description": "Beta relative to the broad market (5-year monthly).", - "default": null, - "optional": true - }, - { - "name": "price_return_1y", - "type": "float", - "description": "One-year price return, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "currency", - "type": "str", - "description": "Currency in which the data is presented.", - "default": null, - "optional": true - } - ] - }, - "model": "KeyMetrics" - }, - "/equity/fundamental/management": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get executive management team data for a given company.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.management(symbol='AAPL', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['fmp', 'yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [], - "yfinance": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[KeyExecutives]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "title", - "type": "str", - "description": "Designation of the key executive.", - "default": "", - "optional": false - }, - { - "name": "name", - "type": "str", - "description": "Name of the key executive.", - "default": "", - "optional": false - }, - { - "name": "pay", - "type": "int", - "description": "Pay of the key executive.", - "default": null, - "optional": true - }, - { - "name": "currency_pay", - "type": "str", - "description": "Currency of the pay.", - "default": null, - "optional": true - }, - { - "name": "gender", - "type": "str", - "description": "Gender of the key executive.", - "default": null, - "optional": true - }, - { - "name": "year_born", - "type": "int", - "description": "Birth year of the key executive.", - "default": null, - "optional": true - }, - { - "name": "title_since", - "type": "int", - "description": "Date the tile was held since.", - "default": null, - "optional": true - } - ], - "fmp": [], - "yfinance": [ - { - "name": "exercised_value", - "type": "int", - "description": "Value of shares exercised.", - "default": null, - "optional": true - }, - { - "name": "unexercised_value", - "type": "int", - "description": "Value of shares not exercised.", - "default": null, - "optional": true - } - ] - }, - "model": "KeyExecutives" - }, - "/equity/fundamental/management_compensation": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get executive management team compensation for a given company over time.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.management_compensation(symbol='AAPL', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [ - { - "name": "year", - "type": "int", - "description": "Year of the compensation.", - "default": null, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[ExecutiveCompensation]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "cik", - "type": "str", - "description": "Central Index Key (CIK) for the requested entity.", - "default": null, - "optional": true - }, - { - "name": "company_name", - "type": "str", - "description": "The name of the company.", - "default": null, - "optional": true - }, - { - "name": "industry", - "type": "str", - "description": "The industry of the company.", - "default": null, - "optional": true - }, - { - "name": "year", - "type": "int", - "description": "Year of the compensation.", - "default": null, - "optional": true - }, - { - "name": "name_and_position", - "type": "str", - "description": "Name and position.", - "default": null, - "optional": true - }, - { - "name": "salary", - "type": "Annotated[float, Ge(ge=0)]", - "description": "Salary.", - "default": null, - "optional": true - }, - { - "name": "bonus", - "type": "Annotated[float, Ge(ge=0)]", - "description": "Bonus payments.", - "default": null, - "optional": true - }, - { - "name": "stock_award", - "type": "Annotated[float, Ge(ge=0)]", - "description": "Stock awards.", - "default": null, - "optional": true - }, - { - "name": "incentive_plan_compensation", - "type": "Annotated[float, Ge(ge=0)]", - "description": "Incentive plan compensation.", - "default": null, - "optional": true - }, - { - "name": "all_other_compensation", - "type": "Annotated[float, Ge(ge=0)]", - "description": "All other compensation.", - "default": null, - "optional": true - }, - { - "name": "total", - "type": "Annotated[float, Ge(ge=0)]", - "description": "Total compensation.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "filing_date", - "type": "date", - "description": "Date of the filing.", - "default": null, - "optional": true - }, - { - "name": "accepted_date", - "type": "datetime", - "description": "Date the filing was accepted.", - "default": null, - "optional": true - }, - { - "name": "url", - "type": "str", - "description": "URL to the filing data.", - "default": null, - "optional": true - } - ] - }, - "model": "ExecutiveCompensation" - }, - "/equity/fundamental/overview": { - "deprecated": { - "flag": true, - "message": "This endpoint is deprecated; use `/equity/profile` instead. Deprecated in OpenBB Platform V4.1 to be removed in V4.3." - }, - "description": "Get company general business and stock data for a given company.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.overview(symbol='AAPL', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[CompanyOverview]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "price", - "type": "float", - "description": "Price of the company.", - "default": null, - "optional": true - }, - { - "name": "beta", - "type": "float", - "description": "Beta of the company.", - "default": null, - "optional": true - }, - { - "name": "vol_avg", - "type": "int", - "description": "Volume average of the company.", - "default": null, - "optional": true - }, - { - "name": "mkt_cap", - "type": "int", - "description": "Market capitalization of the company.", - "default": null, - "optional": true - }, - { - "name": "last_div", - "type": "float", - "description": "Last dividend of the company.", - "default": null, - "optional": true - }, - { - "name": "range", - "type": "str", - "description": "Range of the company.", - "default": null, - "optional": true - }, - { - "name": "changes", - "type": "float", - "description": "Changes of the company.", - "default": null, - "optional": true - }, - { - "name": "company_name", - "type": "str", - "description": "Company name of the company.", - "default": null, - "optional": true - }, - { - "name": "currency", - "type": "str", - "description": "Currency of the company.", - "default": null, - "optional": true - }, - { - "name": "cik", - "type": "str", - "description": "Central Index Key (CIK) for the requested entity.", - "default": null, - "optional": true - }, - { - "name": "isin", - "type": "str", - "description": "ISIN of the company.", - "default": null, - "optional": true - }, - { - "name": "cusip", - "type": "str", - "description": "CUSIP of the company.", - "default": null, - "optional": true - }, - { - "name": "exchange", - "type": "str", - "description": "Exchange of the company.", - "default": null, - "optional": true - }, - { - "name": "exchange_short_name", - "type": "str", - "description": "Exchange short name of the company.", - "default": null, - "optional": true - }, - { - "name": "industry", - "type": "str", - "description": "Industry of the company.", - "default": null, - "optional": true - }, - { - "name": "website", - "type": "str", - "description": "Website of the company.", - "default": null, - "optional": true - }, - { - "name": "description", - "type": "str", - "description": "Description of the company.", - "default": null, - "optional": true - }, - { - "name": "ceo", - "type": "str", - "description": "CEO of the company.", - "default": null, - "optional": true - }, - { - "name": "sector", - "type": "str", - "description": "Sector of the company.", - "default": null, - "optional": true - }, - { - "name": "country", - "type": "str", - "description": "Country of the company.", - "default": null, - "optional": true - }, - { - "name": "full_time_employees", - "type": "str", - "description": "Full time employees of the company.", - "default": null, - "optional": true - }, - { - "name": "phone", - "type": "str", - "description": "Phone of the company.", - "default": null, - "optional": true - }, - { - "name": "address", - "type": "str", - "description": "Address of the company.", - "default": null, - "optional": true - }, - { - "name": "city", - "type": "str", - "description": "City of the company.", - "default": null, - "optional": true - }, - { - "name": "state", - "type": "str", - "description": "State of the company.", - "default": null, - "optional": true - }, - { - "name": "zip", - "type": "str", - "description": "Zip of the company.", - "default": null, - "optional": true - }, - { - "name": "dcf_diff", - "type": "float", - "description": "Discounted cash flow difference of the company.", - "default": null, - "optional": true - }, - { - "name": "dcf", - "type": "float", - "description": "Discounted cash flow of the company.", - "default": null, - "optional": true - }, - { - "name": "image", - "type": "str", - "description": "Image of the company.", - "default": null, - "optional": true - }, - { - "name": "ipo_date", - "type": "date", - "description": "IPO date of the company.", - "default": null, - "optional": true - }, - { - "name": "default_image", - "type": "bool", - "description": "If the image is the default image.", - "default": "", - "optional": false - }, - { - "name": "is_etf", - "type": "bool", - "description": "If the company is an ETF.", - "default": "", - "optional": false - }, - { - "name": "is_actively_trading", - "type": "bool", - "description": "If the company is actively trading.", - "default": "", - "optional": false - }, - { - "name": "is_adr", - "type": "bool", - "description": "If the company is an ADR.", - "default": "", - "optional": false - }, - { - "name": "is_fund", - "type": "bool", - "description": "If the company is a fund.", - "default": "", - "optional": false - } - ], - "fmp": [] - }, - "model": "CompanyOverview" - }, - "/equity/fundamental/ratios": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get an extensive set of financial and accounting ratios for a given company over time.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.ratios(symbol='AAPL', provider='fmp')\nobb.equity.fundamental.ratios(symbol='AAPL', period='annual', limit=12, provider='intrinio')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "period", - "type": "str", - "description": "Time period of the data to return.", - "default": "annual", - "optional": true - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": 12, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp', 'intrinio']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [], - "intrinio": [ - { - "name": "fiscal_year", - "type": "int", - "description": "The specific fiscal year. Reports do not go beyond 2008.", - "default": null, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[FinancialRatios]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'intrinio']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "period_ending", - "type": "str", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "fiscal_period", - "type": "str", - "description": "Period of the financial ratios.", - "default": "", - "optional": false - }, - { - "name": "fiscal_year", - "type": "int", - "description": "Fiscal year.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "current_ratio", - "type": "float", - "description": "Current ratio.", - "default": null, - "optional": true - }, - { - "name": "quick_ratio", - "type": "float", - "description": "Quick ratio.", - "default": null, - "optional": true - }, - { - "name": "cash_ratio", - "type": "float", - "description": "Cash ratio.", - "default": null, - "optional": true - }, - { - "name": "days_of_sales_outstanding", - "type": "float", - "description": "Days of sales outstanding.", - "default": null, - "optional": true - }, - { - "name": "days_of_inventory_outstanding", - "type": "float", - "description": "Days of inventory outstanding.", - "default": null, - "optional": true - }, - { - "name": "operating_cycle", - "type": "float", - "description": "Operating cycle.", - "default": null, - "optional": true - }, - { - "name": "days_of_payables_outstanding", - "type": "float", - "description": "Days of payables outstanding.", - "default": null, - "optional": true - }, - { - "name": "cash_conversion_cycle", - "type": "float", - "description": "Cash conversion cycle.", - "default": null, - "optional": true - }, - { - "name": "gross_profit_margin", - "type": "float", - "description": "Gross profit margin.", - "default": null, - "optional": true - }, - { - "name": "operating_profit_margin", - "type": "float", - "description": "Operating profit margin.", - "default": null, - "optional": true - }, - { - "name": "pretax_profit_margin", - "type": "float", - "description": "Pretax profit margin.", - "default": null, - "optional": true - }, - { - "name": "net_profit_margin", - "type": "float", - "description": "Net profit margin.", - "default": null, - "optional": true - }, - { - "name": "effective_tax_rate", - "type": "float", - "description": "Effective tax rate.", - "default": null, - "optional": true - }, - { - "name": "return_on_assets", - "type": "float", - "description": "Return on assets.", - "default": null, - "optional": true - }, - { - "name": "return_on_equity", - "type": "float", - "description": "Return on equity.", - "default": null, - "optional": true - }, - { - "name": "return_on_capital_employed", - "type": "float", - "description": "Return on capital employed.", - "default": null, - "optional": true - }, - { - "name": "net_income_per_ebt", - "type": "float", - "description": "Net income per EBT.", - "default": null, - "optional": true - }, - { - "name": "ebt_per_ebit", - "type": "float", - "description": "EBT per EBIT.", - "default": null, - "optional": true - }, - { - "name": "ebit_per_revenue", - "type": "float", - "description": "EBIT per revenue.", - "default": null, - "optional": true - }, - { - "name": "debt_ratio", - "type": "float", - "description": "Debt ratio.", - "default": null, - "optional": true - }, - { - "name": "debt_equity_ratio", - "type": "float", - "description": "Debt equity ratio.", - "default": null, - "optional": true - }, - { - "name": "long_term_debt_to_capitalization", - "type": "float", - "description": "Long term debt to capitalization.", - "default": null, - "optional": true - }, - { - "name": "total_debt_to_capitalization", - "type": "float", - "description": "Total debt to capitalization.", - "default": null, - "optional": true - }, - { - "name": "interest_coverage", - "type": "float", - "description": "Interest coverage.", - "default": null, - "optional": true - }, - { - "name": "cash_flow_to_debt_ratio", - "type": "float", - "description": "Cash flow to debt ratio.", - "default": null, - "optional": true - }, - { - "name": "company_equity_multiplier", - "type": "float", - "description": "Company equity multiplier.", - "default": null, - "optional": true - }, - { - "name": "receivables_turnover", - "type": "float", - "description": "Receivables turnover.", - "default": null, - "optional": true - }, - { - "name": "payables_turnover", - "type": "float", - "description": "Payables turnover.", - "default": null, - "optional": true - }, - { - "name": "inventory_turnover", - "type": "float", - "description": "Inventory turnover.", - "default": null, - "optional": true - }, - { - "name": "fixed_asset_turnover", - "type": "float", - "description": "Fixed asset turnover.", - "default": null, - "optional": true - }, - { - "name": "asset_turnover", - "type": "float", - "description": "Asset turnover.", - "default": null, - "optional": true - }, - { - "name": "operating_cash_flow_per_share", - "type": "float", - "description": "Operating cash flow per share.", - "default": null, - "optional": true - }, - { - "name": "free_cash_flow_per_share", - "type": "float", - "description": "Free cash flow per share.", - "default": null, - "optional": true - }, - { - "name": "cash_per_share", - "type": "float", - "description": "Cash per share.", - "default": null, - "optional": true - }, - { - "name": "payout_ratio", - "type": "float", - "description": "Payout ratio.", - "default": null, - "optional": true - }, - { - "name": "operating_cash_flow_sales_ratio", - "type": "float", - "description": "Operating cash flow sales ratio.", - "default": null, - "optional": true - }, - { - "name": "free_cash_flow_operating_cash_flow_ratio", - "type": "float", - "description": "Free cash flow operating cash flow ratio.", - "default": null, - "optional": true - }, - { - "name": "cash_flow_coverage_ratios", - "type": "float", - "description": "Cash flow coverage ratios.", - "default": null, - "optional": true - }, - { - "name": "short_term_coverage_ratios", - "type": "float", - "description": "Short term coverage ratios.", - "default": null, - "optional": true - }, - { - "name": "capital_expenditure_coverage_ratio", - "type": "float", - "description": "Capital expenditure coverage ratio.", - "default": null, - "optional": true - }, - { - "name": "dividend_paid_and_capex_coverage_ratio", - "type": "float", - "description": "Dividend paid and capex coverage ratio.", - "default": null, - "optional": true - }, - { - "name": "dividend_payout_ratio", - "type": "float", - "description": "Dividend payout ratio.", - "default": null, - "optional": true - }, - { - "name": "price_book_value_ratio", - "type": "float", - "description": "Price book value ratio.", - "default": null, - "optional": true - }, - { - "name": "price_to_book_ratio", - "type": "float", - "description": "Price to book ratio.", - "default": null, - "optional": true - }, - { - "name": "price_to_sales_ratio", - "type": "float", - "description": "Price to sales ratio.", - "default": null, - "optional": true - }, - { - "name": "price_earnings_ratio", - "type": "float", - "description": "Price earnings ratio.", - "default": null, - "optional": true - }, - { - "name": "price_to_free_cash_flows_ratio", - "type": "float", - "description": "Price to free cash flows ratio.", - "default": null, - "optional": true - }, - { - "name": "price_to_operating_cash_flows_ratio", - "type": "float", - "description": "Price to operating cash flows ratio.", - "default": null, - "optional": true - }, - { - "name": "price_cash_flow_ratio", - "type": "float", - "description": "Price cash flow ratio.", - "default": null, - "optional": true - }, - { - "name": "price_earnings_to_growth_ratio", - "type": "float", - "description": "Price earnings to growth ratio.", - "default": null, - "optional": true - }, - { - "name": "price_sales_ratio", - "type": "float", - "description": "Price sales ratio.", - "default": null, - "optional": true - }, - { - "name": "dividend_yield", - "type": "float", - "description": "Dividend yield.", - "default": null, - "optional": true - }, - { - "name": "dividend_yield_percentage", - "type": "float", - "description": "Dividend yield percentage.", - "default": null, - "optional": true - }, - { - "name": "dividend_per_share", - "type": "float", - "description": "Dividend per share.", - "default": null, - "optional": true - }, - { - "name": "enterprise_value_multiple", - "type": "float", - "description": "Enterprise value multiple.", - "default": null, - "optional": true - }, - { - "name": "price_fair_value", - "type": "float", - "description": "Price fair value.", - "default": null, - "optional": true - } - ], - "intrinio": [] - }, - "model": "FinancialRatios" - }, - "/equity/fundamental/revenue_per_geography": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get the revenue geographic breakdown for a given company over time.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.revenue_per_geography(symbol='AAPL', provider='fmp')\nobb.equity.fundamental.revenue_per_geography(symbol='AAPL', period='annual', structure='flat', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "period", - "type": "Literal['quarter', 'annual']", - "description": "Time period of the data to return.", - "default": "annual", - "optional": true - }, - { - "name": "structure", - "type": "Literal['hierarchical', 'flat']", - "description": "Structure of the returned data.", - "default": "flat", - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[RevenueGeographic]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "period_ending", - "type": "date", - "description": "The end date of the reporting period.", - "default": "", - "optional": false - }, - { - "name": "fiscal_period", - "type": "str", - "description": "The fiscal period of the reporting period.", - "default": null, - "optional": true - }, - { - "name": "fiscal_year", - "type": "int", - "description": "The fiscal year of the reporting period.", - "default": null, - "optional": true - }, - { - "name": "filing_date", - "type": "date", - "description": "The filing date of the report.", - "default": null, - "optional": true - }, - { - "name": "geographic_segment", - "type": "int", - "description": "Dictionary of the revenue by geographic segment.", - "default": "", - "optional": false - } - ], - "fmp": [] - }, - "model": "RevenueGeographic" - }, - "/equity/fundamental/revenue_per_segment": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get the revenue breakdown by business segment for a given company over time.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.revenue_per_segment(symbol='AAPL', provider='fmp')\nobb.equity.fundamental.revenue_per_segment(symbol='AAPL', period='annual', structure='flat', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "period", - "type": "Literal['quarter', 'annual']", - "description": "Time period of the data to return.", - "default": "annual", - "optional": true - }, - { - "name": "structure", - "type": "Literal['hierarchical', 'flat']", - "description": "Structure of the returned data.", - "default": "flat", - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[RevenueBusinessLine]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "period_ending", - "type": "date", - "description": "The end date of the reporting period.", - "default": "", - "optional": false - }, - { - "name": "fiscal_period", - "type": "str", - "description": "The fiscal period of the reporting period.", - "default": null, - "optional": true - }, - { - "name": "fiscal_year", - "type": "int", - "description": "The fiscal year of the reporting period.", - "default": null, - "optional": true - }, - { - "name": "filing_date", - "type": "date", - "description": "The filing date of the report.", - "default": null, - "optional": true - }, - { - "name": "business_line", - "type": "int", - "description": "Dictionary containing the revenue of the business line.", - "default": "", - "optional": false - } - ], - "fmp": [] - }, - "model": "RevenueBusinessLine" - }, - "/equity/fundamental/filings": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get the URLs to SEC filings reported to EDGAR database, such as 10-K, 10-Q, 8-K, and more. SEC\nfilings include Form 10-K, Form 10-Q, Form 8-K, the proxy statement, Forms 3, 4, and 5, Schedule 13, Form 114,\nForeign Investment Disclosures and others. The annual 10-K report is required to be\nfiled annually and includes the company's financial statements, management discussion and analysis,\nand audited financial statements.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.filings(provider='fmp')\nobb.equity.fundamental.filings(limit=100, provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": null, - "optional": true - }, - { - "name": "form_type", - "type": "str", - "description": "Filter by form type. Check the data provider for available types.", - "default": null, - "optional": true - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": 100, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp', 'intrinio', 'sec']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [], - "intrinio": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "thea_enabled", - "type": "bool", - "description": "Return filings that have been read by Intrinio's Thea NLP.", - "default": null, - "optional": true - } - ], - "sec": [ - { - "name": "cik", - "type": "Union[int, str]", - "description": "Lookup filings by Central Index Key (CIK) instead of by symbol.", - "default": null, - "optional": true - }, - { - "name": "type", - "type": "Literal['1', '1-A', '1-A POS', '1-A-W', '1-E', '1-E AD', '1-K', '1-SA', '1-U', '1-Z', '1-Z-W', '10-12B', '10-12G', '10-D', '10-K', '10-KT', '10-Q', '10-QT', '11-K', '11-KT', '13F-HR', '13F-NT', '13FCONP', '144', '15-12B', '15-12G', '15-15D', '15F-12B', '15F-12G', '15F-15D', '18-12B', '18-K', '19B-4E', '2-A', '2-AF', '2-E', '20-F', '20FR12B', '20FR12G', '24F-2NT', '25', '25-NSE', '253G1', '253G2', '253G3', '253G4', '3', '305B2', '34-12H', '4', '40-17F1', '40-17F2', '40-17G', '40-17GCS', '40-202A', '40-203A', '40-206A', '40-24B2', '40-33', '40-6B', '40-8B25', '40-8F-2', '40-APP', '40-F', '40-OIP', '40FR12B', '40FR12G', '424A', '424B1', '424B2', '424B3', '424B4', '424B5', '424B7', '424B8', '424H', '425', '485APOS', '485BPOS', '485BXT', '486APOS', '486BPOS', '486BXT', '487', '497', '497AD', '497H2', '497J', '497K', '497VPI', '497VPU', '5', '6-K', '6B NTC', '6B ORDR', '8-A12B', '8-A12G', '8-K', '8-K12B', '8-K12G3', '8-K15D5', '8-M', '8F-2 NTC', '8F-2 ORDR', '9-M', 'ABS-15G', 'ABS-EE', 'ADN-MTL', 'ADV-E', 'ADV-H-C', 'ADV-H-T', 'ADV-NR', 'ANNLRPT', 'APP NTC', 'APP ORDR', 'APP WD', 'APP WDG', 'ARS', 'ATS-N', 'ATS-N-C', 'ATS-N/UA', 'AW', 'AW WD', 'C', 'C-AR', 'C-AR-W', 'C-TR', 'C-TR-W', 'C-U', 'C-U-W', 'C-W', 'CB', 'CERT', 'CERTARCA', 'CERTBATS', 'CERTCBO', 'CERTNAS', 'CERTNYS', 'CERTPAC', 'CFPORTAL', 'CFPORTAL-W', 'CORRESP', 'CT ORDER', 'D', 'DEF 14A', 'DEF 14C', 'DEFA14A', 'DEFA14C', 'DEFC14A', 'DEFC14C', 'DEFM14A', 'DEFM14C', 'DEFN14A', 'DEFR14A', 'DEFR14C', 'DEL AM', 'DFAN14A', 'DFRN14A', 'DOS', 'DOSLTR', 'DRS', 'DRSLTR', 'DSTRBRPT', 'EFFECT', 'F-1', 'F-10', 'F-10EF', 'F-10POS', 'F-1MEF', 'F-3', 'F-3ASR', 'F-3D', 'F-3DPOS', 'F-3MEF', 'F-4', 'F-4 POS', 'F-4MEF', 'F-6', 'F-6 POS', 'F-6EF', 'F-7', 'F-7 POS', 'F-8', 'F-8 POS', 'F-80', 'F-80POS', 'F-9', 'F-9 POS', 'F-N', 'F-X', 'FOCUSN', 'FWP', 'G-405', 'G-405N', 'G-FIN', 'G-FINW', 'IRANNOTICE', 'MA', 'MA-A', 'MA-I', 'MA-W', 'MSD', 'MSDCO', 'MSDW', 'N-1', 'N-14', 'N-14 8C', 'N-14MEF', 'N-18F1', 'N-1A', 'N-2', 'N-2 POSASR', 'N-23C-2', 'N-23C3A', 'N-23C3B', 'N-23C3C', 'N-2ASR', 'N-2MEF', 'N-30B-2', 'N-30D', 'N-4', 'N-5', 'N-54A', 'N-54C', 'N-6', 'N-6F', 'N-8A', 'N-8B-2', 'N-8F', 'N-8F NTC', 'N-8F ORDR', 'N-CEN', 'N-CR', 'N-CSR', 'N-CSRS', 'N-MFP', 'N-MFP1', 'N-MFP2', 'N-PX', 'N-Q', 'N-VP', 'N-VPFS', 'NO ACT', 'NPORT-EX', 'NPORT-NP', 'NPORT-P', 'NRSRO-CE', 'NRSRO-UPD', 'NSAR-A', 'NSAR-AT', 'NSAR-B', 'NSAR-BT', 'NSAR-U', 'NT 10-D', 'NT 10-K', 'NT 10-Q', 'NT 11-K', 'NT 20-F', 'NT N-CEN', 'NT N-MFP', 'NT N-MFP1', 'NT N-MFP2', 'NT NPORT-EX', 'NT NPORT-P', 'NT-NCEN', 'NT-NCSR', 'NT-NSAR', 'NTFNCEN', 'NTFNCSR', 'NTFNSAR', 'NTN 10D', 'NTN 10K', 'NTN 10Q', 'NTN 20F', 'OIP NTC', 'OIP ORDR', 'POS 8C', 'POS AM', 'POS AMI', 'POS EX', 'POS462B', 'POS462C', 'POSASR', 'PRE 14A', 'PRE 14C', 'PREC14A', 'PREC14C', 'PREM14A', 'PREM14C', 'PREN14A', 'PRER14A', 'PRER14C', 'PRRN14A', 'PX14A6G', 'PX14A6N', 'QRTLYRPT', 'QUALIF', 'REG-NR', 'REVOKED', 'RW', 'RW WD', 'S-1', 'S-11', 'S-11MEF', 'S-1MEF', 'S-20', 'S-3', 'S-3ASR', 'S-3D', 'S-3DPOS', 'S-3MEF', 'S-4', 'S-4 POS', 'S-4EF', 'S-4MEF', 'S-6', 'S-8', 'S-8 POS', 'S-B', 'S-BMEF', 'SBSE', 'SBSE-A', 'SBSE-BD', 'SBSE-C', 'SBSE-W', 'SC 13D', 'SC 13E1', 'SC 13E3', 'SC 13G', 'SC 14D9', 'SC 14F1', 'SC 14N', 'SC TO-C', 'SC TO-I', 'SC TO-T', 'SC13E4F', 'SC14D1F', 'SC14D9C', 'SC14D9F', 'SD', 'SDR', 'SE', 'SEC ACTION', 'SEC STAFF ACTION', 'SEC STAFF LETTER', 'SF-1', 'SF-3', 'SL', 'SP 15D2', 'STOP ORDER', 'SUPPL', 'T-3', 'TA-1', 'TA-2', 'TA-W', 'TACO', 'TH', 'TTW', 'UNDER', 'UPLOAD', 'WDL-REQ', 'X-17A-5']", - "description": "Type of the SEC filing form.", - "default": null, - "optional": true - }, - { - "name": "use_cache", - "type": "bool", - "description": "Whether or not to use cache. If True, cache will store for one day.", - "default": true, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[CompanyFilings]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'intrinio', 'sec']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "filing_date", - "type": "date", - "description": "The date of the filing.", - "default": "", - "optional": false - }, - { - "name": "accepted_date", - "type": "datetime", - "description": "Accepted date of the filing.", - "default": null, - "optional": true - }, - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": null, - "optional": true - }, - { - "name": "cik", - "type": "str", - "description": "Central Index Key (CIK) for the requested entity.", - "default": null, - "optional": true - }, - { - "name": "report_type", - "type": "str", - "description": "Type of filing.", - "default": null, - "optional": true - }, - { - "name": "filing_url", - "type": "str", - "description": "URL to the filing page.", - "default": null, - "optional": true - }, - { - "name": "report_url", - "type": "str", - "description": "URL to the actual report.", - "default": "", - "optional": false - } - ], - "fmp": [], - "intrinio": [ - { - "name": "id", - "type": "str", - "description": "Intrinio ID of the filing.", - "default": "", - "optional": false - }, - { - "name": "period_end_date", - "type": "date", - "description": "Ending date of the fiscal period for the filing.", - "default": null, - "optional": true - }, - { - "name": "sec_unique_id", - "type": "str", - "description": "SEC unique ID of the filing.", - "default": "", - "optional": false - }, - { - "name": "instance_url", - "type": "str", - "description": "URL for the XBRL filing for the report.", - "default": null, - "optional": true - }, - { - "name": "industry_group", - "type": "str", - "description": "Industry group of the company.", - "default": "", - "optional": false - }, - { - "name": "industry_category", - "type": "str", - "description": "Industry category of the company.", - "default": "", - "optional": false - } - ], - "sec": [ - { - "name": "report_date", - "type": "date", - "description": "The date of the filing.", - "default": null, - "optional": true - }, - { - "name": "act", - "type": "Union[int, str]", - "description": "The SEC Act number.", - "default": null, - "optional": true - }, - { - "name": "items", - "type": "Union[str, float]", - "description": "The SEC Item numbers.", - "default": null, - "optional": true - }, - { - "name": "primary_doc_description", - "type": "str", - "description": "The description of the primary document.", - "default": null, - "optional": true - }, - { - "name": "primary_doc", - "type": "str", - "description": "The filename of the primary document.", - "default": null, - "optional": true - }, - { - "name": "accession_number", - "type": "Union[int, str]", - "description": "The accession number.", - "default": null, - "optional": true - }, - { - "name": "file_number", - "type": "Union[int, str]", - "description": "The file number.", - "default": null, - "optional": true - }, - { - "name": "film_number", - "type": "Union[int, str]", - "description": "The film number.", - "default": null, - "optional": true - }, - { - "name": "is_inline_xbrl", - "type": "Union[int, str]", - "description": "Whether the filing is an inline XBRL filing.", - "default": null, - "optional": true - }, - { - "name": "is_xbrl", - "type": "Union[int, str]", - "description": "Whether the filing is an XBRL filing.", - "default": null, - "optional": true - }, - { - "name": "size", - "type": "Union[int, str]", - "description": "The size of the filing.", - "default": null, - "optional": true - }, - { - "name": "complete_submission_url", - "type": "str", - "description": "The URL to the complete filing submission.", - "default": null, - "optional": true - }, - { - "name": "filing_detail_url", - "type": "str", - "description": "The URL to the filing details.", - "default": null, - "optional": true - } - ] - }, - "model": "CompanyFilings" - }, - "/equity/fundamental/historical_splits": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get historical stock splits for a given company.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.historical_splits(symbol='AAPL', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[HistoricalSplits]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "numerator", - "type": "float", - "description": "Numerator of the split.", - "default": null, - "optional": true - }, - { - "name": "denominator", - "type": "float", - "description": "Denominator of the split.", - "default": null, - "optional": true - }, - { - "name": "split_ratio", - "type": "str", - "description": "Split ratio.", - "default": null, - "optional": true - } - ], - "fmp": [] - }, - "model": "HistoricalSplits" - }, - "/equity/fundamental/transcript": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get earnings call transcripts for a given company.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.transcript(symbol='AAPL', year=2020, provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "year", - "type": "int", - "description": "Year of the earnings call transcript.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EarningsCallTranscript]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "quarter", - "type": "int", - "description": "Quarter of the earnings call transcript.", - "default": "", - "optional": false - }, - { - "name": "year", - "type": "int", - "description": "Year of the earnings call transcript.", - "default": "", - "optional": false - }, - { - "name": "date", - "type": "datetime", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "content", - "type": "str", - "description": "Content of the earnings call transcript.", - "default": "", - "optional": false - } - ], - "fmp": [] - }, - "model": "EarningsCallTranscript" - }, - "/equity/fundamental/trailing_dividend_yield": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get the 1 year trailing dividend yield for a given company over time.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.trailing_dividend_yield(symbol='AAPL', provider='tiingo')\nobb.equity.fundamental.trailing_dividend_yield(symbol='AAPL', limit=252, provider='tiingo')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return. Default is 252, the number of trading days in a year.", - "default": 252, - "optional": true - }, - { - "name": "provider", - "type": "Literal['tiingo']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'tiingo' if there is no default.", - "default": "tiingo", - "optional": true - } - ], - "tiingo": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[TrailingDividendYield]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['tiingo']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "trailing_dividend_yield", - "type": "float", - "description": "Trailing dividend yield.", - "default": "", - "optional": false - } - ], - "tiingo": [] - }, - "model": "TrailingDividendYield" - }, - "/equity/ownership/major_holders": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get data about major holders for a given company over time.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.ownership.major_holders(symbol='AAPL', provider='fmp')\nobb.equity.ownership.major_holders(symbol='AAPL', page=0, provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "date", - "type": "Union[date, str]", - "description": "A specific date to get data for.", - "default": null, - "optional": true - }, - { - "name": "page", - "type": "int", - "description": "Page number of the data to fetch.", - "default": 0, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EquityOwnership]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "cik", - "type": "int", - "description": "Central Index Key (CIK) for the requested entity.", - "default": "", - "optional": false - }, - { - "name": "filing_date", - "type": "date", - "description": "Filing date of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "investor_name", - "type": "str", - "description": "Investor name of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "security_name", - "type": "str", - "description": "Security name of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "type_of_security", - "type": "str", - "description": "Type of security of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "security_cusip", - "type": "str", - "description": "Security cusip of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "shares_type", - "type": "str", - "description": "Shares type of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "put_call_share", - "type": "str", - "description": "Put call share of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "investment_discretion", - "type": "str", - "description": "Investment discretion of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "industry_title", - "type": "str", - "description": "Industry title of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "weight", - "type": "float", - "description": "Weight of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "last_weight", - "type": "float", - "description": "Last weight of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "change_in_weight", - "type": "float", - "description": "Change in weight of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "change_in_weight_percentage", - "type": "float", - "description": "Change in weight percentage of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "market_value", - "type": "int", - "description": "Market value of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "last_market_value", - "type": "int", - "description": "Last market value of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "change_in_market_value", - "type": "int", - "description": "Change in market value of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "change_in_market_value_percentage", - "type": "float", - "description": "Change in market value percentage of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "shares_number", - "type": "int", - "description": "Shares number of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "last_shares_number", - "type": "int", - "description": "Last shares number of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "change_in_shares_number", - "type": "float", - "description": "Change in shares number of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "change_in_shares_number_percentage", - "type": "float", - "description": "Change in shares number percentage of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "quarter_end_price", - "type": "float", - "description": "Quarter end price of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "avg_price_paid", - "type": "float", - "description": "Average price paid of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "is_new", - "type": "bool", - "description": "Is the stock ownership new.", - "default": "", - "optional": false - }, - { - "name": "is_sold_out", - "type": "bool", - "description": "Is the stock ownership sold out.", - "default": "", - "optional": false - }, - { - "name": "ownership", - "type": "float", - "description": "How much is the ownership.", - "default": "", - "optional": false - }, - { - "name": "last_ownership", - "type": "float", - "description": "Last ownership amount.", - "default": "", - "optional": false - }, - { - "name": "change_in_ownership", - "type": "float", - "description": "Change in ownership amount.", - "default": "", - "optional": false - }, - { - "name": "change_in_ownership_percentage", - "type": "float", - "description": "Change in ownership percentage.", - "default": "", - "optional": false - }, - { - "name": "holding_period", - "type": "int", - "description": "Holding period of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "first_added", - "type": "date", - "description": "First added date of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "performance", - "type": "float", - "description": "Performance of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "performance_percentage", - "type": "float", - "description": "Performance percentage of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "last_performance", - "type": "float", - "description": "Last performance of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "change_in_performance", - "type": "float", - "description": "Change in performance of the stock ownership.", - "default": "", - "optional": false - }, - { - "name": "is_counted_for_performance", - "type": "bool", - "description": "Is the stock ownership counted for performance.", - "default": "", - "optional": false - } - ], - "fmp": [] - }, - "model": "EquityOwnership" - }, - "/equity/ownership/institutional": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get data about institutional ownership for a given company over time.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.ownership.institutional(symbol='AAPL', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [ - { - "name": "include_current_quarter", - "type": "bool", - "description": "Include current quarter data.", - "default": false, - "optional": true - }, - { - "name": "date", - "type": "Union[date, str]", - "description": "A specific date to get data for.", - "default": null, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[InstitutionalOwnership]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "cik", - "type": "str", - "description": "Central Index Key (CIK) for the requested entity.", - "default": null, - "optional": true - }, - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - } - ], - "fmp": [ - { - "name": "investors_holding", - "type": "int", - "description": "Number of investors holding the stock.", - "default": "", - "optional": false - }, - { - "name": "last_investors_holding", - "type": "int", - "description": "Number of investors holding the stock in the last quarter.", - "default": "", - "optional": false - }, - { - "name": "investors_holding_change", - "type": "int", - "description": "Change in the number of investors holding the stock.", - "default": "", - "optional": false - }, - { - "name": "number_of_13f_shares", - "type": "int", - "description": "Number of 13F shares.", - "default": null, - "optional": true - }, - { - "name": "last_number_of_13f_shares", - "type": "int", - "description": "Number of 13F shares in the last quarter.", - "default": null, - "optional": true - }, - { - "name": "number_of_13f_shares_change", - "type": "int", - "description": "Change in the number of 13F shares.", - "default": null, - "optional": true - }, - { - "name": "total_invested", - "type": "float", - "description": "Total amount invested.", - "default": "", - "optional": false - }, - { - "name": "last_total_invested", - "type": "float", - "description": "Total amount invested in the last quarter.", - "default": "", - "optional": false - }, - { - "name": "total_invested_change", - "type": "float", - "description": "Change in the total amount invested.", - "default": "", - "optional": false - }, - { - "name": "ownership_percent", - "type": "float", - "description": "Ownership percent.", - "default": "", - "optional": false - }, - { - "name": "last_ownership_percent", - "type": "float", - "description": "Ownership percent in the last quarter.", - "default": "", - "optional": false - }, - { - "name": "ownership_percent_change", - "type": "float", - "description": "Change in the ownership percent.", - "default": "", - "optional": false - }, - { - "name": "new_positions", - "type": "int", - "description": "Number of new positions.", - "default": "", - "optional": false - }, - { - "name": "last_new_positions", - "type": "int", - "description": "Number of new positions in the last quarter.", - "default": "", - "optional": false - }, - { - "name": "new_positions_change", - "type": "int", - "description": "Change in the number of new positions.", - "default": "", - "optional": false - }, - { - "name": "increased_positions", - "type": "int", - "description": "Number of increased positions.", - "default": "", - "optional": false - }, - { - "name": "last_increased_positions", - "type": "int", - "description": "Number of increased positions in the last quarter.", - "default": "", - "optional": false - }, - { - "name": "increased_positions_change", - "type": "int", - "description": "Change in the number of increased positions.", - "default": "", - "optional": false - }, - { - "name": "closed_positions", - "type": "int", - "description": "Number of closed positions.", - "default": "", - "optional": false - }, - { - "name": "last_closed_positions", - "type": "int", - "description": "Number of closed positions in the last quarter.", - "default": "", - "optional": false - }, - { - "name": "closed_positions_change", - "type": "int", - "description": "Change in the number of closed positions.", - "default": "", - "optional": false - }, - { - "name": "reduced_positions", - "type": "int", - "description": "Number of reduced positions.", - "default": "", - "optional": false - }, - { - "name": "last_reduced_positions", - "type": "int", - "description": "Number of reduced positions in the last quarter.", - "default": "", - "optional": false - }, - { - "name": "reduced_positions_change", - "type": "int", - "description": "Change in the number of reduced positions.", - "default": "", - "optional": false - }, - { - "name": "total_calls", - "type": "int", - "description": "Total number of call options contracts traded for Apple Inc. on the specified date.", - "default": "", - "optional": false - }, - { - "name": "last_total_calls", - "type": "int", - "description": "Total number of call options contracts traded for Apple Inc. on the previous reporting date.", - "default": "", - "optional": false - }, - { - "name": "total_calls_change", - "type": "int", - "description": "Change in the total number of call options contracts traded between the current and previous reporting dates.", - "default": "", - "optional": false - }, - { - "name": "total_puts", - "type": "int", - "description": "Total number of put options contracts traded for Apple Inc. on the specified date.", - "default": "", - "optional": false - }, - { - "name": "last_total_puts", - "type": "int", - "description": "Total number of put options contracts traded for Apple Inc. on the previous reporting date.", - "default": "", - "optional": false - }, - { - "name": "total_puts_change", - "type": "int", - "description": "Change in the total number of put options contracts traded between the current and previous reporting dates.", - "default": "", - "optional": false - }, - { - "name": "put_call_ratio", - "type": "float", - "description": "Put-call ratio, which is the ratio of the total number of put options to call options traded on the specified date.", - "default": "", - "optional": false - }, - { - "name": "last_put_call_ratio", - "type": "float", - "description": "Put-call ratio on the previous reporting date.", - "default": "", - "optional": false - }, - { - "name": "put_call_ratio_change", - "type": "float", - "description": "Change in the put-call ratio between the current and previous reporting dates.", - "default": "", - "optional": false - } - ] - }, - "model": "InstitutionalOwnership" - }, - "/equity/ownership/insider_trading": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get data about trading by a company's management team and board of directors.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.ownership.insider_trading(symbol='AAPL', provider='fmp')\nobb.equity.ownership.insider_trading(symbol='AAPL', limit=500, provider='intrinio')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": 500, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp', 'intrinio']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [ - { - "name": "transaction_type", - "type": "Literal[None, 'award', 'conversion', 'return', 'expire_short', 'in_kind', 'gift', 'expire_long', 'discretionary', 'other', 'small', 'exempt', 'otm', 'purchase', 'sale', 'tender', 'will', 'itm', 'trust']", - "description": "Type of the transaction.", - "default": null, - "optional": true - } - ], - "intrinio": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": "", - "optional": false - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": "", - "optional": false - }, - { - "name": "ownership_type", - "type": "Literal['D', 'I']", - "description": "Type of ownership.", - "default": null, - "optional": true - }, - { - "name": "sort_by", - "type": "Literal['filing_date', 'updated_on']", - "description": "Field to sort by.", - "default": "updated_on", - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[InsiderTrading]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'intrinio']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": null, - "optional": true - }, - { - "name": "company_cik", - "type": "Union[int, str]", - "description": "CIK number of the company.", - "default": null, - "optional": true - }, - { - "name": "filing_date", - "type": "Union[date, datetime]", - "description": "Filing date of the trade.", - "default": null, - "optional": true - }, - { - "name": "transaction_date", - "type": "date", - "description": "Date of the transaction.", - "default": null, - "optional": true - }, - { - "name": "owner_cik", - "type": "Union[int, str]", - "description": "Reporting individual's CIK.", - "default": null, - "optional": true - }, - { - "name": "owner_name", - "type": "str", - "description": "Name of the reporting individual.", - "default": null, - "optional": true - }, - { - "name": "owner_title", - "type": "str", - "description": "The title held by the reporting individual.", - "default": null, - "optional": true - }, - { - "name": "transaction_type", - "type": "str", - "description": "Type of transaction being reported.", - "default": null, - "optional": true - }, - { - "name": "acquisition_or_disposition", - "type": "str", - "description": "Acquisition or disposition of the shares.", - "default": null, - "optional": true - }, - { - "name": "security_type", - "type": "str", - "description": "The type of security transacted.", - "default": null, - "optional": true - }, - { - "name": "securities_owned", - "type": "float", - "description": "Number of securities owned by the reporting individual.", - "default": null, - "optional": true - }, - { - "name": "securities_transacted", - "type": "float", - "description": "Number of securities transacted by the reporting individual.", - "default": null, - "optional": true - }, - { - "name": "transaction_price", - "type": "float", - "description": "The price of the transaction.", - "default": null, - "optional": true - }, - { - "name": "filing_url", - "type": "str", - "description": "Link to the filing.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "form_type", - "type": "str", - "description": "Form type of the insider trading.", - "default": "", - "optional": false - } - ], - "intrinio": [ - { - "name": "company_name", - "type": "str", - "description": "Name of the company.", - "default": "", - "optional": false - }, - { - "name": "conversion_exercise_price", - "type": "float", - "description": "Conversion/Exercise price of the shares.", - "default": null, - "optional": true - }, - { - "name": "deemed_execution_date", - "type": "date", - "description": "Deemed execution date of the trade.", - "default": null, - "optional": true - }, - { - "name": "exercise_date", - "type": "date", - "description": "Exercise date of the trade.", - "default": null, - "optional": true - }, - { - "name": "expiration_date", - "type": "date", - "description": "Expiration date of the derivative.", - "default": null, - "optional": true - }, - { - "name": "underlying_security_title", - "type": "str", - "description": "Name of the underlying non-derivative security related to this derivative transaction.", - "default": null, - "optional": true - }, - { - "name": "underlying_shares", - "type": "Union[float, int]", - "description": "Number of underlying shares related to this derivative transaction.", - "default": null, - "optional": true - }, - { - "name": "nature_of_ownership", - "type": "str", - "description": "Nature of ownership of the insider trading.", - "default": null, - "optional": true - }, - { - "name": "director", - "type": "bool", - "description": "Whether the owner is a director.", - "default": null, - "optional": true - }, - { - "name": "officer", - "type": "bool", - "description": "Whether the owner is an officer.", - "default": null, - "optional": true - }, - { - "name": "ten_percent_owner", - "type": "bool", - "description": "Whether the owner is a 10% owner.", - "default": null, - "optional": true - }, - { - "name": "other_relation", - "type": "bool", - "description": "Whether the owner is having another relation.", - "default": null, - "optional": true - }, - { - "name": "derivative_transaction", - "type": "bool", - "description": "Whether the owner is having a derivative transaction.", - "default": null, - "optional": true - }, - { - "name": "report_line_number", - "type": "int", - "description": "Report line number of the insider trading.", - "default": null, - "optional": true - } - ] - }, - "model": "InsiderTrading" - }, - "/equity/ownership/share_statistics": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get data about share float for a given company.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.ownership.share_statistics(symbol='AAPL', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. Multiple items allowed for provider(s): yfinance.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['fmp', 'intrinio', 'yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [], - "intrinio": [], - "yfinance": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[ShareStatistics]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'intrinio', 'yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": null, - "optional": true - }, - { - "name": "free_float", - "type": "float", - "description": "Percentage of unrestricted shares of a publicly-traded company.", - "default": null, - "optional": true - }, - { - "name": "float_shares", - "type": "float", - "description": "Number of shares available for trading by the general public.", - "default": null, - "optional": true - }, - { - "name": "outstanding_shares", - "type": "float", - "description": "Total number of shares of a publicly-traded company.", - "default": null, - "optional": true - }, - { - "name": "source", - "type": "str", - "description": "Source of the received data.", - "default": null, - "optional": true - } - ], - "fmp": [], - "intrinio": [ - { - "name": "adjusted_outstanding_shares", - "type": "float", - "description": "Total number of shares of a publicly-traded company, adjusted for splits.", - "default": null, - "optional": true - }, - { - "name": "public_float", - "type": "float", - "description": "Aggregate market value of the shares of a publicly-traded company.", - "default": null, - "optional": true - } - ], - "yfinance": [ - { - "name": "implied_shares_outstanding", - "type": "int", - "description": "Implied Shares Outstanding of common equity, assuming the conversion of all convertible subsidiary equity into common.", - "default": null, - "optional": true - }, - { - "name": "short_interest", - "type": "int", - "description": "Number of shares that are reported short.", - "default": null, - "optional": true - }, - { - "name": "short_percent_of_float", - "type": "float", - "description": "Percentage of shares that are reported short, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "days_to_cover", - "type": "float", - "description": "Number of days to repurchase the shares as a ratio of average daily volume", - "default": null, - "optional": true - }, - { - "name": "short_interest_prev_month", - "type": "int", - "description": "Number of shares that were reported short in the previous month.", - "default": null, - "optional": true - }, - { - "name": "short_interest_prev_date", - "type": "date", - "description": "Date of the previous month's report.", - "default": null, - "optional": true - }, - { - "name": "insider_ownership", - "type": "float", - "description": "Percentage of shares held by insiders, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "institution_ownership", - "type": "float", - "description": "Percentage of shares held by institutions, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "institution_float_ownership", - "type": "float", - "description": "Percentage of float held by institutions, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "institutions_count", - "type": "int", - "description": "Number of institutions holding shares.", - "default": null, - "optional": true - } - ] - }, - "model": "ShareStatistics" - }, - "/equity/ownership/form_13f": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "The Securities and Exchange Commission's (SEC) Form 13F is a quarterly report\nthat is required to be filed by all institutional investment managers with at least\n$100 million in assets under management.\nManagers are required to file Form 13F within 45 days after the last day of the calendar quarter.\nMost funds wait until the end of this period in order to conceal\ntheir investment strategy from competitors and the public.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.ownership.form_13f(symbol='NVDA', provider='sec')\n# Enter a date (calendar quarter ending) for a specific report.\nobb.equity.ownership.form_13f(symbol='BRK-A', date='2016-09-30', provider='sec')\n# Example finding Michael Burry's filings.\ncik = obb.regulators.sec.institutions_search(\"Scion Asset Management\").results[0].cik\n# Use the `limit` parameter to return N number of reports from the most recent.\nobb.equity.ownership.form_13f(cik, limit=2).to_df()\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for. A CIK or Symbol can be used.", - "default": "", - "optional": false - }, - { - "name": "date", - "type": "Union[date, str]", - "description": "A specific date to get data for. The date represents the end of the reporting period. All form 13F-HR filings are based on the calendar year and are reported quarterly. If a date is not supplied, the most recent filing is returned. Submissions beginning 2013-06-30 are supported.", - "default": null, - "optional": true - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return. The number of previous filings to return. The date parameter takes priority over this parameter.", - "default": 1, - "optional": true - }, - { - "name": "provider", - "type": "Literal['sec']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'sec' if there is no default.", - "default": "sec", - "optional": true - } - ], - "sec": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[Form13FHR]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['sec']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "period_ending", - "type": "date", - "description": "The end-of-quarter date of the filing.", - "default": "", - "optional": false - }, - { - "name": "issuer", - "type": "str", - "description": "The name of the issuer.", - "default": "", - "optional": false - }, - { - "name": "cusip", - "type": "str", - "description": "The CUSIP of the security.", - "default": "", - "optional": false - }, - { - "name": "asset_class", - "type": "str", - "description": "The title of the asset class for the security.", - "default": "", - "optional": false - }, - { - "name": "security_type", - "type": "Literal['SH', 'PRN']", - "description": "The total number of shares of the class of security or the principal amount of such class. 'SH' for shares. 'PRN' for principal amount. Convertible debt securities are reported as 'PRN'.", - "default": null, - "optional": true - }, - { - "name": "option_type", - "type": "Literal['call', 'put']", - "description": "Defined when the holdings being reported are put or call options. Only long positions are reported.", - "default": null, - "optional": true - }, - { - "name": "voting_authority_sole", - "type": "int", - "description": "The number of shares for which the Manager exercises sole voting authority (none).", - "default": null, - "optional": true - }, - { - "name": "voting_authority_shared", - "type": "int", - "description": "The number of shares for which the Manager exercises a defined shared voting authority (none).", - "default": null, - "optional": true - }, - { - "name": "voting_authority_other", - "type": "int", - "description": "The number of shares for which the Manager exercises other shared voting authority (none).", - "default": null, - "optional": true - }, - { - "name": "principal_amount", - "type": "int", - "description": "The total number of shares of the class of security or the principal amount of such class. Only long positions are reported", - "default": "", - "optional": false - }, - { - "name": "value", - "type": "int", - "description": "The fair market value of the holding of the particular class of security. The value reported for options is the fair market value of the underlying security with respect to the number of shares controlled. Values are rounded to the nearest US dollar and use the closing price of the last trading day of the calendar year or quarter.", - "default": "", - "optional": false - } - ], - "sec": [ - { - "name": "weight", - "type": "float", - "description": "The weight of the security relative to the market value of all securities in the filing , as a normalized percent.", - "default": "", - "optional": false - } - ] - }, - "model": "Form13FHR" - }, - "/equity/price/quote": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get the latest quote for a given stock. Quote includes price, volume, and other data.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.price.quote(symbol='AAPL', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio, yfinance.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['fmp', 'intrinio', 'yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [], - "intrinio": [ - { - "name": "source", - "type": "Literal['iex', 'bats', 'bats_delayed', 'utp_delayed', 'cta_a_delayed', 'cta_b_delayed', 'intrinio_mx', 'intrinio_mx_plus', 'delayed_sip']", - "description": "Source of the data.", - "default": "iex", - "optional": true - } - ], - "yfinance": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EquityQuote]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'intrinio', 'yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "asset_type", - "type": "str", - "description": "Type of asset - i.e, stock, ETF, etc.", - "default": null, - "optional": true - }, - { - "name": "name", - "type": "str", - "description": "Name of the company or asset.", - "default": null, - "optional": true - }, - { - "name": "exchange", - "type": "str", - "description": "The name or symbol of the venue where the data is from.", - "default": null, - "optional": true - }, - { - "name": "bid", - "type": "float", - "description": "Price of the top bid order.", - "default": null, - "optional": true - }, - { - "name": "bid_size", - "type": "int", - "description": "This represents the number of round lot orders at the given price. The normal round lot size is 100 shares. A size of 2 means there are 200 shares available at the given price.", - "default": null, - "optional": true - }, - { - "name": "bid_exchange", - "type": "str", - "description": "The specific trading venue where the purchase order was placed.", - "default": null, - "optional": true - }, - { - "name": "ask", - "type": "float", - "description": "Price of the top ask order.", - "default": null, - "optional": true - }, - { - "name": "ask_size", - "type": "int", - "description": "This represents the number of round lot orders at the given price. The normal round lot size is 100 shares. A size of 2 means there are 200 shares available at the given price.", - "default": null, - "optional": true - }, - { - "name": "ask_exchange", - "type": "str", - "description": "The specific trading venue where the sale order was placed.", - "default": null, - "optional": true - }, - { - "name": "quote_conditions", - "type": "Union[str, int, List[str], List[int]]", - "description": "Conditions or condition codes applicable to the quote.", - "default": null, - "optional": true - }, - { - "name": "quote_indicators", - "type": "Union[str, int, List[str], List[int]]", - "description": "Indicators or indicator codes applicable to the participant quote related to the price bands for the issue, or the affect the quote has on the NBBO.", - "default": null, - "optional": true - }, - { - "name": "sales_conditions", - "type": "Union[str, int, List[str], List[int]]", - "description": "Conditions or condition codes applicable to the sale.", - "default": null, - "optional": true - }, - { - "name": "sequence_number", - "type": "int", - "description": "The sequence number represents the sequence in which message events happened. These are increasing and unique per ticker symbol, but will not always be sequential (e.g., 1, 2, 6, 9, 10, 11).", - "default": null, - "optional": true - }, - { - "name": "market_center", - "type": "str", - "description": "The ID of the UTP participant that originated the message.", - "default": null, - "optional": true - }, - { - "name": "participant_timestamp", - "type": "datetime", - "description": "Timestamp for when the quote was generated by the exchange.", - "default": null, - "optional": true - }, - { - "name": "trf_timestamp", - "type": "datetime", - "description": "Timestamp for when the TRF (Trade Reporting Facility) received the message.", - "default": null, - "optional": true - }, - { - "name": "sip_timestamp", - "type": "datetime", - "description": "Timestamp for when the SIP (Security Information Processor) received the message from the exchange.", - "default": null, - "optional": true - }, - { - "name": "last_price", - "type": "float", - "description": "Price of the last trade.", - "default": null, - "optional": true - }, - { - "name": "last_tick", - "type": "str", - "description": "Whether the last sale was an up or down tick.", - "default": null, - "optional": true - }, - { - "name": "last_size", - "type": "int", - "description": "Size of the last trade.", - "default": null, - "optional": true - }, - { - "name": "last_timestamp", - "type": "datetime", - "description": "Date and Time when the last price was recorded.", - "default": null, - "optional": true - }, - { - "name": "open", - "type": "float", - "description": "The open price.", - "default": null, - "optional": true - }, - { - "name": "high", - "type": "float", - "description": "The high price.", - "default": null, - "optional": true - }, - { - "name": "low", - "type": "float", - "description": "The low price.", - "default": null, - "optional": true - }, - { - "name": "close", - "type": "float", - "description": "The close price.", - "default": null, - "optional": true - }, - { - "name": "volume", - "type": "Union[float, int]", - "description": "The trading volume.", - "default": null, - "optional": true - }, - { - "name": "exchange_volume", - "type": "Union[float, int]", - "description": "Volume of shares exchanged during the trading day on the specific exchange.", - "default": null, - "optional": true - }, - { - "name": "prev_close", - "type": "float", - "description": "The previous close price.", - "default": null, - "optional": true - }, - { - "name": "change", - "type": "float", - "description": "Change in price from previous close.", - "default": null, - "optional": true - }, - { - "name": "change_percent", - "type": "float", - "description": "Change in price as a normalized percentage.", - "default": null, - "optional": true - }, - { - "name": "year_high", - "type": "float", - "description": "The one year high (52W High).", - "default": null, - "optional": true - }, - { - "name": "year_low", - "type": "float", - "description": "The one year low (52W Low).", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "price_avg50", - "type": "float", - "description": "50 day moving average price.", - "default": null, - "optional": true - }, - { - "name": "price_avg200", - "type": "float", - "description": "200 day moving average price.", - "default": null, - "optional": true - }, - { - "name": "avg_volume", - "type": "int", - "description": "Average volume over the last 10 trading days.", - "default": null, - "optional": true - }, - { - "name": "market_cap", - "type": "float", - "description": "Market cap of the company.", - "default": null, - "optional": true - }, - { - "name": "shares_outstanding", - "type": "int", - "description": "Number of shares outstanding.", - "default": null, - "optional": true - }, - { - "name": "eps", - "type": "float", - "description": "Earnings per share.", - "default": null, - "optional": true - }, - { - "name": "pe", - "type": "float", - "description": "Price earnings ratio.", - "default": null, - "optional": true - }, - { - "name": "earnings_announcement", - "type": "datetime", - "description": "Upcoming earnings announcement date.", - "default": null, - "optional": true - } - ], - "intrinio": [ - { - "name": "is_darkpool", - "type": "bool", - "description": "Whether or not the current trade is from a darkpool.", - "default": null, - "optional": true - }, - { - "name": "source", - "type": "str", - "description": "Source of the Intrinio data.", - "default": null, - "optional": true - }, - { - "name": "updated_on", - "type": "datetime", - "description": "Date and Time when the data was last updated.", - "default": "", - "optional": false - }, - { - "name": "security", - "type": "IntrinioSecurity", - "description": "Security details related to the quote.", - "default": null, - "optional": true - } - ], - "yfinance": [ - { - "name": "ma_50d", - "type": "float", - "description": "50-day moving average price.", - "default": null, - "optional": true - }, - { - "name": "ma_200d", - "type": "float", - "description": "200-day moving average price.", - "default": null, - "optional": true - }, - { - "name": "volume_average", - "type": "float", - "description": "Average daily trading volume.", - "default": null, - "optional": true - }, - { - "name": "volume_average_10d", - "type": "float", - "description": "Average daily trading volume in the last 10 days.", - "default": null, - "optional": true - }, - { - "name": "currency", - "type": "str", - "description": "Currency of the price.", - "default": null, - "optional": true - } - ] - }, - "model": "EquityQuote" - }, - "/equity/price/nbbo": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get the National Best Bid and Offer for a given stock.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.price.nbbo(symbol='AAPL', provider='polygon')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['polygon']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'polygon' if there is no default.", - "default": "polygon", - "optional": true - } - ], - "polygon": [ - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return. Up to ten million records will be returned. Pagination occurs in groups of 50,000. Remaining limit values will always return 50,000 more records unless it is the last page. High volume tickers will require multiple max requests for a single day's NBBO records. Expect stocks, like SPY, to approach 1GB in size, per day, as a raw CSV. Splitting large requests into chunks is recommended for full-day requests of high-volume symbols.", - "default": 50000, - "optional": true - }, - { - "name": "date", - "type": "Union[date, str]", - "description": "A specific date to get data for. Use bracketed the timestamp parameters to specify exact time ranges.", - "default": null, - "optional": true - }, - { - "name": "timestamp_lt", - "type": "Union[datetime, str]", - "description": "Query by datetime, less than. Either a date with the format 'YYYY-MM-DD' or a TZ-aware timestamp string, 'YYYY-MM-DDTH:M:S.000000000-04:00'. Include all nanoseconds and the 'T' between the day and hour.", - "default": null, - "optional": true - }, - { - "name": "timestamp_gt", - "type": "Union[datetime, str]", - "description": "Query by datetime, greater than. Either a date with the format 'YYYY-MM-DD' or a TZ-aware timestamp string, 'YYYY-MM-DDTH:M:S.000000000-04:00'. Include all nanoseconds and the 'T' between the day and hour.", - "default": null, - "optional": true - }, - { - "name": "timestamp_lte", - "type": "Union[datetime, str]", - "description": "Query by datetime, less than or equal to. Either a date with the format 'YYYY-MM-DD' or a TZ-aware timestamp string, 'YYYY-MM-DDTH:M:S.000000000-04:00'. Include all nanoseconds and the 'T' between the day and hour.", - "default": null, - "optional": true - }, - { - "name": "timestamp_gte", - "type": "Union[datetime, str]", - "description": "Query by datetime, greater than or equal to. Either a date with the format 'YYYY-MM-DD' or a TZ-aware timestamp string, 'YYYY-MM-DDTH:M:S.000000000-04:00'. Include all nanoseconds and the 'T' between the day and hour.", - "default": null, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EquityNBBO]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['polygon']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "ask_exchange", - "type": "str", - "description": "The exchange ID for the ask.", - "default": "", - "optional": false - }, - { - "name": "ask", - "type": "float", - "description": "The last ask price.", - "default": "", - "optional": false - }, - { - "name": "ask_size", - "type": "int", - "description": "The ask size. This represents the number of round lot orders at the given ask price. The normal round lot size is 100 shares. An ask size of 2 means there are 200 shares available to purchase at the given ask price.", - "default": "", - "optional": false - }, - { - "name": "bid_size", - "type": "int", - "description": "The bid size in round lots.", - "default": "", - "optional": false - }, - { - "name": "bid", - "type": "float", - "description": "The last bid price.", - "default": "", - "optional": false - }, - { - "name": "bid_exchange", - "type": "str", - "description": "The exchange ID for the bid.", - "default": "", - "optional": false - } - ], - "polygon": [ - { - "name": "tape", - "type": "str", - "description": "The exchange tape.", - "default": null, - "optional": true - }, - { - "name": "conditions", - "type": "Union[str, List[int], List[str]]", - "description": "A list of condition codes.", - "default": null, - "optional": true - }, - { - "name": "indicators", - "type": "List[int]", - "description": "A list of indicator codes.", - "default": null, - "optional": true - }, - { - "name": "sequence_num", - "type": "int", - "description": "The sequence number represents the sequence in which message events happened. These are increasing and unique per ticker symbol, but will not always be sequential (e.g., 1, 2, 6, 9, 10, 11)", - "default": null, - "optional": true - }, - { - "name": "participant_timestamp", - "type": "datetime", - "description": "The nanosecond accuracy Participant/Exchange Unix Timestamp. This is the timestamp of when the quote was actually generated at the exchange.", - "default": null, - "optional": true - }, - { - "name": "sip_timestamp", - "type": "datetime", - "description": "The nanosecond accuracy SIP Unix Timestamp. This is the timestamp of when the SIP received this quote from the exchange which produced it.", - "default": null, - "optional": true - }, - { - "name": "trf_timestamp", - "type": "datetime", - "description": "The nanosecond accuracy TRF (Trade Reporting Facility) Unix Timestamp. This is the timestamp of when the trade reporting facility received this quote.", - "default": null, - "optional": true - } - ] - }, - "model": "EquityNBBO" - }, - "/equity/price/historical": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get historical price data for a given stock. This includes open, high, low, close, and volume.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.price.historical(symbol='AAPL', provider='fmp')\nobb.equity.price.historical(symbol='AAPL', interval='1d', provider='intrinio')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, polygon, tiingo, yfinance.", - "default": "", - "optional": false - }, - { - "name": "interval", - "type": "str", - "description": "Time interval of the data to return.", - "default": "1d", - "optional": true - }, - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp', 'intrinio', 'polygon', 'tiingo', 'yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [], - "intrinio": [ - { - "name": "start_time", - "type": "datetime.time", - "description": "Return intervals starting at the specified time on the `start_date` formatted as 'HH:MM:SS'.", - "default": null, - "optional": true - }, - { - "name": "end_time", - "type": "datetime.time", - "description": "Return intervals stopping at the specified time on the `end_date` formatted as 'HH:MM:SS'.", - "default": null, - "optional": true - }, - { - "name": "timezone", - "type": "str", - "description": "Timezone of the data, in the IANA format (Continent/City).", - "default": "America/New_York", - "optional": true - }, - { - "name": "source", - "type": "Literal['realtime', 'delayed', 'nasdaq_basic']", - "description": "The source of the data.", - "default": "realtime", - "optional": true - } - ], - "polygon": [ - { - "name": "adjustment", - "type": "Literal['splits_only', 'unadjusted']", - "description": "The adjustment factor to apply. Default is splits only.", - "default": "splits_only", - "optional": true - }, - { - "name": "extended_hours", - "type": "bool", - "description": "Include Pre and Post market data.", - "default": false, - "optional": true - }, - { - "name": "sort", - "type": "Literal['asc', 'desc']", - "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date.", - "default": "asc", - "optional": true - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": 49999, - "optional": true - } - ], - "tiingo": [], - "yfinance": [ - { - "name": "extended_hours", - "type": "bool", - "description": "Include Pre and Post market data.", - "default": false, - "optional": true - }, - { - "name": "include_actions", - "type": "bool", - "description": "Include dividends and stock splits in results.", - "default": true, - "optional": true - }, - { - "name": "adjustment", - "type": "Literal['splits_only', 'splits_and_dividends']", - "description": "The adjustment factor to apply. Default is splits only.", - "default": "splits_only", - "optional": true - }, - { - "name": "adjusted", - "type": "bool", - "description": "This field is deprecated (4.1.5) and will be removed in a future version. Use 'adjustment' set as 'splits_and_dividends' instead.", - "default": false, - "optional": true - }, - { - "name": "prepost", - "type": "bool", - "description": "This field is deprecated (4.1.5) and will be removed in a future version. Use 'extended_hours' as True instead.", - "default": false, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EquityHistorical]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'intrinio', 'polygon', 'tiingo', 'yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "Union[date, datetime]", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "open", - "type": "float", - "description": "The open price.", - "default": "", - "optional": false - }, - { - "name": "high", - "type": "float", - "description": "The high price.", - "default": "", - "optional": false - }, - { - "name": "low", - "type": "float", - "description": "The low price.", - "default": "", - "optional": false - }, - { - "name": "close", - "type": "float", - "description": "The close price.", - "default": "", - "optional": false - }, - { - "name": "volume", - "type": "Union[float, int]", - "description": "The trading volume.", - "default": null, - "optional": true - }, - { - "name": "vwap", - "type": "float", - "description": "Volume Weighted Average Price over the period.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "adj_close", - "type": "float", - "description": "The adjusted close price.", - "default": null, - "optional": true - }, - { - "name": "unadjusted_volume", - "type": "float", - "description": "Unadjusted volume of the symbol.", - "default": null, - "optional": true - }, - { - "name": "change", - "type": "float", - "description": "Change in the price from the previous close.", - "default": null, - "optional": true - }, - { - "name": "change_percent", - "type": "float", - "description": "Change in the price from the previous close, as a normalized percent.", - "default": null, - "optional": true - } - ], - "intrinio": [ - { - "name": "average", - "type": "float", - "description": "Average trade price of an individual equity during the interval.", - "default": null, - "optional": true - }, - { - "name": "change", - "type": "float", - "description": "Change in the price of the symbol from the previous day.", - "default": null, - "optional": true - }, - { - "name": "change_percent", - "type": "float", - "description": "Percent change in the price of the symbol from the previous day.", - "default": null, - "optional": true - }, - { - "name": "adj_open", - "type": "float", - "description": "The adjusted open price.", - "default": null, - "optional": true - }, - { - "name": "adj_high", - "type": "float", - "description": "The adjusted high price.", - "default": null, - "optional": true - }, - { - "name": "adj_low", - "type": "float", - "description": "The adjusted low price.", - "default": null, - "optional": true - }, - { - "name": "adj_close", - "type": "float", - "description": "The adjusted close price.", - "default": null, - "optional": true - }, - { - "name": "adj_volume", - "type": "float", - "description": "The adjusted volume.", - "default": null, - "optional": true - }, - { - "name": "fifty_two_week_high", - "type": "float", - "description": "52 week high price for the symbol.", - "default": null, - "optional": true - }, - { - "name": "fifty_two_week_low", - "type": "float", - "description": "52 week low price for the symbol.", - "default": null, - "optional": true - }, - { - "name": "factor", - "type": "float", - "description": "factor by which to multiply equity prices before this date, in order to calculate historically-adjusted equity prices.", - "default": null, - "optional": true - }, - { - "name": "split_ratio", - "type": "float", - "description": "Ratio of the equity split, if a split occurred.", - "default": null, - "optional": true - }, - { - "name": "dividend", - "type": "float", - "description": "Dividend amount, if a dividend was paid.", - "default": null, - "optional": true - }, - { - "name": "close_time", - "type": "datetime", - "description": "The timestamp that represents the end of the interval span.", - "default": null, - "optional": true - }, - { - "name": "interval", - "type": "str", - "description": "The data time frequency.", - "default": null, - "optional": true - }, - { - "name": "intra_period", - "type": "bool", - "description": "If true, the equity price represents an unfinished period (be it day, week, quarter, month, or year), meaning that the close price is the latest price available, not the official close price for the period", - "default": null, - "optional": true - } - ], - "polygon": [ - { - "name": "transactions", - "type": "Annotated[int, Gt(gt=0)]", - "description": "Number of transactions for the symbol in the time period.", - "default": null, - "optional": true - } - ], - "tiingo": [ - { - "name": "adj_open", - "type": "float", - "description": "The adjusted open price.", - "default": null, - "optional": true - }, - { - "name": "adj_high", - "type": "float", - "description": "The adjusted high price.", - "default": null, - "optional": true - }, - { - "name": "adj_low", - "type": "float", - "description": "The adjusted low price.", - "default": null, - "optional": true - }, - { - "name": "adj_close", - "type": "float", - "description": "The adjusted close price.", - "default": null, - "optional": true - }, - { - "name": "adj_volume", - "type": "float", - "description": "The adjusted volume.", - "default": null, - "optional": true - }, - { - "name": "split_ratio", - "type": "float", - "description": "Ratio of the equity split, if a split occurred.", - "default": null, - "optional": true - }, - { - "name": "dividend", - "type": "float", - "description": "Dividend amount, if a dividend was paid.", - "default": null, - "optional": true - } - ], - "yfinance": [ - { - "name": "split_ratio", - "type": "float", - "description": "Ratio of the equity split, if a split occurred.", - "default": null, - "optional": true - }, - { - "name": "dividend", - "type": "float", - "description": "Dividend amount (split-adjusted), if a dividend was paid.", - "default": null, - "optional": true - } - ] - }, - "model": "EquityHistorical" - }, - "/equity/price/performance": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get price performance data for a given stock. This includes price changes for different time periods.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.price.performance(symbol='AAPL', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[PricePerformance]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": null, - "optional": true - }, - { - "name": "one_day", - "type": "float", - "description": "One-day return.", - "default": null, - "optional": true - }, - { - "name": "wtd", - "type": "float", - "description": "Week to date return.", - "default": null, - "optional": true - }, - { - "name": "one_week", - "type": "float", - "description": "One-week return.", - "default": null, - "optional": true - }, - { - "name": "mtd", - "type": "float", - "description": "Month to date return.", - "default": null, - "optional": true - }, - { - "name": "one_month", - "type": "float", - "description": "One-month return.", - "default": null, - "optional": true - }, - { - "name": "qtd", - "type": "float", - "description": "Quarter to date return.", - "default": null, - "optional": true - }, - { - "name": "three_month", - "type": "float", - "description": "Three-month return.", - "default": null, - "optional": true - }, - { - "name": "six_month", - "type": "float", - "description": "Six-month return.", - "default": null, - "optional": true - }, - { - "name": "ytd", - "type": "float", - "description": "Year to date return.", - "default": null, - "optional": true - }, - { - "name": "one_year", - "type": "float", - "description": "One-year return.", - "default": null, - "optional": true - }, - { - "name": "two_year", - "type": "float", - "description": "Two-year return.", - "default": null, - "optional": true - }, - { - "name": "three_year", - "type": "float", - "description": "Three-year return.", - "default": null, - "optional": true - }, - { - "name": "four_year", - "type": "float", - "description": "Four-year", - "default": null, - "optional": true - }, - { - "name": "five_year", - "type": "float", - "description": "Five-year return.", - "default": null, - "optional": true - }, - { - "name": "ten_year", - "type": "float", - "description": "Ten-year return.", - "default": null, - "optional": true - }, - { - "name": "max", - "type": "float", - "description": "Return from the beginning of the time series.", - "default": null, - "optional": true - } - ], - "fmp": [] - }, - "model": "PricePerformance" - }, - "/equity/shorts/fails_to_deliver": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get reported Fail-to-deliver (FTD) data.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.shorts.fails_to_deliver(symbol='AAPL', provider='sec')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['sec']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'sec' if there is no default.", - "default": "sec", - "optional": true - } - ], - "sec": [ - { - "name": "limit", - "type": "int", - "description": "Limit the number of reports to parse, from most recent. Approximately 24 reports per year, going back to 2009.", - "default": 24, - "optional": true - }, - { - "name": "skip_reports", - "type": "int", - "description": "Skip N number of reports from current. A value of 1 will skip the most recent report.", - "default": 0, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EquityFTD]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['sec']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "settlement_date", - "type": "date", - "description": "The settlement date of the fail.", - "default": null, - "optional": true - }, - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": null, - "optional": true - }, - { - "name": "cusip", - "type": "str", - "description": "CUSIP of the Security.", - "default": null, - "optional": true - }, - { - "name": "quantity", - "type": "int", - "description": "The number of fails on that settlement date.", - "default": null, - "optional": true - }, - { - "name": "price", - "type": "float", - "description": "The price at the previous closing price from the settlement date.", - "default": null, - "optional": true - }, - { - "name": "description", - "type": "str", - "description": "The description of the Security.", - "default": null, - "optional": true - } - ], - "sec": [] - }, - "model": "EquityFTD" - }, - "/equity/search": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Search for stock symbol, CIK, LEI, or company name.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.search(provider='intrinio')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "query", - "type": "str", - "description": "Search query.", - "default": "", - "optional": true - }, - { - "name": "is_symbol", - "type": "bool", - "description": "Whether to search by ticker symbol.", - "default": false, - "optional": true - }, - { - "name": "use_cache", - "type": "bool", - "description": "Whether to use the cache or not.", - "default": true, - "optional": true - }, - { - "name": "provider", - "type": "Literal['intrinio', 'sec']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'intrinio' if there is no default.", - "default": "intrinio", - "optional": true - } - ], - "intrinio": [ - { - "name": "active", - "type": "bool", - "description": "When true, return companies that are actively traded (having stock prices within the past 14 days). When false, return companies that are not actively traded or never have been traded.", - "default": true, - "optional": true - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": 10000, - "optional": true - } - ], - "sec": [ - { - "name": "is_fund", - "type": "bool", - "description": "Whether to direct the search to the list of mutual funds and ETFs.", - "default": false, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EquitySearch]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['intrinio', 'sec']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": null, - "optional": true - }, - { - "name": "name", - "type": "str", - "description": "Name of the company.", - "default": "", - "optional": false - } - ], - "intrinio": [ - { - "name": "cik", - "type": "str", - "description": "", - "default": "", - "optional": false - }, - { - "name": "lei", - "type": "str", - "description": "The Legal Entity Identifier (LEI) of the company.", - "default": "", - "optional": false - }, - { - "name": "intrinio_id", - "type": "str", - "description": "The Intrinio ID of the company.", - "default": "", - "optional": false - } - ], - "sec": [ - { - "name": "cik", - "type": "str", - "description": "Central Index Key", - "default": "", - "optional": false - } - ] - }, - "model": "EquitySearch" - }, - "/equity/screener": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Screen for companies meeting various criteria. These criteria include\nmarket cap, price, beta, volume, and dividend yield.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.screener(provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [ - { - "name": "mktcap_min", - "type": "int", - "description": "Filter by market cap greater than this value.", - "default": null, - "optional": true - }, - { - "name": "mktcap_max", - "type": "int", - "description": "Filter by market cap less than this value.", - "default": null, - "optional": true - }, - { - "name": "price_min", - "type": "float", - "description": "Filter by price greater than this value.", - "default": null, - "optional": true - }, - { - "name": "price_max", - "type": "float", - "description": "Filter by price less than this value.", - "default": null, - "optional": true - }, - { - "name": "beta_min", - "type": "float", - "description": "Filter by a beta greater than this value.", - "default": null, - "optional": true - }, - { - "name": "beta_max", - "type": "float", - "description": "Filter by a beta less than this value.", - "default": null, - "optional": true - }, - { - "name": "volume_min", - "type": "int", - "description": "Filter by volume greater than this value.", - "default": null, - "optional": true - }, - { - "name": "volume_max", - "type": "int", - "description": "Filter by volume less than this value.", - "default": null, - "optional": true - }, - { - "name": "dividend_min", - "type": "float", - "description": "Filter by dividend amount greater than this value.", - "default": null, - "optional": true - }, - { - "name": "dividend_max", - "type": "float", - "description": "Filter by dividend amount less than this value.", - "default": null, - "optional": true - }, - { - "name": "is_etf", - "type": "bool", - "description": "If true, returns only ETFs.", - "default": false, - "optional": true - }, - { - "name": "is_active", - "type": "bool", - "description": "If false, returns only inactive tickers.", - "default": true, - "optional": true - }, - { - "name": "sector", - "type": "Literal['Consumer Cyclical', 'Energy', 'Technology', 'Industrials', 'Financial Services', 'Basic Materials', 'Communication Services', 'Consumer Defensive', 'Healthcare', 'Real Estate', 'Utilities', 'Industrial Goods', 'Financial', 'Services', 'Conglomerates']", - "description": "Filter by sector.", - "default": null, - "optional": true - }, - { - "name": "industry", - "type": "str", - "description": "Filter by industry.", - "default": null, - "optional": true - }, - { - "name": "country", - "type": "str", - "description": "Filter by country, as a two-letter country code.", - "default": null, - "optional": true - }, - { - "name": "exchange", - "type": "Literal['amex', 'ams', 'ase', 'asx', 'ath', 'bme', 'bru', 'bud', 'bue', 'cai', 'cnq', 'cph', 'dfm', 'doh', 'etf', 'euronext', 'hel', 'hkse', 'ice', 'iob', 'ist', 'jkt', 'jnb', 'jpx', 'kls', 'koe', 'ksc', 'kuw', 'lse', 'mex', 'mutual_fund', 'nasdaq', 'neo', 'nse', 'nyse', 'nze', 'osl', 'otc', 'pnk', 'pra', 'ris', 'sao', 'sau', 'set', 'sgo', 'shh', 'shz', 'six', 'sto', 'tai', 'tlv', 'tsx', 'two', 'vie', 'wse', 'xetra']", - "description": "Filter by exchange.", - "default": null, - "optional": true - }, - { - "name": "limit", - "type": "int", - "description": "Limit the number of results to return.", - "default": 50000, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EquityScreener]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "name", - "type": "str", - "description": "Name of the company.", - "default": "", - "optional": false - } - ], - "fmp": [ - { - "name": "market_cap", - "type": "int", - "description": "The market cap of ticker.", - "default": null, - "optional": true - }, - { - "name": "sector", - "type": "str", - "description": "The sector the ticker belongs to.", - "default": null, - "optional": true - }, - { - "name": "industry", - "type": "str", - "description": "The industry ticker belongs to.", - "default": null, - "optional": true - }, - { - "name": "beta", - "type": "float", - "description": "The beta of the ETF.", - "default": null, - "optional": true - }, - { - "name": "price", - "type": "float", - "description": "The current price.", - "default": null, - "optional": true - }, - { - "name": "last_annual_dividend", - "type": "float", - "description": "The last annual amount dividend paid.", - "default": null, - "optional": true - }, - { - "name": "volume", - "type": "int", - "description": "The current trading volume.", - "default": null, - "optional": true - }, - { - "name": "exchange", - "type": "str", - "description": "The exchange code the asset trades on.", - "default": null, - "optional": true - }, - { - "name": "exchange_name", - "type": "str", - "description": "The full name of the primary exchange.", - "default": null, - "optional": true - }, - { - "name": "country", - "type": "str", - "description": "The two-letter country abbreviation where the head office is located.", - "default": null, - "optional": true - }, - { - "name": "is_etf", - "type": "Literal[True, False]", - "description": "Whether the ticker is an ETF.", - "default": null, - "optional": true - }, - { - "name": "actively_trading", - "type": "Literal[True, False]", - "description": "Whether the ETF is actively trading.", - "default": null, - "optional": true - } - ] - }, - "model": "EquityScreener" - }, - "/equity/profile": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get general information about a company. This includes company name, industry, sector and price data.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.profile(symbol='AAPL', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio, yfinance.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['fmp', 'intrinio', 'yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [], - "intrinio": [], - "yfinance": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EquityInfo]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'intrinio', 'yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "name", - "type": "str", - "description": "Common name of the company.", - "default": null, - "optional": true - }, - { - "name": "cik", - "type": "str", - "description": "Central Index Key (CIK) for the requested entity.", - "default": null, - "optional": true - }, - { - "name": "cusip", - "type": "str", - "description": "CUSIP identifier for the company.", - "default": null, - "optional": true - }, - { - "name": "isin", - "type": "str", - "description": "International Securities Identification Number.", - "default": null, - "optional": true - }, - { - "name": "lei", - "type": "str", - "description": "Legal Entity Identifier assigned to the company.", - "default": null, - "optional": true - }, - { - "name": "legal_name", - "type": "str", - "description": "Official legal name of the company.", - "default": null, - "optional": true - }, - { - "name": "stock_exchange", - "type": "str", - "description": "Stock exchange where the company is traded.", - "default": null, - "optional": true - }, - { - "name": "sic", - "type": "int", - "description": "Standard Industrial Classification code for the company.", - "default": null, - "optional": true - }, - { - "name": "short_description", - "type": "str", - "description": "Short description of the company.", - "default": null, - "optional": true - }, - { - "name": "long_description", - "type": "str", - "description": "Long description of the company.", - "default": null, - "optional": true - }, - { - "name": "ceo", - "type": "str", - "description": "Chief Executive Officer of the company.", - "default": null, - "optional": true - }, - { - "name": "company_url", - "type": "str", - "description": "URL of the company's website.", - "default": null, - "optional": true - }, - { - "name": "business_address", - "type": "str", - "description": "Address of the company's headquarters.", - "default": null, - "optional": true - }, - { - "name": "mailing_address", - "type": "str", - "description": "Mailing address of the company.", - "default": null, - "optional": true - }, - { - "name": "business_phone_no", - "type": "str", - "description": "Phone number of the company's headquarters.", - "default": null, - "optional": true - }, - { - "name": "hq_address1", - "type": "str", - "description": "Address of the company's headquarters.", - "default": null, - "optional": true - }, - { - "name": "hq_address2", - "type": "str", - "description": "Address of the company's headquarters.", - "default": null, - "optional": true - }, - { - "name": "hq_address_city", - "type": "str", - "description": "City of the company's headquarters.", - "default": null, - "optional": true - }, - { - "name": "hq_address_postal_code", - "type": "str", - "description": "Zip code of the company's headquarters.", - "default": null, - "optional": true - }, - { - "name": "hq_state", - "type": "str", - "description": "State of the company's headquarters.", - "default": null, - "optional": true - }, - { - "name": "hq_country", - "type": "str", - "description": "Country of the company's headquarters.", - "default": null, - "optional": true - }, - { - "name": "inc_state", - "type": "str", - "description": "State in which the company is incorporated.", - "default": null, - "optional": true - }, - { - "name": "inc_country", - "type": "str", - "description": "Country in which the company is incorporated.", - "default": null, - "optional": true - }, - { - "name": "employees", - "type": "int", - "description": "Number of employees working for the company.", - "default": null, - "optional": true - }, - { - "name": "entity_legal_form", - "type": "str", - "description": "Legal form of the company.", - "default": null, - "optional": true - }, - { - "name": "entity_status", - "type": "str", - "description": "Status of the company.", - "default": null, - "optional": true - }, - { - "name": "latest_filing_date", - "type": "date", - "description": "Date of the company's latest filing.", - "default": null, - "optional": true - }, - { - "name": "irs_number", - "type": "str", - "description": "IRS number assigned to the company.", - "default": null, - "optional": true - }, - { - "name": "sector", - "type": "str", - "description": "Sector in which the company operates.", - "default": null, - "optional": true - }, - { - "name": "industry_category", - "type": "str", - "description": "Category of industry in which the company operates.", - "default": null, - "optional": true - }, - { - "name": "industry_group", - "type": "str", - "description": "Group of industry in which the company operates.", - "default": null, - "optional": true - }, - { - "name": "template", - "type": "str", - "description": "Template used to standardize the company's financial statements.", - "default": null, - "optional": true - }, - { - "name": "standardized_active", - "type": "bool", - "description": "Whether the company is active or not.", - "default": null, - "optional": true - }, - { - "name": "first_fundamental_date", - "type": "date", - "description": "Date of the company's first fundamental.", - "default": null, - "optional": true - }, - { - "name": "last_fundamental_date", - "type": "date", - "description": "Date of the company's last fundamental.", - "default": null, - "optional": true - }, - { - "name": "first_stock_price_date", - "type": "date", - "description": "Date of the company's first stock price.", - "default": null, - "optional": true - }, - { - "name": "last_stock_price_date", - "type": "date", - "description": "Date of the company's last stock price.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "is_etf", - "type": "bool", - "description": "If the symbol is an ETF.", - "default": "", - "optional": false - }, - { - "name": "is_actively_trading", - "type": "bool", - "description": "If the company is actively trading.", - "default": "", - "optional": false - }, - { - "name": "is_adr", - "type": "bool", - "description": "If the stock is an ADR.", - "default": "", - "optional": false - }, - { - "name": "is_fund", - "type": "bool", - "description": "If the company is a fund.", - "default": "", - "optional": false - }, - { - "name": "image", - "type": "str", - "description": "Image of the company.", - "default": null, - "optional": true - }, - { - "name": "currency", - "type": "str", - "description": "Currency in which the stock is traded.", - "default": null, - "optional": true - }, - { - "name": "market_cap", - "type": "int", - "description": "Market capitalization of the company.", - "default": null, - "optional": true - }, - { - "name": "last_price", - "type": "float", - "description": "The last traded price.", - "default": null, - "optional": true - }, - { - "name": "year_high", - "type": "float", - "description": "The one-year high of the price.", - "default": null, - "optional": true - }, - { - "name": "year_low", - "type": "float", - "description": "The one-year low of the price.", - "default": null, - "optional": true - }, - { - "name": "volume_avg", - "type": "int", - "description": "Average daily trading volume.", - "default": null, - "optional": true - }, - { - "name": "annualized_dividend_amount", - "type": "float", - "description": "The annualized dividend payment based on the most recent regular dividend payment.", - "default": null, - "optional": true - }, - { - "name": "beta", - "type": "float", - "description": "Beta of the stock relative to the market.", - "default": null, - "optional": true - } - ], - "intrinio": [ - { - "name": "id", - "type": "str", - "description": "Intrinio ID for the company.", - "default": null, - "optional": true - }, - { - "name": "thea_enabled", - "type": "bool", - "description": "Whether the company has been enabled for Thea.", - "default": null, - "optional": true - } - ], - "yfinance": [ - { - "name": "exchange_timezone", - "type": "str", - "description": "The timezone of the exchange.", - "default": null, - "optional": true - }, - { - "name": "issue_type", - "type": "str", - "description": "The issuance type of the asset.", - "default": null, - "optional": true - }, - { - "name": "currency", - "type": "str", - "description": "The currency in which the asset is traded.", - "default": null, - "optional": true - }, - { - "name": "market_cap", - "type": "int", - "description": "The market capitalization of the asset.", - "default": null, - "optional": true - }, - { - "name": "shares_outstanding", - "type": "int", - "description": "The number of listed shares outstanding.", - "default": null, - "optional": true - }, - { - "name": "shares_float", - "type": "int", - "description": "The number of shares in the public float.", - "default": null, - "optional": true - }, - { - "name": "shares_implied_outstanding", - "type": "int", - "description": "Implied shares outstanding of common equityassuming the conversion of all convertible subsidiary equity into common.", - "default": null, - "optional": true - }, - { - "name": "shares_short", - "type": "int", - "description": "The reported number of shares short.", - "default": null, - "optional": true - }, - { - "name": "dividend_yield", - "type": "float", - "description": "The dividend yield of the asset, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "beta", - "type": "float", - "description": "The beta of the asset relative to the broad market.", - "default": null, - "optional": true - } - ] - }, - "model": "EquityInfo" - }, - "/equity/market_snapshots": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get an updated equity market snapshot. This includes price data for thousands of stocks.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.market_snapshots(provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "provider", - "type": "Literal['fmp', 'intrinio', 'polygon']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [ - { - "name": "market", - "type": "Literal['amex', 'ams', 'ase', 'asx', 'ath', 'bme', 'bru', 'bud', 'bue', 'cai', 'cnq', 'cph', 'dfm', 'doh', 'etf', 'euronext', 'hel', 'hkse', 'ice', 'iob', 'ist', 'jkt', 'jnb', 'jpx', 'kls', 'koe', 'ksc', 'kuw', 'lse', 'mex', 'mutual_fund', 'nasdaq', 'neo', 'nse', 'nyse', 'nze', 'osl', 'otc', 'pnk', 'pra', 'ris', 'sao', 'sau', 'set', 'sgo', 'shh', 'shz', 'six', 'sto', 'tai', 'tlv', 'tsx', 'two', 'vie', 'wse', 'xetra']", - "description": "The market to fetch data for.", - "default": "nasdaq", - "optional": true - } - ], - "intrinio": [ - { - "name": "date", - "type": "Union[Union[date, datetime, str], str]", - "description": "The date of the data. Can be a datetime or an ISO datetime string. Historical data appears to go back to mid-June 2022. Example: '2024-03-08T12:15:00+0400'", - "default": null, - "optional": true - } - ], - "polygon": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[MarketSnapshots]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'intrinio', 'polygon']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "open", - "type": "float", - "description": "The open price.", - "default": null, - "optional": true - }, - { - "name": "high", - "type": "float", - "description": "The high price.", - "default": null, - "optional": true - }, - { - "name": "low", - "type": "float", - "description": "The low price.", - "default": null, - "optional": true - }, - { - "name": "close", - "type": "float", - "description": "The close price.", - "default": null, - "optional": true - }, - { - "name": "volume", - "type": "int", - "description": "The trading volume.", - "default": null, - "optional": true - }, - { - "name": "prev_close", - "type": "float", - "description": "The previous close price.", - "default": null, - "optional": true - }, - { - "name": "change", - "type": "float", - "description": "The change in price from the previous close.", - "default": null, - "optional": true - }, - { - "name": "change_percent", - "type": "float", - "description": "The change in price from the previous close, as a normalized percent.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "last_price", - "type": "float", - "description": "The last price of the stock.", - "default": null, - "optional": true - }, - { - "name": "last_price_timestamp", - "type": "Union[date, datetime]", - "description": "The timestamp of the last price.", - "default": null, - "optional": true - }, - { - "name": "ma50", - "type": "float", - "description": "The 50-day moving average.", - "default": null, - "optional": true - }, - { - "name": "ma200", - "type": "float", - "description": "The 200-day moving average.", - "default": null, - "optional": true - }, - { - "name": "year_high", - "type": "float", - "description": "The 52-week high.", - "default": null, - "optional": true - }, - { - "name": "year_low", - "type": "float", - "description": "The 52-week low.", - "default": null, - "optional": true - }, - { - "name": "volume_avg", - "type": "int", - "description": "Average daily trading volume.", - "default": null, - "optional": true - }, - { - "name": "market_cap", - "type": "int", - "description": "Market cap of the stock.", - "default": null, - "optional": true - }, - { - "name": "eps", - "type": "float", - "description": "Earnings per share.", - "default": null, - "optional": true - }, - { - "name": "pe", - "type": "float", - "description": "Price to earnings ratio.", - "default": null, - "optional": true - }, - { - "name": "shares_outstanding", - "type": "int", - "description": "Number of shares outstanding.", - "default": null, - "optional": true - }, - { - "name": "name", - "type": "str", - "description": "The company name associated with the symbol.", - "default": null, - "optional": true - }, - { - "name": "exchange", - "type": "str", - "description": "The exchange of the stock.", - "default": null, - "optional": true - }, - { - "name": "earnings_date", - "type": "Union[date, datetime]", - "description": "The upcoming earnings announcement date.", - "default": null, - "optional": true - } - ], - "intrinio": [ - { - "name": "last_price", - "type": "float", - "description": "The last trade price.", - "default": null, - "optional": true - }, - { - "name": "last_size", - "type": "int", - "description": "The last trade size.", - "default": null, - "optional": true - }, - { - "name": "last_volume", - "type": "int", - "description": "The last trade volume.", - "default": null, - "optional": true - }, - { - "name": "last_trade_timestamp", - "type": "datetime", - "description": "The timestamp of the last trade.", - "default": null, - "optional": true - }, - { - "name": "bid_size", - "type": "int", - "description": "The size of the last bid price. Bid price and size is not always available.", - "default": null, - "optional": true - }, - { - "name": "bid_price", - "type": "float", - "description": "The last bid price. Bid price and size is not always available.", - "default": null, - "optional": true - }, - { - "name": "ask_price", - "type": "float", - "description": "The last ask price. Ask price and size is not always available.", - "default": null, - "optional": true - }, - { - "name": "ask_size", - "type": "int", - "description": "The size of the last ask price. Ask price and size is not always available.", - "default": null, - "optional": true - }, - { - "name": "last_bid_timestamp", - "type": "datetime", - "description": "The timestamp of the last bid price. Bid price and size is not always available.", - "default": null, - "optional": true - }, - { - "name": "last_ask_timestamp", - "type": "datetime", - "description": "The timestamp of the last ask price. Ask price and size is not always available.", - "default": null, - "optional": true - } - ], - "polygon": [ - { - "name": "vwap", - "type": "float", - "description": "The volume weighted average price of the stock on the current trading day.", - "default": null, - "optional": true - }, - { - "name": "prev_open", - "type": "float", - "description": "The previous trading session opening price.", - "default": null, - "optional": true - }, - { - "name": "prev_high", - "type": "float", - "description": "The previous trading session high price.", - "default": null, - "optional": true - }, - { - "name": "prev_low", - "type": "float", - "description": "The previous trading session low price.", - "default": null, - "optional": true - }, - { - "name": "prev_volume", - "type": "float", - "description": "The previous trading session volume.", - "default": null, - "optional": true - }, - { - "name": "prev_vwap", - "type": "float", - "description": "The previous trading session VWAP.", - "default": null, - "optional": true - }, - { - "name": "last_updated", - "type": "datetime", - "description": "The last time the data was updated.", - "default": "", - "optional": false - }, - { - "name": "bid", - "type": "float", - "description": "The current bid price.", - "default": null, - "optional": true - }, - { - "name": "bid_size", - "type": "int", - "description": "The current bid size.", - "default": null, - "optional": true - }, - { - "name": "ask_size", - "type": "int", - "description": "The current ask size.", - "default": null, - "optional": true - }, - { - "name": "ask", - "type": "float", - "description": "The current ask price.", - "default": null, - "optional": true - }, - { - "name": "quote_timestamp", - "type": "datetime", - "description": "The timestamp of the last quote.", - "default": null, - "optional": true - }, - { - "name": "last_trade_price", - "type": "float", - "description": "The last trade price.", - "default": null, - "optional": true - }, - { - "name": "last_trade_size", - "type": "int", - "description": "The last trade size.", - "default": null, - "optional": true - }, - { - "name": "last_trade_conditions", - "type": "List[int]", - "description": "The last trade condition codes.", - "default": null, - "optional": true - }, - { - "name": "last_trade_exchange", - "type": "int", - "description": "The last trade exchange ID code.", - "default": null, - "optional": true - }, - { - "name": "last_trade_timestamp", - "type": "datetime", - "description": "The last trade timestamp.", - "default": null, - "optional": true - } - ] - }, - "model": "MarketSnapshots" - }, - "/etf/search": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Search for ETFs.\n\nAn empty query returns the full list of ETFs from the provider.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\n# An empty query returns the full list of ETFs from the provider.\nobb.etf.search(provider='fmp')\n# The query will return results from text-based fields containing the term.\nobb.etf.search(query='commercial real estate', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "query", - "type": "str", - "description": "Search query.", - "default": "", - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp', 'intrinio']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [ - { - "name": "exchange", - "type": "Literal['AMEX', 'NYSE', 'NASDAQ', 'ETF', 'TSX', 'EURONEXT']", - "description": "The exchange code the ETF trades on.", - "default": null, - "optional": true - }, - { - "name": "is_active", - "type": "Literal[True, False]", - "description": "Whether the ETF is actively trading.", - "default": null, - "optional": true - } - ], - "intrinio": [ - { - "name": "exchange", - "type": "Literal['xnas', 'arcx', 'bats', 'xnys', 'bvmf', 'xshg', 'xshe', 'xhkg', 'xbom', 'xnse', 'xidx', 'tase', 'xkrx', 'xkls', 'xmex', 'xses', 'roco', 'xtai', 'xbkk', 'xist']", - "description": "Target a specific exchange by providing the MIC code.", - "default": null, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EtfSearch]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'intrinio']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.(ETF)", - "default": "", - "optional": false - }, - { - "name": "name", - "type": "str", - "description": "Name of the ETF.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "market_cap", - "type": "float", - "description": "The market cap of the ETF.", - "default": null, - "optional": true - }, - { - "name": "sector", - "type": "str", - "description": "The sector of the ETF.", - "default": null, - "optional": true - }, - { - "name": "industry", - "type": "str", - "description": "The industry of the ETF.", - "default": null, - "optional": true - }, - { - "name": "beta", - "type": "float", - "description": "The beta of the ETF.", - "default": null, - "optional": true - }, - { - "name": "price", - "type": "float", - "description": "The current price of the ETF.", - "default": null, - "optional": true - }, - { - "name": "last_annual_dividend", - "type": "float", - "description": "The last annual dividend paid.", - "default": null, - "optional": true - }, - { - "name": "volume", - "type": "float", - "description": "The current trading volume of the ETF.", - "default": null, - "optional": true - }, - { - "name": "exchange", - "type": "str", - "description": "The exchange code the ETF trades on.", - "default": null, - "optional": true - }, - { - "name": "exchange_name", - "type": "str", - "description": "The full name of the exchange the ETF trades on.", - "default": null, - "optional": true - }, - { - "name": "country", - "type": "str", - "description": "The country the ETF is registered in.", - "default": null, - "optional": true - }, - { - "name": "actively_trading", - "type": "Literal[True, False]", - "description": "Whether the ETF is actively trading.", - "default": null, - "optional": true - } - ], - "intrinio": [ - { - "name": "exchange", - "type": "str", - "description": "The exchange MIC code.", - "default": null, - "optional": true - }, - { - "name": "figi_ticker", - "type": "str", - "description": "The OpenFIGI ticker.", - "default": null, - "optional": true - }, - { - "name": "ric", - "type": "str", - "description": "The Reuters Instrument Code.", - "default": null, - "optional": true - }, - { - "name": "isin", - "type": "str", - "description": "The International Securities Identification Number.", - "default": null, - "optional": true - }, - { - "name": "sedol", - "type": "str", - "description": "The Stock Exchange Daily Official List.", - "default": null, - "optional": true - }, - { - "name": "intrinio_id", - "type": "str", - "description": "The unique Intrinio ID for the security.", - "default": null, - "optional": true - } - ] - }, - "model": "EtfSearch" - }, - "/etf/historical": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "ETF Historical Market Price.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.etf.historical(symbol='SPY', provider='fmp')\nobb.etf.historical(symbol='SPY', provider='yfinance')\n# This function accepts multiple tickers.\nobb.etf.historical(symbol='SPY,IWM,QQQ,DJIA', provider='yfinance')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, polygon, tiingo, yfinance.", - "default": "", - "optional": false - }, - { - "name": "interval", - "type": "str", - "description": "Time interval of the data to return.", - "default": "1d", - "optional": true - }, - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp', 'intrinio', 'polygon', 'tiingo', 'yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [], - "intrinio": [ - { - "name": "start_time", - "type": "datetime.time", - "description": "Return intervals starting at the specified time on the `start_date` formatted as 'HH:MM:SS'.", - "default": null, - "optional": true - }, - { - "name": "end_time", - "type": "datetime.time", - "description": "Return intervals stopping at the specified time on the `end_date` formatted as 'HH:MM:SS'.", - "default": null, - "optional": true - }, - { - "name": "timezone", - "type": "str", - "description": "Timezone of the data, in the IANA format (Continent/City).", - "default": "America/New_York", - "optional": true - }, - { - "name": "source", - "type": "Literal['realtime', 'delayed', 'nasdaq_basic']", - "description": "The source of the data.", - "default": "realtime", - "optional": true - } - ], - "polygon": [ - { - "name": "adjustment", - "type": "Literal['splits_only', 'unadjusted']", - "description": "The adjustment factor to apply. Default is splits only.", - "default": "splits_only", - "optional": true - }, - { - "name": "extended_hours", - "type": "bool", - "description": "Include Pre and Post market data.", - "default": false, - "optional": true - }, - { - "name": "sort", - "type": "Literal['asc', 'desc']", - "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date.", - "default": "asc", - "optional": true - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": 49999, - "optional": true - } - ], - "tiingo": [], - "yfinance": [ - { - "name": "extended_hours", - "type": "bool", - "description": "Include Pre and Post market data.", - "default": false, - "optional": true - }, - { - "name": "include_actions", - "type": "bool", - "description": "Include dividends and stock splits in results.", - "default": true, - "optional": true - }, - { - "name": "adjustment", - "type": "Literal['splits_only', 'splits_and_dividends']", - "description": "The adjustment factor to apply. Default is splits only.", - "default": "splits_only", - "optional": true - }, - { - "name": "adjusted", - "type": "bool", - "description": "This field is deprecated (4.1.5) and will be removed in a future version. Use 'adjustment' set as 'splits_and_dividends' instead.", - "default": false, - "optional": true - }, - { - "name": "prepost", - "type": "bool", - "description": "This field is deprecated (4.1.5) and will be removed in a future version. Use 'extended_hours' as True instead.", - "default": false, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EtfHistorical]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'intrinio', 'polygon', 'tiingo', 'yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "Union[date, datetime]", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "open", - "type": "float", - "description": "The open price.", - "default": "", - "optional": false - }, - { - "name": "high", - "type": "float", - "description": "The high price.", - "default": "", - "optional": false - }, - { - "name": "low", - "type": "float", - "description": "The low price.", - "default": "", - "optional": false - }, - { - "name": "close", - "type": "float", - "description": "The close price.", - "default": "", - "optional": false - }, - { - "name": "volume", - "type": "Union[float, int]", - "description": "The trading volume.", - "default": null, - "optional": true - }, - { - "name": "vwap", - "type": "float", - "description": "Volume Weighted Average Price over the period.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "adj_close", - "type": "float", - "description": "The adjusted close price.", - "default": null, - "optional": true - }, - { - "name": "unadjusted_volume", - "type": "float", - "description": "Unadjusted volume of the symbol.", - "default": null, - "optional": true - }, - { - "name": "change", - "type": "float", - "description": "Change in the price from the previous close.", - "default": null, - "optional": true - }, - { - "name": "change_percent", - "type": "float", - "description": "Change in the price from the previous close, as a normalized percent.", - "default": null, - "optional": true - } - ], - "intrinio": [ - { - "name": "average", - "type": "float", - "description": "Average trade price of an individual equity during the interval.", - "default": null, - "optional": true - }, - { - "name": "change", - "type": "float", - "description": "Change in the price of the symbol from the previous day.", - "default": null, - "optional": true - }, - { - "name": "change_percent", - "type": "float", - "description": "Percent change in the price of the symbol from the previous day.", - "default": null, - "optional": true - }, - { - "name": "adj_open", - "type": "float", - "description": "The adjusted open price.", - "default": null, - "optional": true - }, - { - "name": "adj_high", - "type": "float", - "description": "The adjusted high price.", - "default": null, - "optional": true - }, - { - "name": "adj_low", - "type": "float", - "description": "The adjusted low price.", - "default": null, - "optional": true - }, - { - "name": "adj_close", - "type": "float", - "description": "The adjusted close price.", - "default": null, - "optional": true - }, - { - "name": "adj_volume", - "type": "float", - "description": "The adjusted volume.", - "default": null, - "optional": true - }, - { - "name": "fifty_two_week_high", - "type": "float", - "description": "52 week high price for the symbol.", - "default": null, - "optional": true - }, - { - "name": "fifty_two_week_low", - "type": "float", - "description": "52 week low price for the symbol.", - "default": null, - "optional": true - }, - { - "name": "factor", - "type": "float", - "description": "factor by which to multiply equity prices before this date, in order to calculate historically-adjusted equity prices.", - "default": null, - "optional": true - }, - { - "name": "split_ratio", - "type": "float", - "description": "Ratio of the equity split, if a split occurred.", - "default": null, - "optional": true - }, - { - "name": "dividend", - "type": "float", - "description": "Dividend amount, if a dividend was paid.", - "default": null, - "optional": true - }, - { - "name": "close_time", - "type": "datetime", - "description": "The timestamp that represents the end of the interval span.", - "default": null, - "optional": true - }, - { - "name": "interval", - "type": "str", - "description": "The data time frequency.", - "default": null, - "optional": true - }, - { - "name": "intra_period", - "type": "bool", - "description": "If true, the equity price represents an unfinished period (be it day, week, quarter, month, or year), meaning that the close price is the latest price available, not the official close price for the period", - "default": null, - "optional": true - } - ], - "polygon": [ - { - "name": "transactions", - "type": "Annotated[int, Gt(gt=0)]", - "description": "Number of transactions for the symbol in the time period.", - "default": null, - "optional": true - } - ], - "tiingo": [ - { - "name": "adj_open", - "type": "float", - "description": "The adjusted open price.", - "default": null, - "optional": true - }, - { - "name": "adj_high", - "type": "float", - "description": "The adjusted high price.", - "default": null, - "optional": true - }, - { - "name": "adj_low", - "type": "float", - "description": "The adjusted low price.", - "default": null, - "optional": true - }, - { - "name": "adj_close", - "type": "float", - "description": "The adjusted close price.", - "default": null, - "optional": true - }, - { - "name": "adj_volume", - "type": "float", - "description": "The adjusted volume.", - "default": null, - "optional": true - }, - { - "name": "split_ratio", - "type": "float", - "description": "Ratio of the equity split, if a split occurred.", - "default": null, - "optional": true - }, - { - "name": "dividend", - "type": "float", - "description": "Dividend amount, if a dividend was paid.", - "default": null, - "optional": true - } - ], - "yfinance": [ - { - "name": "split_ratio", - "type": "float", - "description": "Ratio of the equity split, if a split occurred.", - "default": null, - "optional": true - }, - { - "name": "dividend", - "type": "float", - "description": "Dividend amount (split-adjusted), if a dividend was paid.", - "default": null, - "optional": true - } - ] - }, - "model": "EtfHistorical" - }, - "/etf/info": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "ETF Information Overview.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.etf.info(symbol='SPY', provider='fmp')\n# This function accepts multiple tickers.\nobb.etf.info(symbol='SPY,IWM,QQQ,DJIA', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. (ETF) Multiple items allowed for provider(s): fmp, intrinio, yfinance.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['fmp', 'intrinio', 'yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [], - "intrinio": [], - "yfinance": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EtfInfo]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'intrinio', 'yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data. (ETF)", - "default": "", - "optional": false - }, - { - "name": "name", - "type": "str", - "description": "Name of the ETF.", - "default": "", - "optional": false - }, - { - "name": "description", - "type": "str", - "description": "Description of the fund.", - "default": null, - "optional": true - }, - { - "name": "inception_date", - "type": "str", - "description": "Inception date of the ETF.", - "default": "", - "optional": false - } - ], - "fmp": [ - { - "name": "issuer", - "type": "str", - "description": "Company of the ETF.", - "default": null, - "optional": true - }, - { - "name": "cusip", - "type": "str", - "description": "CUSIP of the ETF.", - "default": null, - "optional": true - }, - { - "name": "isin", - "type": "str", - "description": "ISIN of the ETF.", - "default": null, - "optional": true - }, - { - "name": "domicile", - "type": "str", - "description": "Domicile of the ETF.", - "default": null, - "optional": true - }, - { - "name": "asset_class", - "type": "str", - "description": "Asset class of the ETF.", - "default": null, - "optional": true - }, - { - "name": "aum", - "type": "float", - "description": "Assets under management.", - "default": null, - "optional": true - }, - { - "name": "nav", - "type": "float", - "description": "Net asset value of the ETF.", - "default": null, - "optional": true - }, - { - "name": "nav_currency", - "type": "str", - "description": "Currency of the ETF's net asset value.", - "default": null, - "optional": true - }, - { - "name": "expense_ratio", - "type": "float", - "description": "The expense ratio, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "holdings_count", - "type": "int", - "description": "Number of holdings.", - "default": null, - "optional": true - }, - { - "name": "avg_volume", - "type": "float", - "description": "Average daily trading volume.", - "default": null, - "optional": true - }, - { - "name": "website", - "type": "str", - "description": "Website of the issuer.", - "default": null, - "optional": true - } - ], - "intrinio": [ - { - "name": "fund_listing_date", - "type": "date", - "description": "The date on which the Exchange Traded Product (ETP) or share class of the ETP is listed on a specific exchange.", - "default": null, - "optional": true - }, - { - "name": "data_change_date", - "type": "date", - "description": "The last date on which there was a change in a classifications data field for this ETF.", - "default": null, - "optional": true - }, - { - "name": "etn_maturity_date", - "type": "date", - "description": "If the product is an ETN, this field identifies the maturity date for the ETN.", - "default": null, - "optional": true - }, - { - "name": "is_listed", - "type": "bool", - "description": "If true, the ETF is still listed on an exchange.", - "default": null, - "optional": true - }, - { - "name": "close_date", - "type": "date", - "description": "The date on which the ETF was de-listed if it is no longer listed.", - "default": null, - "optional": true - }, - { - "name": "exchange", - "type": "str", - "description": "The exchange Market Identifier Code (MIC).", - "default": null, - "optional": true - }, - { - "name": "isin", - "type": "str", - "description": "International Securities Identification Number (ISIN).", - "default": null, - "optional": true - }, - { - "name": "ric", - "type": "str", - "description": "Reuters Instrument Code (RIC).", - "default": null, - "optional": true - }, - { - "name": "sedol", - "type": "str", - "description": "Stock Exchange Daily Official List (SEDOL).", - "default": null, - "optional": true - }, - { - "name": "figi_symbol", - "type": "str", - "description": "Financial Instrument Global Identifier (FIGI) symbol.", - "default": null, - "optional": true - }, - { - "name": "share_class_figi", - "type": "str", - "description": "Financial Instrument Global Identifier (FIGI).", - "default": null, - "optional": true - }, - { - "name": "firstbridge_id", - "type": "str", - "description": "The FirstBridge unique identifier for the Exchange Traded Fund (ETF).", - "default": null, - "optional": true - }, - { - "name": "firstbridge_parent_id", - "type": "str", - "description": "The FirstBridge unique identifier for the parent Exchange Traded Fund (ETF), if applicable.", - "default": null, - "optional": true - }, - { - "name": "intrinio_id", - "type": "str", - "description": "Intrinio unique identifier for the security.", - "default": null, - "optional": true - }, - { - "name": "intraday_nav_symbol", - "type": "str", - "description": "Intraday Net Asset Value (NAV) symbol.", - "default": null, - "optional": true - }, - { - "name": "primary_symbol", - "type": "str", - "description": "The primary ticker field is used for Exchange Traded Products (ETPs) that have multiple listings and share classes. If an ETP has multiple listings or share classes, the same primary ticker is assigned to all the listings and share classes.", - "default": null, - "optional": true - }, - { - "name": "etp_structure_type", - "type": "str", - "description": "Classifies Exchange Traded Products (ETPs) into very broad categories based on its legal structure.", - "default": null, - "optional": true - }, - { - "name": "legal_structure", - "type": "str", - "description": "Legal structure of the fund.", - "default": null, - "optional": true - }, - { - "name": "issuer", - "type": "str", - "description": "Issuer of the ETF.", - "default": null, - "optional": true - }, - { - "name": "etn_issuing_bank", - "type": "str", - "description": "If the product is an Exchange Traded Note (ETN), this field identifies the issuing bank.", - "default": null, - "optional": true - }, - { - "name": "fund_family", - "type": "str", - "description": "This field identifies the fund family to which the ETF belongs, as categorized by the ETF Sponsor.", - "default": null, - "optional": true - }, - { - "name": "investment_style", - "type": "str", - "description": "Investment style of the ETF.", - "default": null, - "optional": true - }, - { - "name": "derivatives_based", - "type": "str", - "description": "This field is populated if the ETF holds either listed or over-the-counter derivatives in its portfolio.", - "default": null, - "optional": true - }, - { - "name": "income_category", - "type": "str", - "description": "Identifies if an Exchange Traded Fund (ETF) falls into a category that is specifically designed to provide a high yield or income", - "default": null, - "optional": true - }, - { - "name": "asset_class", - "type": "str", - "description": "Captures the underlying nature of the securities in the Exchanged Traded Product (ETP).", - "default": null, - "optional": true - }, - { - "name": "other_asset_types", - "type": "str", - "description": "If 'asset_class' field is classified as 'Other Asset Types' this field captures the specific category of the underlying assets.", - "default": null, - "optional": true - }, - { - "name": "single_category_designation", - "type": "str", - "description": "This categorization is created for those users who want every ETF to be 'forced' into a single bucket, so that the assets for all categories will always sum to the total market.", - "default": null, - "optional": true - }, - { - "name": "beta_type", - "type": "str", - "description": "This field identifies whether an ETF provides 'Traditional' beta exposure or 'Smart' beta exposure. ETFs that are active (i.e. non-indexed), leveraged / inverse or have a proprietary quant model (i.e. that don't provide indexed exposure to a targeted factor) are classified separately.", - "default": null, - "optional": true - }, - { - "name": "beta_details", - "type": "str", - "description": "This field provides further detail within the traditional and smart beta categories.", - "default": null, - "optional": true - }, - { - "name": "market_cap_range", - "type": "str", - "description": "Equity ETFs are classified as falling into categories based on the description of their investment strategy in the prospectus. Examples ('Mega Cap', 'Large Cap', 'Mid Cap', etc.)", - "default": null, - "optional": true - }, - { - "name": "market_cap_weighting_type", - "type": "str", - "description": "For ETFs that take the value 'Market Cap Weighted' in the 'index_weighting_scheme' field, this field provides detail on the market cap weighting type.", - "default": null, - "optional": true - }, - { - "name": "index_weighting_scheme", - "type": "str", - "description": "For ETFs that track an underlying index, this field provides detail on the index weighting type.", - "default": null, - "optional": true - }, - { - "name": "index_linked", - "type": "str", - "description": "This field identifies whether an ETF is index linked or active.", - "default": null, - "optional": true - }, - { - "name": "index_name", - "type": "str", - "description": "This field identifies the name of the underlying index tracked by the ETF, if applicable.", - "default": null, - "optional": true - }, - { - "name": "index_symbol", - "type": "str", - "description": "This field identifies the OpenFIGI ticker for the Index underlying the ETF.", - "default": null, - "optional": true - }, - { - "name": "parent_index", - "type": "str", - "description": "This field identifies the name of the parent index, which represents the broader universe from which the index underlying the ETF is created, if applicable.", - "default": null, - "optional": true - }, - { - "name": "index_family", - "type": "str", - "description": "This field identifies the index family to which the index underlying the ETF belongs. The index family is represented as categorized by the index provider.", - "default": null, - "optional": true - }, - { - "name": "broader_index_family", - "type": "str", - "description": "This field identifies the broader index family to which the index underlying the ETF belongs. The broader index family is represented as categorized by the index provider.", - "default": null, - "optional": true - }, - { - "name": "index_provider", - "type": "str", - "description": "This field identifies the Index provider for the index underlying the ETF, if applicable.", - "default": null, - "optional": true - }, - { - "name": "index_provider_code", - "type": "str", - "description": "This field provides the First Bridge code for each Index provider, corresponding to the index underlying the ETF if applicable.", - "default": null, - "optional": true - }, - { - "name": "replication_structure", - "type": "str", - "description": "The replication structure of the Exchange Traded Product (ETP).", - "default": null, - "optional": true - }, - { - "name": "growth_value_tilt", - "type": "str", - "description": "Classifies equity ETFs as either 'Growth' or Value' based on the stated style tilt in the ETF prospectus. Equity ETFs that do not have a stated style tilt are classified as 'Core / Blend'.", - "default": null, - "optional": true - }, - { - "name": "growth_type", - "type": "str", - "description": "For ETFs that are classified as 'Growth' in 'growth_value_tilt', this field further identifies those where the stocks in the ETF are both selected and weighted based on their growth (style factor) scores.", - "default": null, - "optional": true - }, - { - "name": "value_type", - "type": "str", - "description": "For ETFs that are classified as 'Value' in 'growth_value_tilt', this field further identifies those where the stocks in the ETF are both selected and weighted based on their value (style factor) scores.", - "default": null, - "optional": true - }, - { - "name": "sector", - "type": "str", - "description": "For equity ETFs that aim to provide targeted exposure to a sector or industry, this field identifies the Sector that it provides the exposure to.", - "default": null, - "optional": true - }, - { - "name": "industry", - "type": "str", - "description": "For equity ETFs that aim to provide targeted exposure to an industry, this field identifies the Industry that it provides the exposure to.", - "default": null, - "optional": true - }, - { - "name": "industry_group", - "type": "str", - "description": "For equity ETFs that aim to provide targeted exposure to a sub-industry, this field identifies the sub-Industry that it provides the exposure to.", - "default": null, - "optional": true - }, - { - "name": "cross_sector_theme", - "type": "str", - "description": "For equity ETFs that aim to provide targeted exposure to a specific investment theme that cuts across GICS sectors, this field identifies the specific cross-sector theme. Examples ('Agri-business', 'Natural Resources', 'Green Investing', etc.)", - "default": null, - "optional": true - }, - { - "name": "natural_resources_type", - "type": "str", - "description": "For ETFs that are classified as 'Natural Resources' in the 'cross_sector_theme' field, this field provides further detail on the type of Natural Resources exposure.", - "default": null, - "optional": true - }, - { - "name": "us_or_excludes_us", - "type": "str", - "description": "Takes the value of 'Domestic' for US exposure, 'International' for non-US exposure and 'Global' for exposure that includes all regions including the US.", - "default": null, - "optional": true - }, - { - "name": "developed_emerging", - "type": "str", - "description": "This field identifies the stage of development of the markets that the ETF provides exposure to.", - "default": null, - "optional": true - }, - { - "name": "specialized_region", - "type": "str", - "description": "This field is populated if the ETF provides targeted exposure to a specific type of geography-based grouping that does not fall into a specific country or continent grouping. Examples ('BRIC', 'Chindia', etc.)", - "default": null, - "optional": true - }, - { - "name": "continent", - "type": "str", - "description": "This field is populated if the ETF provides targeted exposure to a specific continent or country within that Continent.", - "default": null, - "optional": true - }, - { - "name": "latin_america_sub_group", - "type": "str", - "description": "For ETFs that are classified as 'Latin America' in the 'continent' field, this field provides further detail on the type of regional exposure.", - "default": null, - "optional": true - }, - { - "name": "europe_sub_group", - "type": "str", - "description": "For ETFs that are classified as 'Europe' in the 'continent' field, this field provides further detail on the type of regional exposure.", - "default": null, - "optional": true - }, - { - "name": "asia_sub_group", - "type": "str", - "description": "For ETFs that are classified as 'Asia' in the 'continent' field, this field provides further detail on the type of regional exposure.", - "default": null, - "optional": true - }, - { - "name": "specific_country", - "type": "str", - "description": "This field is populated if the ETF provides targeted exposure to a specific country.", - "default": null, - "optional": true - }, - { - "name": "china_listing_location", - "type": "str", - "description": "For ETFs that are classified as 'China' in the 'country' field, this field provides further detail on the type of exposure in the underlying securities.", - "default": null, - "optional": true - }, - { - "name": "us_state", - "type": "str", - "description": "Takes the value of a US state if the ETF provides targeted exposure to the municipal bonds or equities of companies.", - "default": null, - "optional": true - }, - { - "name": "real_estate", - "type": "str", - "description": "For ETFs that provide targeted real estate exposure, this field is populated if the ETF provides targeted exposure to a specific segment of the real estate market.", - "default": null, - "optional": true - }, - { - "name": "fundamental_weighting_type", - "type": "str", - "description": "For ETFs that take the value 'Fundamental Weighted' in the 'index_weighting_scheme' field, this field provides detail on the fundamental weighting methodology.", - "default": null, - "optional": true - }, - { - "name": "dividend_weighting_type", - "type": "str", - "description": "For ETFs that take the value 'Dividend Weighted' in the 'index_weighting_scheme' field, this field provides detail on the dividend weighting methodology.", - "default": null, - "optional": true - }, - { - "name": "bond_type", - "type": "str", - "description": "For ETFs where 'asset_class_type' is 'Bonds', this field provides detail on the type of bonds held in the ETF.", - "default": null, - "optional": true - }, - { - "name": "government_bond_types", - "type": "str", - "description": "For bond ETFs that take the value 'Treasury & Government' in 'bond_type', this field provides detail on the exposure.", - "default": null, - "optional": true - }, - { - "name": "municipal_bond_region", - "type": "str", - "description": "For bond ETFs that take the value 'Municipal' in 'bond_type', this field provides additional detail on the geographic exposure.", - "default": null, - "optional": true - }, - { - "name": "municipal_vrdo", - "type": "bool", - "description": "For bond ETFs that take the value 'Municipal' in 'bond_type', this field identifies those ETFs that specifically provide exposure to Variable Rate Demand Obligations.", - "default": null, - "optional": true - }, - { - "name": "mortgage_bond_types", - "type": "str", - "description": "For bond ETFs that take the value 'Mortgage' in 'bond_type', this field provides additional detail on the type of underlying securities.", - "default": null, - "optional": true - }, - { - "name": "bond_tax_status", - "type": "str", - "description": "For all US bond ETFs, this field provides additional detail on the tax treatment of the underlying securities.", - "default": null, - "optional": true - }, - { - "name": "credit_quality", - "type": "str", - "description": "For all bond ETFs, this field helps to identify if the ETF provides targeted exposure to securities of a specific credit quality range.", - "default": null, - "optional": true - }, - { - "name": "average_maturity", - "type": "str", - "description": "For all bond ETFs, this field helps to identify if the ETF provides targeted exposure to securities of a specific maturity range.", - "default": null, - "optional": true - }, - { - "name": "specific_maturity_year", - "type": "int", - "description": "For all bond ETFs that take the value 'Specific Maturity Year' in the 'average_maturity' field, this field specifies the calendar year.", - "default": null, - "optional": true - }, - { - "name": "commodity_types", - "type": "str", - "description": "For ETFs where 'asset_class_type' is 'Commodities', this field provides detail on the type of commodities held in the ETF.", - "default": null, - "optional": true - }, - { - "name": "energy_type", - "type": "str", - "description": "For ETFs where 'commodity_type' is 'Energy', this field provides detail on the type of energy exposure provided by the ETF.", - "default": null, - "optional": true - }, - { - "name": "agricultural_type", - "type": "str", - "description": "For ETFs where 'commodity_type' is 'Agricultural', this field provides detail on the type of agricultural exposure provided by the ETF.", - "default": null, - "optional": true - }, - { - "name": "livestock_type", - "type": "str", - "description": "For ETFs where 'commodity_type' is 'Livestock', this field provides detail on the type of livestock exposure provided by the ETF.", - "default": null, - "optional": true - }, - { - "name": "metal_type", - "type": "str", - "description": "For ETFs where 'commodity_type' is 'Gold & Metals', this field provides detail on the type of exposure provided by the ETF.", - "default": null, - "optional": true - }, - { - "name": "inverse_leveraged", - "type": "str", - "description": "This field is populated if the ETF provides inverse or leveraged exposure.", - "default": null, - "optional": true - }, - { - "name": "target_date_multi_asset_type", - "type": "str", - "description": "For ETFs where 'asset_class_type' is 'Target Date / MultiAsset', this field provides detail on the type of commodities held in the ETF.", - "default": null, - "optional": true - }, - { - "name": "currency_pair", - "type": "str", - "description": "This field is populated if the ETF's strategy involves providing exposure to the movements of a currency or involves hedging currency exposure.", - "default": null, - "optional": true - }, - { - "name": "social_environmental_type", - "type": "str", - "description": "This field is populated if the ETF's strategy involves providing exposure to a specific social or environmental theme.", - "default": null, - "optional": true - }, - { - "name": "clean_energy_type", - "type": "str", - "description": "This field is populated if the ETF has a value of 'Clean Energy' in the 'social_environmental_type' field.", - "default": null, - "optional": true - }, - { - "name": "dividend_type", - "type": "str", - "description": "This field is populated if the ETF has an intended investment objective of holding dividend-oriented stocks as stated in the prospectus.", - "default": null, - "optional": true - }, - { - "name": "regular_dividend_payor_type", - "type": "str", - "description": "This field is populated if the ETF has a value of'Dividend - Regular Payors' in the 'dividend_type' field.", - "default": null, - "optional": true - }, - { - "name": "quant_strategies_type", - "type": "str", - "description": "This field is populated if the ETF has either an index-linked or active strategy that is based on a proprietary quantitative strategy.", - "default": null, - "optional": true - }, - { - "name": "other_quant_models", - "type": "str", - "description": "For ETFs where 'quant_strategies_type' is 'Other Quant Model', this field provides the name of the specific proprietary quant model used as the underlying strategy for the ETF.", - "default": null, - "optional": true - }, - { - "name": "hedge_fund_type", - "type": "str", - "description": "For ETFs where 'other_asset_types' is 'Hedge Fund Replication', this field provides detail on the type of hedge fund replication strategy.", - "default": null, - "optional": true - }, - { - "name": "excludes_financials", - "type": "bool", - "description": "For equity ETFs, identifies those ETFs where the underlying fund holdings will not hold financials stocks, based on the funds intended objective.", - "default": null, - "optional": true - }, - { - "name": "excludes_technology", - "type": "bool", - "description": "For equity ETFs, identifies those ETFs where the underlying fund holdings will not hold technology stocks, based on the funds intended objective.", - "default": null, - "optional": true - }, - { - "name": "holds_only_nyse_stocks", - "type": "bool", - "description": "If true, the ETF is an equity ETF and holds only stocks listed on NYSE.", - "default": null, - "optional": true - }, - { - "name": "holds_only_nasdaq_stocks", - "type": "bool", - "description": "If true, the ETF is an equity ETF and holds only stocks listed on Nasdaq.", - "default": null, - "optional": true - }, - { - "name": "holds_mlp", - "type": "bool", - "description": "If true, the ETF's investment objective explicitly specifies that it holds MLPs as an intended part of its investment strategy.", - "default": null, - "optional": true - }, - { - "name": "holds_preferred_stock", - "type": "bool", - "description": "If true, the ETF's investment objective explicitly specifies that it holds preferred stock as an intended part of its investment strategy.", - "default": null, - "optional": true - }, - { - "name": "holds_closed_end_funds", - "type": "bool", - "description": "If true, the ETF's investment objective explicitly specifies that it holds closed end funds as an intended part of its investment strategy.", - "default": null, - "optional": true - }, - { - "name": "holds_adr", - "type": "bool", - "description": "If true, he ETF's investment objective explicitly specifies that it holds American Depositary Receipts (ADRs) as an intended part of its investment strategy.", - "default": null, - "optional": true - }, - { - "name": "laddered", - "type": "bool", - "description": "For bond ETFs, this field identifies those ETFs that specifically hold bonds in a laddered structure, where the bonds are scheduled to mature in an annual, sequential structure.", - "default": null, - "optional": true - }, - { - "name": "zero_coupon", - "type": "bool", - "description": "For bond ETFs, this field identifies those ETFs that specifically hold zero coupon Treasury Bills.", - "default": null, - "optional": true - }, - { - "name": "floating_rate", - "type": "bool", - "description": "For bond ETFs, this field identifies those ETFs that specifically hold floating rate bonds.", - "default": null, - "optional": true - }, - { - "name": "build_america_bonds", - "type": "bool", - "description": "For municipal bond ETFs, this field identifies those ETFs that specifically hold Build America Bonds.", - "default": null, - "optional": true - }, - { - "name": "dynamic_futures_roll", - "type": "bool", - "description": "If the product holds futures contracts, this field identifies those products where the roll strategy is dynamic (rather than entirely rules based), so as to minimize roll costs.", - "default": null, - "optional": true - }, - { - "name": "currency_hedged", - "type": "bool", - "description": "This field is populated if the ETF's strategy involves hedging currency exposure.", - "default": null, - "optional": true - }, - { - "name": "includes_short_exposure", - "type": "bool", - "description": "This field is populated if the ETF has short exposure in any of its holdings e.g. in a long/short or inverse ETF.", - "default": null, - "optional": true - }, - { - "name": "ucits", - "type": "bool", - "description": "If true, the Exchange Traded Product (ETP) is Undertakings for the Collective Investment in Transferable Securities (UCITS) compliant", - "default": null, - "optional": true - }, - { - "name": "registered_countries", - "type": "str", - "description": "The list of countries where the ETF is legally registered for sale. This may differ from where the ETF is domiciled or traded, particularly in Europe.", - "default": null, - "optional": true - }, - { - "name": "issuer_country", - "type": "str", - "description": "2 letter ISO country code for the country where the issuer is located.", - "default": null, - "optional": true - }, - { - "name": "domicile", - "type": "str", - "description": "2 letter ISO country code for the country where the ETP is domiciled.", - "default": null, - "optional": true - }, - { - "name": "listing_country", - "type": "str", - "description": "2 letter ISO country code for the country of the primary listing.", - "default": null, - "optional": true - }, - { - "name": "listing_region", - "type": "str", - "description": "Geographic region in the country of the primary listing falls.", - "default": null, - "optional": true - }, - { - "name": "bond_currency_denomination", - "type": "str", - "description": "For all bond ETFs, this field provides additional detail on the currency denomination of the underlying securities.", - "default": null, - "optional": true - }, - { - "name": "base_currency", - "type": "str", - "description": "Base currency in which NAV is reported.", - "default": null, - "optional": true - }, - { - "name": "listing_currency", - "type": "str", - "description": "Listing currency of the Exchange Traded Product (ETP) in which it is traded. Reported using the 3-digit ISO currency code.", - "default": null, - "optional": true - }, - { - "name": "number_of_holdings", - "type": "int", - "description": "The number of holdings in the ETF.", - "default": null, - "optional": true - }, - { - "name": "month_end_assets", - "type": "float", - "description": "Net assets in millions of dollars as of the most recent month end.", - "default": null, - "optional": true - }, - { - "name": "net_expense_ratio", - "type": "float", - "description": "Gross expense net of Fee Waivers, as a percentage of net assets as published by the ETF issuer.", - "default": null, - "optional": true - }, - { - "name": "etf_portfolio_turnover", - "type": "float", - "description": "The percentage of positions turned over in the last 12 months.", - "default": null, - "optional": true - } - ], - "yfinance": [ - { - "name": "fund_type", - "type": "str", - "description": "The legal type of fund.", - "default": null, - "optional": true - }, - { - "name": "fund_family", - "type": "str", - "description": "The fund family.", - "default": null, - "optional": true - }, - { - "name": "category", - "type": "str", - "description": "The fund category.", - "default": null, - "optional": true - }, - { - "name": "exchange", - "type": "str", - "description": "The exchange the fund is listed on.", - "default": null, - "optional": true - }, - { - "name": "exchange_timezone", - "type": "str", - "description": "The timezone of the exchange.", - "default": null, - "optional": true - }, - { - "name": "currency", - "type": "str", - "description": "The currency in which the fund is listed.", - "default": null, - "optional": true - }, - { - "name": "nav_price", - "type": "float", - "description": "The net asset value per unit of the fund.", - "default": null, - "optional": true - }, - { - "name": "total_assets", - "type": "int", - "description": "The total value of assets held by the fund.", - "default": null, - "optional": true - }, - { - "name": "trailing_pe", - "type": "float", - "description": "The trailing twelve month P/E ratio of the fund's assets.", - "default": null, - "optional": true - }, - { - "name": "dividend_yield", - "type": "float", - "description": "The dividend yield of the fund, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "dividend_rate_ttm", - "type": "float", - "description": "The trailing twelve month annual dividend rate of the fund, in currency units.", - "default": null, - "optional": true - }, - { - "name": "dividend_yield_ttm", - "type": "float", - "description": "The trailing twelve month annual dividend yield of the fund, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "year_high", - "type": "float", - "description": "The fifty-two week high price.", - "default": null, - "optional": true - }, - { - "name": "year_low", - "type": "float", - "description": "The fifty-two week low price.", - "default": null, - "optional": true - }, - { - "name": "ma_50d", - "type": "float", - "description": "50-day moving average price.", - "default": null, - "optional": true - }, - { - "name": "ma_200d", - "type": "float", - "description": "200-day moving average price.", - "default": null, - "optional": true - }, - { - "name": "return_ytd", - "type": "float", - "description": "The year-to-date return of the fund, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "return_3y_avg", - "type": "float", - "description": "The three year average return of the fund, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "return_5y_avg", - "type": "float", - "description": "The five year average return of the fund, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "beta_3y_avg", - "type": "float", - "description": "The three year average beta of the fund.", - "default": null, - "optional": true - }, - { - "name": "volume_avg", - "type": "float", - "description": "The average daily trading volume of the fund.", - "default": null, - "optional": true - }, - { - "name": "volume_avg_10d", - "type": "float", - "description": "The average daily trading volume of the fund over the past ten days.", - "default": null, - "optional": true - }, - { - "name": "bid", - "type": "float", - "description": "The current bid price.", - "default": null, - "optional": true - }, - { - "name": "bid_size", - "type": "float", - "description": "The current bid size.", - "default": null, - "optional": true - }, - { - "name": "ask", - "type": "float", - "description": "The current ask price.", - "default": null, - "optional": true - }, - { - "name": "ask_size", - "type": "float", - "description": "The current ask size.", - "default": null, - "optional": true - }, - { - "name": "open", - "type": "float", - "description": "The open price of the most recent trading session.", - "default": null, - "optional": true - }, - { - "name": "high", - "type": "float", - "description": "The highest price of the most recent trading session.", - "default": null, - "optional": true - }, - { - "name": "low", - "type": "float", - "description": "The lowest price of the most recent trading session.", - "default": null, - "optional": true - }, - { - "name": "volume", - "type": "int", - "description": "The trading volume of the most recent trading session.", - "default": null, - "optional": true - }, - { - "name": "prev_close", - "type": "float", - "description": "The previous closing price.", - "default": null, - "optional": true - } - ] - }, - "model": "EtfInfo" - }, - "/etf/sectors": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "ETF Sector weighting.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.etf.sectors(symbol='SPY', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for. (ETF)", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EtfSectors]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "sector", - "type": "str", - "description": "Sector of exposure.", - "default": "", - "optional": false - }, - { - "name": "weight", - "type": "float", - "description": "Exposure of the ETF to the sector in normalized percentage points.", - "default": "", - "optional": false - } - ], - "fmp": [] - }, - "model": "EtfSectors" - }, - "/etf/countries": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "ETF Country weighting.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.etf.countries(symbol='VT', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. (ETF) Multiple items allowed for provider(s): fmp.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EtfCountries]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "country", - "type": "str", - "description": "The country of the exposure. Corresponding values are normalized percentage points.", - "default": "", - "optional": false - } - ], - "fmp": [] - }, - "model": "EtfCountries" - }, - "/etf/price_performance": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Price performance as a return, over different periods.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.etf.price_performance(symbol='QQQ', provider='fmp')\nobb.etf.price_performance(symbol='SPY,QQQ,IWM,DJIA', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['fmp', 'intrinio']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [], - "intrinio": [ - { - "name": "return_type", - "type": "Literal['trailing', 'calendar']", - "description": "The type of returns to return, a trailing or calendar window.", - "default": "trailing", - "optional": true - }, - { - "name": "adjustment", - "type": "Literal['splits_only', 'splits_and_dividends']", - "description": "The adjustment factor, 'splits_only' will return pure price performance.", - "default": "splits_and_dividends", - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EtfPricePerformance]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'intrinio']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": null, - "optional": true - }, - { - "name": "one_day", - "type": "float", - "description": "One-day return.", - "default": null, - "optional": true - }, - { - "name": "wtd", - "type": "float", - "description": "Week to date return.", - "default": null, - "optional": true - }, - { - "name": "one_week", - "type": "float", - "description": "One-week return.", - "default": null, - "optional": true - }, - { - "name": "mtd", - "type": "float", - "description": "Month to date return.", - "default": null, - "optional": true - }, - { - "name": "one_month", - "type": "float", - "description": "One-month return.", - "default": null, - "optional": true - }, - { - "name": "qtd", - "type": "float", - "description": "Quarter to date return.", - "default": null, - "optional": true - }, - { - "name": "three_month", - "type": "float", - "description": "Three-month return.", - "default": null, - "optional": true - }, - { - "name": "six_month", - "type": "float", - "description": "Six-month return.", - "default": null, - "optional": true - }, - { - "name": "ytd", - "type": "float", - "description": "Year to date return.", - "default": null, - "optional": true - }, - { - "name": "one_year", - "type": "float", - "description": "One-year return.", - "default": null, - "optional": true - }, - { - "name": "two_year", - "type": "float", - "description": "Two-year return.", - "default": null, - "optional": true - }, - { - "name": "three_year", - "type": "float", - "description": "Three-year return.", - "default": null, - "optional": true - }, - { - "name": "four_year", - "type": "float", - "description": "Four-year", - "default": null, - "optional": true - }, - { - "name": "five_year", - "type": "float", - "description": "Five-year return.", - "default": null, - "optional": true - }, - { - "name": "ten_year", - "type": "float", - "description": "Ten-year return.", - "default": null, - "optional": true - }, - { - "name": "max", - "type": "float", - "description": "Return from the beginning of the time series.", - "default": null, - "optional": true - } - ], - "fmp": [], - "intrinio": [ - { - "name": "max_annualized", - "type": "float", - "description": "Annualized rate of return from inception.", - "default": null, - "optional": true - }, - { - "name": "volatility_one_year", - "type": "float", - "description": "Trailing one-year annualized volatility.", - "default": null, - "optional": true - }, - { - "name": "volatility_three_year", - "type": "float", - "description": "Trailing three-year annualized volatility.", - "default": null, - "optional": true - }, - { - "name": "volatility_five_year", - "type": "float", - "description": "Trailing five-year annualized volatility.", - "default": null, - "optional": true - }, - { - "name": "volume", - "type": "int", - "description": "The trading volume.", - "default": null, - "optional": true - }, - { - "name": "volume_avg_30", - "type": "float", - "description": "The one-month average daily volume.", - "default": null, - "optional": true - }, - { - "name": "volume_avg_90", - "type": "float", - "description": "The three-month average daily volume.", - "default": null, - "optional": true - }, - { - "name": "volume_avg_180", - "type": "float", - "description": "The six-month average daily volume.", - "default": null, - "optional": true - }, - { - "name": "beta", - "type": "float", - "description": "Beta compared to the S&P 500.", - "default": null, - "optional": true - }, - { - "name": "nav", - "type": "float", - "description": "Net asset value per share.", - "default": null, - "optional": true - }, - { - "name": "year_high", - "type": "float", - "description": "The 52-week high price.", - "default": null, - "optional": true - }, - { - "name": "year_low", - "type": "float", - "description": "The 52-week low price.", - "default": null, - "optional": true - }, - { - "name": "market_cap", - "type": "float", - "description": "The market capitalization.", - "default": null, - "optional": true - }, - { - "name": "shares_outstanding", - "type": "int", - "description": "The number of shares outstanding.", - "default": null, - "optional": true - }, - { - "name": "updated", - "type": "date", - "description": "The date of the data.", - "default": null, - "optional": true - } - ] - }, - "model": "EtfPricePerformance" - }, - "/etf/holdings": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get the holdings for an individual ETF.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.etf.holdings(symbol='XLK', provider='fmp')\n# Including a date (FMP, SEC) will return the holdings as per NPORT-P filings.\nobb.etf.holdings(symbol='XLK', date=2022-03-31, provider='fmp')\n# The same data can be returned from the SEC directly.\nobb.etf.holdings(symbol='XLK', date=2022-03-31, provider='sec')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for. (ETF)", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['fmp', 'intrinio', 'sec']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [ - { - "name": "date", - "type": "Union[Union[str, date], str]", - "description": "A specific date to get data for. Entering a date will attempt to return the NPORT-P filing for the entered date. This needs to be _exactly_ the date of the filing. Use the holdings_date command/endpoint to find available filing dates for the ETF.", - "default": null, - "optional": true - }, - { - "name": "cik", - "type": "str", - "description": "The CIK of the filing entity. Overrides symbol.", - "default": null, - "optional": true - } - ], - "intrinio": [], - "sec": [ - { - "name": "date", - "type": "Union[Union[str, date], str]", - "description": "A specific date to get data for. The date represents the period ending. The date entered will return the closest filing.", - "default": null, - "optional": true - }, - { - "name": "use_cache", - "type": "bool", - "description": "Whether or not to use cache for the request.", - "default": true, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EtfHoldings]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'intrinio', 'sec']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data. (ETF)", - "default": null, - "optional": true - }, - { - "name": "name", - "type": "str", - "description": "Name of the ETF holding.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "lei", - "type": "str", - "description": "The LEI of the holding.", - "default": null, - "optional": true - }, - { - "name": "title", - "type": "str", - "description": "The title of the holding.", - "default": null, - "optional": true - }, - { - "name": "cusip", - "type": "str", - "description": "The CUSIP of the holding.", - "default": null, - "optional": true - }, - { - "name": "isin", - "type": "str", - "description": "The ISIN of the holding.", - "default": null, - "optional": true - }, - { - "name": "balance", - "type": "int", - "description": "The balance of the holding, in shares or units.", - "default": null, - "optional": true - }, - { - "name": "units", - "type": "Union[str, float]", - "description": "The type of units.", - "default": null, - "optional": true - }, - { - "name": "currency", - "type": "str", - "description": "The currency of the holding.", - "default": null, - "optional": true - }, - { - "name": "value", - "type": "float", - "description": "The value of the holding, in dollars.", - "default": null, - "optional": true - }, - { - "name": "weight", - "type": "float", - "description": "The weight of the holding, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "payoff_profile", - "type": "str", - "description": "The payoff profile of the holding.", - "default": null, - "optional": true - }, - { - "name": "asset_category", - "type": "str", - "description": "The asset category of the holding.", - "default": null, - "optional": true - }, - { - "name": "issuer_category", - "type": "str", - "description": "The issuer category of the holding.", - "default": null, - "optional": true - }, - { - "name": "country", - "type": "str", - "description": "The country of the holding.", - "default": null, - "optional": true - }, - { - "name": "is_restricted", - "type": "str", - "description": "Whether the holding is restricted.", - "default": null, - "optional": true - }, - { - "name": "fair_value_level", - "type": "int", - "description": "The fair value level of the holding.", - "default": null, - "optional": true - }, - { - "name": "is_cash_collateral", - "type": "str", - "description": "Whether the holding is cash collateral.", - "default": null, - "optional": true - }, - { - "name": "is_non_cash_collateral", - "type": "str", - "description": "Whether the holding is non-cash collateral.", - "default": null, - "optional": true - }, - { - "name": "is_loan_by_fund", - "type": "str", - "description": "Whether the holding is loan by fund.", - "default": null, - "optional": true - }, - { - "name": "cik", - "type": "str", - "description": "The CIK of the filing.", - "default": null, - "optional": true - }, - { - "name": "acceptance_datetime", - "type": "str", - "description": "The acceptance datetime of the filing.", - "default": null, - "optional": true - }, - { - "name": "updated", - "type": "Union[date, datetime]", - "description": "The date the data was updated.", - "default": null, - "optional": true - } - ], - "intrinio": [ - { - "name": "security_type", - "type": "str", - "description": "The type of instrument for this holding. Examples(Bond='BOND', Equity='EQUI')", - "default": null, - "optional": true - }, - { - "name": "isin", - "type": "str", - "description": "The International Securities Identification Number.", - "default": null, - "optional": true - }, - { - "name": "ric", - "type": "str", - "description": "The Reuters Instrument Code.", - "default": null, - "optional": true - }, - { - "name": "sedol", - "type": "str", - "description": "The Stock Exchange Daily Official List.", - "default": null, - "optional": true - }, - { - "name": "share_class_figi", - "type": "str", - "description": "The OpenFIGI symbol for the holding.", - "default": null, - "optional": true - }, - { - "name": "country", - "type": "str", - "description": "The country or region of the holding.", - "default": null, - "optional": true - }, - { - "name": "maturity_date", - "type": "date", - "description": "The maturity date for the debt security, if available.", - "default": null, - "optional": true - }, - { - "name": "contract_expiry_date", - "type": "date", - "description": "Expiry date for the futures contract held, if available.", - "default": null, - "optional": true - }, - { - "name": "coupon", - "type": "float", - "description": "The coupon rate of the debt security, if available.", - "default": null, - "optional": true - }, - { - "name": "balance", - "type": "Union[float, int]", - "description": "The number of units of the security held, if available.", - "default": null, - "optional": true - }, - { - "name": "unit", - "type": "str", - "description": "The units of the 'balance' field.", - "default": null, - "optional": true - }, - { - "name": "units_per_share", - "type": "float", - "description": "Number of units of the security held per share outstanding of the ETF, if available.", - "default": null, - "optional": true - }, - { - "name": "face_value", - "type": "float", - "description": "The face value of the debt security, if available.", - "default": null, - "optional": true - }, - { - "name": "derivatives_value", - "type": "float", - "description": "The notional value of derivatives contracts held.", - "default": null, - "optional": true - }, - { - "name": "value", - "type": "float", - "description": "The market value of the holding, on the 'as_of' date.", - "default": null, - "optional": true - }, - { - "name": "weight", - "type": "float", - "description": "The weight of the holding, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "updated", - "type": "date", - "description": "The 'as_of' date for the holding.", - "default": null, - "optional": true - } - ], - "sec": [ - { - "name": "lei", - "type": "str", - "description": "The LEI of the holding.", - "default": null, - "optional": true - }, - { - "name": "cusip", - "type": "str", - "description": "The CUSIP of the holding.", - "default": null, - "optional": true - }, - { - "name": "isin", - "type": "str", - "description": "The ISIN of the holding.", - "default": null, - "optional": true - }, - { - "name": "other_id", - "type": "str", - "description": "Internal identifier for the holding.", - "default": null, - "optional": true - }, - { - "name": "balance", - "type": "float", - "description": "The balance of the holding.", - "default": null, - "optional": true - }, - { - "name": "weight", - "type": "float", - "description": "The weight of the holding in ETF in %.", - "default": null, - "optional": true - }, - { - "name": "value", - "type": "float", - "description": "The value of the holding in USD.", - "default": null, - "optional": true - }, - { - "name": "payoff_profile", - "type": "str", - "description": "The payoff profile of the holding.", - "default": null, - "optional": true - }, - { - "name": "units", - "type": "Union[str, float]", - "description": "The units of the holding.", - "default": null, - "optional": true - }, - { - "name": "currency", - "type": "str", - "description": "The currency of the holding.", - "default": null, - "optional": true - }, - { - "name": "asset_category", - "type": "str", - "description": "The asset category of the holding.", - "default": null, - "optional": true - }, - { - "name": "issuer_category", - "type": "str", - "description": "The issuer category of the holding.", - "default": null, - "optional": true - }, - { - "name": "country", - "type": "str", - "description": "The country of the holding.", - "default": null, - "optional": true - }, - { - "name": "is_restricted", - "type": "str", - "description": "Whether the holding is restricted.", - "default": null, - "optional": true - }, - { - "name": "fair_value_level", - "type": "int", - "description": "The fair value level of the holding.", - "default": null, - "optional": true - }, - { - "name": "is_cash_collateral", - "type": "str", - "description": "Whether the holding is cash collateral.", - "default": null, - "optional": true - }, - { - "name": "is_non_cash_collateral", - "type": "str", - "description": "Whether the holding is non-cash collateral.", - "default": null, - "optional": true - }, - { - "name": "is_loan_by_fund", - "type": "str", - "description": "Whether the holding is loan by fund.", - "default": null, - "optional": true - }, - { - "name": "loan_value", - "type": "float", - "description": "The loan value of the holding.", - "default": null, - "optional": true - }, - { - "name": "issuer_conditional", - "type": "str", - "description": "The issuer conditions of the holding.", - "default": null, - "optional": true - }, - { - "name": "asset_conditional", - "type": "str", - "description": "The asset conditions of the holding.", - "default": null, - "optional": true - }, - { - "name": "maturity_date", - "type": "date", - "description": "The maturity date of the debt security.", - "default": null, - "optional": true - }, - { - "name": "coupon_kind", - "type": "str", - "description": "The type of coupon for the debt security.", - "default": null, - "optional": true - }, - { - "name": "rate_type", - "type": "str", - "description": "The type of rate for the debt security, floating or fixed.", - "default": null, - "optional": true - }, - { - "name": "annualized_return", - "type": "float", - "description": "The annualized return on the debt security.", - "default": null, - "optional": true - }, - { - "name": "is_default", - "type": "str", - "description": "If the debt security is defaulted.", - "default": null, - "optional": true - }, - { - "name": "in_arrears", - "type": "str", - "description": "If the debt security is in arrears.", - "default": null, - "optional": true - }, - { - "name": "is_paid_kind", - "type": "str", - "description": "If the debt security payments are paid in kind.", - "default": null, - "optional": true - }, - { - "name": "derivative_category", - "type": "str", - "description": "The derivative category of the holding.", - "default": null, - "optional": true - }, - { - "name": "counterparty", - "type": "str", - "description": "The counterparty of the derivative.", - "default": null, - "optional": true - }, - { - "name": "underlying_name", - "type": "str", - "description": "The name of the underlying asset associated with the derivative.", - "default": null, - "optional": true - }, - { - "name": "option_type", - "type": "str", - "description": "The type of option.", - "default": null, - "optional": true - }, - { - "name": "derivative_payoff", - "type": "str", - "description": "The payoff profile of the derivative.", - "default": null, - "optional": true - }, - { - "name": "expiry_date", - "type": "date", - "description": "The expiry or termination date of the derivative.", - "default": null, - "optional": true - }, - { - "name": "exercise_price", - "type": "float", - "description": "The exercise price of the option.", - "default": null, - "optional": true - }, - { - "name": "exercise_currency", - "type": "str", - "description": "The currency of the option exercise price.", - "default": null, - "optional": true - }, - { - "name": "shares_per_contract", - "type": "float", - "description": "The number of shares per contract.", - "default": null, - "optional": true - }, - { - "name": "delta", - "type": "Union[str, float]", - "description": "The delta of the option.", - "default": null, - "optional": true - }, - { - "name": "rate_type_rec", - "type": "str", - "description": "The type of rate for reveivable portion of the swap.", - "default": null, - "optional": true - }, - { - "name": "receive_currency", - "type": "str", - "description": "The receive currency of the swap.", - "default": null, - "optional": true - }, - { - "name": "upfront_receive", - "type": "float", - "description": "The upfront amount received of the swap.", - "default": null, - "optional": true - }, - { - "name": "floating_rate_index_rec", - "type": "str", - "description": "The floating rate index for reveivable portion of the swap.", - "default": null, - "optional": true - }, - { - "name": "floating_rate_spread_rec", - "type": "float", - "description": "The floating rate spread for reveivable portion of the swap.", - "default": null, - "optional": true - }, - { - "name": "rate_tenor_rec", - "type": "str", - "description": "The rate tenor for reveivable portion of the swap.", - "default": null, - "optional": true - }, - { - "name": "rate_tenor_unit_rec", - "type": "Union[int, str]", - "description": "The rate tenor unit for reveivable portion of the swap.", - "default": null, - "optional": true - }, - { - "name": "reset_date_rec", - "type": "str", - "description": "The reset date for reveivable portion of the swap.", - "default": null, - "optional": true - }, - { - "name": "reset_date_unit_rec", - "type": "Union[int, str]", - "description": "The reset date unit for reveivable portion of the swap.", - "default": null, - "optional": true - }, - { - "name": "rate_type_pmnt", - "type": "str", - "description": "The type of rate for payment portion of the swap.", - "default": null, - "optional": true - }, - { - "name": "payment_currency", - "type": "str", - "description": "The payment currency of the swap.", - "default": null, - "optional": true - }, - { - "name": "upfront_payment", - "type": "float", - "description": "The upfront amount received of the swap.", - "default": null, - "optional": true - }, - { - "name": "floating_rate_index_pmnt", - "type": "str", - "description": "The floating rate index for payment portion of the swap.", - "default": null, - "optional": true - }, - { - "name": "floating_rate_spread_pmnt", - "type": "float", - "description": "The floating rate spread for payment portion of the swap.", - "default": null, - "optional": true - }, - { - "name": "rate_tenor_pmnt", - "type": "str", - "description": "The rate tenor for payment portion of the swap.", - "default": null, - "optional": true - }, - { - "name": "rate_tenor_unit_pmnt", - "type": "Union[int, str]", - "description": "The rate tenor unit for payment portion of the swap.", - "default": null, - "optional": true - }, - { - "name": "reset_date_pmnt", - "type": "str", - "description": "The reset date for payment portion of the swap.", - "default": null, - "optional": true - }, - { - "name": "reset_date_unit_pmnt", - "type": "Union[int, str]", - "description": "The reset date unit for payment portion of the swap.", - "default": null, - "optional": true - }, - { - "name": "repo_type", - "type": "str", - "description": "The type of repo.", - "default": null, - "optional": true - }, - { - "name": "is_cleared", - "type": "str", - "description": "If the repo is cleared.", - "default": null, - "optional": true - }, - { - "name": "is_tri_party", - "type": "str", - "description": "If the repo is tri party.", - "default": null, - "optional": true - }, - { - "name": "principal_amount", - "type": "float", - "description": "The principal amount of the repo.", - "default": null, - "optional": true - }, - { - "name": "principal_currency", - "type": "str", - "description": "The currency of the principal amount.", - "default": null, - "optional": true - }, - { - "name": "collateral_type", - "type": "str", - "description": "The collateral type of the repo.", - "default": null, - "optional": true - }, - { - "name": "collateral_amount", - "type": "float", - "description": "The collateral amount of the repo.", - "default": null, - "optional": true - }, - { - "name": "collateral_currency", - "type": "str", - "description": "The currency of the collateral amount.", - "default": null, - "optional": true - }, - { - "name": "exchange_currency", - "type": "str", - "description": "The currency of the exchange rate.", - "default": null, - "optional": true - }, - { - "name": "exchange_rate", - "type": "float", - "description": "The exchange rate.", - "default": null, - "optional": true - }, - { - "name": "currency_sold", - "type": "str", - "description": "The currency sold in a Forward Derivative.", - "default": null, - "optional": true - }, - { - "name": "currency_amount_sold", - "type": "float", - "description": "The amount of currency sold in a Forward Derivative.", - "default": null, - "optional": true - }, - { - "name": "currency_bought", - "type": "str", - "description": "The currency bought in a Forward Derivative.", - "default": null, - "optional": true - }, - { - "name": "currency_amount_bought", - "type": "float", - "description": "The amount of currency bought in a Forward Derivative.", - "default": null, - "optional": true - }, - { - "name": "notional_amount", - "type": "float", - "description": "The notional amount of the derivative.", - "default": null, - "optional": true - }, - { - "name": "notional_currency", - "type": "str", - "description": "The currency of the derivative's notional amount.", - "default": null, - "optional": true - }, - { - "name": "unrealized_gain", - "type": "float", - "description": "The unrealized gain or loss on the derivative.", - "default": null, - "optional": true - } - ] - }, - "model": "EtfHoldings" - }, - "/etf/holdings_date": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Use this function to get the holdings dates, if available.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.etf.holdings_date(symbol='XLK', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for. (ETF)", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [ - { - "name": "cik", - "type": "str", - "description": "The CIK of the filing entity. Overrides symbol.", - "default": null, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EtfHoldingsDate]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - } - ], - "fmp": [] - }, - "model": "EtfHoldingsDate" - }, - "/etf/holdings_performance": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get the recent price performance of each ticker held in the ETF.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.etf.holdings_performance(symbol='XLK', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EtfHoldingsPerformance]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": null, - "optional": true - }, - { - "name": "one_day", - "type": "float", - "description": "One-day return.", - "default": null, - "optional": true - }, - { - "name": "wtd", - "type": "float", - "description": "Week to date return.", - "default": null, - "optional": true - }, - { - "name": "one_week", - "type": "float", - "description": "One-week return.", - "default": null, - "optional": true - }, - { - "name": "mtd", - "type": "float", - "description": "Month to date return.", - "default": null, - "optional": true - }, - { - "name": "one_month", - "type": "float", - "description": "One-month return.", - "default": null, - "optional": true - }, - { - "name": "qtd", - "type": "float", - "description": "Quarter to date return.", - "default": null, - "optional": true - }, - { - "name": "three_month", - "type": "float", - "description": "Three-month return.", - "default": null, - "optional": true - }, - { - "name": "six_month", - "type": "float", - "description": "Six-month return.", - "default": null, - "optional": true - }, - { - "name": "ytd", - "type": "float", - "description": "Year to date return.", - "default": null, - "optional": true - }, - { - "name": "one_year", - "type": "float", - "description": "One-year return.", - "default": null, - "optional": true - }, - { - "name": "two_year", - "type": "float", - "description": "Two-year return.", - "default": null, - "optional": true - }, - { - "name": "three_year", - "type": "float", - "description": "Three-year return.", - "default": null, - "optional": true - }, - { - "name": "four_year", - "type": "float", - "description": "Four-year", - "default": null, - "optional": true - }, - { - "name": "five_year", - "type": "float", - "description": "Five-year return.", - "default": null, - "optional": true - }, - { - "name": "ten_year", - "type": "float", - "description": "Ten-year return.", - "default": null, - "optional": true - }, - { - "name": "max", - "type": "float", - "description": "Return from the beginning of the time series.", - "default": null, - "optional": true - } - ], - "fmp": [] - }, - "model": "EtfHoldingsPerformance" - }, - "/etf/equity_exposure": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Get the exposure to ETFs for a specific stock.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.etf.equity_exposure(symbol='MSFT', provider='fmp')\n# This function accepts multiple tickers.\nobb.etf.equity_exposure(symbol='MSFT,AAPL', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. (Stock) Multiple items allowed for provider(s): fmp.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EtfEquityExposure]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "equity_symbol", - "type": "str", - "description": "The symbol of the equity requested.", - "default": "", - "optional": false - }, - { - "name": "etf_symbol", - "type": "str", - "description": "The symbol of the ETF with exposure to the requested equity.", - "default": "", - "optional": false - }, - { - "name": "shares", - "type": "float", - "description": "The number of shares held in the ETF.", - "default": null, - "optional": true - }, - { - "name": "weight", - "type": "float", - "description": "The weight of the equity in the ETF, as a normalized percent.", - "default": null, - "optional": true - }, - { - "name": "market_value", - "type": "Union[float, int]", - "description": "The market value of the equity position in the ETF.", - "default": null, - "optional": true - } - ], - "fmp": [] - }, - "model": "EtfEquityExposure" - }, - "/fixedincome/rate/ameribor": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Ameribor.\n\nAmeribor (short for the American interbank offered rate) is a benchmark interest rate that reflects the true cost of\nshort-term interbank borrowing. This rate is based on transactions in overnight unsecured loans conducted on the\nAmerican Financial Exchange (AFX).", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.rate.ameribor(provider='fred')\nobb.fixedincome.rate.ameribor(parameter=30_day_ma, provider='fred')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fred']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", - "default": "fred", - "optional": true - } - ], - "fred": [ - { - "name": "parameter", - "type": "Literal['overnight', 'term_30', 'term_90', '1_week_term_structure', '1_month_term_structure', '3_month_term_structure', '6_month_term_structure', '1_year_term_structure', '2_year_term_structure', '30_day_ma', '90_day_ma']", - "description": "Period of AMERIBOR rate.", - "default": "overnight", - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[AMERIBOR]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fred']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "rate", - "type": "float", - "description": "AMERIBOR rate.", - "default": "", - "optional": false - } - ], - "fred": [] - }, - "model": "AMERIBOR" - }, - "/fixedincome/rate/sonia": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Sterling Overnight Index Average.\n\nSONIA (Sterling Overnight Index Average) is an important interest rate benchmark. SONIA is based on actual\ntransactions and reflects the average of the interest rates that banks pay to borrow sterling overnight from other\nfinancial institutions and other institutional investors.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.rate.sonia(provider='fred')\nobb.fixedincome.rate.sonia(parameter=total_nominal_value, provider='fred')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fred']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", - "default": "fred", - "optional": true - } - ], - "fred": [ - { - "name": "parameter", - "type": "Literal['rate', 'index', '10th_percentile', '25th_percentile', '75th_percentile', '90th_percentile', 'total_nominal_value']", - "description": "Period of SONIA rate.", - "default": "rate", - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[SONIA]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fred']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "rate", - "type": "float", - "description": "SONIA rate.", - "default": "", - "optional": false - } - ], - "fred": [] - }, - "model": "SONIA" - }, - "/fixedincome/rate/iorb": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Interest on Reserve Balances.\n\nGet Interest Rate on Reserve Balances data A bank rate is the interest rate a nation's central bank charges to its\ndomestic banks to borrow money. The rates central banks charge are set to stabilize the economy. In the\nUnited States, the Federal Reserve System's Board of Governors set the bank rate, also known as the discount rate.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.rate.iorb(provider='fred')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fred']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", - "default": "fred", - "optional": true - } - ], - "fred": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[IORB]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fred']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "rate", - "type": "float", - "description": "IORB rate.", - "default": "", - "optional": false - } - ], - "fred": [] - }, - "model": "IORB" - }, - "/fixedincome/rate/effr": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Fed Funds Rate.\n\nGet Effective Federal Funds Rate data. A bank rate is the interest rate a nation's central bank charges to its\ndomestic banks to borrow money. The rates central banks charge are set to stabilize the economy. In the\nUnited States, the Federal Reserve System's Board of Governors set the bank rate, also known as the discount rate.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.rate.effr(provider='fred')\nobb.fixedincome.rate.effr(parameter=daily, provider='fred')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['federal_reserve', 'fred']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'federal_reserve' if there is no default.", - "default": "federal_reserve", - "optional": true - } - ], - "federal_reserve": [], - "fred": [ - { - "name": "parameter", - "type": "Literal['monthly', 'daily', 'weekly', 'daily_excl_weekend', 'annual', 'biweekly', 'volume']", - "description": "Period of FED rate.", - "default": "weekly", - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[FEDFUNDS]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['federal_reserve', 'fred']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "rate", - "type": "float", - "description": "FED rate.", - "default": "", - "optional": false - } - ], - "federal_reserve": [], - "fred": [] - }, - "model": "FEDFUNDS" - }, - "/fixedincome/rate/effr_forecast": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Fed Funds Rate Projections.\n\nThe projections for the federal funds rate are the value of the midpoint of the\nprojected appropriate target range for the federal funds rate or the projected\nappropriate target level for the federal funds rate at the end of the specified\ncalendar year or over the longer run.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.rate.effr_forecast(provider='fred')\nobb.fixedincome.rate.effr_forecast(long_run=True, provider='fred')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "provider", - "type": "Literal['fred']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", - "default": "fred", - "optional": true - } - ], - "fred": [ - { - "name": "long_run", - "type": "bool", - "description": "Flag to show long run projections", - "default": false, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[PROJECTIONS]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fred']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "range_high", - "type": "float", - "description": "High projection of rates.", - "default": "", - "optional": false - }, - { - "name": "central_tendency_high", - "type": "float", - "description": "Central tendency of high projection of rates.", - "default": "", - "optional": false - }, - { - "name": "median", - "type": "float", - "description": "Median projection of rates.", - "default": "", - "optional": false - }, - { - "name": "range_midpoint", - "type": "float", - "description": "Midpoint projection of rates.", - "default": "", - "optional": false - }, - { - "name": "central_tendency_midpoint", - "type": "float", - "description": "Central tendency of midpoint projection of rates.", - "default": "", - "optional": false - }, - { - "name": "range_low", - "type": "float", - "description": "Low projection of rates.", - "default": "", - "optional": false - }, - { - "name": "central_tendency_low", - "type": "float", - "description": "Central tendency of low projection of rates.", - "default": "", - "optional": false - } - ], - "fred": [] - }, - "model": "PROJECTIONS" - }, - "/fixedincome/rate/estr": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Euro Short-Term Rate.\n\nThe euro short-term rate (\u20acSTR) reflects the wholesale euro unsecured overnight borrowing costs of banks located in\nthe euro area. The \u20acSTR is published on each TARGET2 business day based on transactions conducted and settled on\nthe previous TARGET2 business day (the reporting date \u201cT\u201d) with a maturity date of T+1 which are deemed to have been\nexecuted at arm\u2019s length and thus reflect market rates in an unbiased way.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.rate.estr(provider='fred')\nobb.fixedincome.rate.estr(parameter=number_of_active_banks, provider='fred')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fred']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", - "default": "fred", - "optional": true - } - ], - "fred": [ - { - "name": "parameter", - "type": "Literal['volume_weighted_trimmed_mean_rate', 'number_of_transactions', 'number_of_active_banks', 'total_volume', 'share_of_volume_of_the_5_largest_active_banks', 'rate_at_75th_percentile_of_volume', 'rate_at_25th_percentile_of_volume']", - "description": "Period of ESTR rate.", - "default": "volume_weighted_trimmed_mean_rate", - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[ESTR]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fred']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "rate", - "type": "float", - "description": "ESTR rate.", - "default": "", - "optional": false - } - ], - "fred": [] - }, - "model": "ESTR" - }, - "/fixedincome/rate/ecb": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "European Central Bank Interest Rates.\n\nThe Governing Council of the ECB sets the key interest rates for the euro area:\n\n- The interest rate on the main refinancing operations (MRO), which provide\nthe bulk of liquidity to the banking system.\n- The rate on the deposit facility, which banks may use to make overnight deposits with the Eurosystem.\n- The rate on the marginal lending facility, which offers overnight credit to banks from the Eurosystem.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.rate.ecb(provider='fred')\nobb.fixedincome.rate.ecb(interest_rate_type='refinancing', provider='fred')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "interest_rate_type", - "type": "Literal['deposit', 'lending', 'refinancing']", - "description": "The type of interest rate.", - "default": "lending", - "optional": true - }, - { - "name": "provider", - "type": "Literal['fred']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", - "default": "fred", - "optional": true - } - ], - "fred": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[EuropeanCentralBankInterestRates]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fred']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "rate", - "type": "float", - "description": "European Central Bank Interest Rate.", - "default": "", - "optional": false - } - ], - "fred": [] - }, - "model": "EuropeanCentralBankInterestRates" - }, - "/fixedincome/rate/dpcredit": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Discount Window Primary Credit Rate.\n\nA bank rate is the interest rate a nation's central bank charges to its domestic banks to borrow money.\nThe rates central banks charge are set to stabilize the economy.\nIn the United States, the Federal Reserve System's Board of Governors set the bank rate,\nalso known as the discount rate.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.rate.dpcredit(provider='fred')\nobb.fixedincome.rate.dpcredit(start_date='2023-02-01', end_date='2023-05-01', provider='fred')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fred']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", - "default": "fred", - "optional": true - } - ], - "fred": [ - { - "name": "parameter", - "type": "Literal['daily_excl_weekend', 'monthly', 'weekly', 'daily', 'annual']", - "description": "FRED series ID of DWPCR data.", - "default": "daily_excl_weekend", - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[DiscountWindowPrimaryCreditRate]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fred']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "rate", - "type": "float", - "description": "Discount Window Primary Credit Rate.", - "default": "", - "optional": false - } - ], - "fred": [] - }, - "model": "DiscountWindowPrimaryCreditRate" - }, - "/fixedincome/spreads/tcm": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Treasury Constant Maturity.\n\nGet data for 10-Year Treasury Constant Maturity Minus Selected Treasury Constant Maturity.\nConstant maturity is the theoretical value of a U.S. Treasury that is based on recent values of auctioned U.S.\nTreasuries. The value is obtained by the U.S. Treasury on a daily basis through interpolation of the Treasury\nyield curve which, in turn, is based on closing bid-yields of actively-traded Treasury securities.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.spreads.tcm(provider='fred')\nobb.fixedincome.spreads.tcm(maturity='2y', provider='fred')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "maturity", - "type": "Literal['3m', '2y']", - "description": "The maturity", - "default": "3m", - "optional": true - }, - { - "name": "provider", - "type": "Literal['fred']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", - "default": "fred", - "optional": true - } - ], - "fred": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[TreasuryConstantMaturity]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fred']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "rate", - "type": "float", - "description": "TreasuryConstantMaturity Rate.", - "default": "", - "optional": false - } - ], - "fred": [] - }, - "model": "TreasuryConstantMaturity" - }, - "/fixedincome/spreads/tcm_effr": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Select Treasury Constant Maturity.\n\nGet data for Selected Treasury Constant Maturity Minus Federal Funds Rate\nConstant maturity is the theoretical value of a U.S. Treasury that is based on recent values of auctioned U.S.\nTreasuries. The value is obtained by the U.S. Treasury on a daily basis through interpolation of the Treasury\nyield curve which, in turn, is based on closing bid-yields of actively-traded Treasury securities.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.spreads.tcm_effr(provider='fred')\nobb.fixedincome.spreads.tcm_effr(maturity='10y', provider='fred')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "maturity", - "type": "Literal['10y', '5y', '1y', '6m', '3m']", - "description": "The maturity", - "default": "10y", - "optional": true - }, - { - "name": "provider", - "type": "Literal['fred']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", - "default": "fred", - "optional": true - } - ], - "fred": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[SelectedTreasuryConstantMaturity]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fred']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "rate", - "type": "float", - "description": "Selected Treasury Constant Maturity Rate.", - "default": "", - "optional": false - } - ], - "fred": [] - }, - "model": "SelectedTreasuryConstantMaturity" - }, - "/fixedincome/spreads/treasury_effr": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Select Treasury Bill.\n\nGet Selected Treasury Bill Minus Federal Funds Rate.\nConstant maturity is the theoretical value of a U.S. Treasury that is based on recent values of\nauctioned U.S. Treasuries.\nThe value is obtained by the U.S. Treasury on a daily basis through interpolation of the Treasury\nyield curve which, in turn, is based on closing bid-yields of actively-traded Treasury securities.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.spreads.treasury_effr(provider='fred')\nobb.fixedincome.spreads.treasury_effr(maturity='6m', provider='fred')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "maturity", - "type": "Literal['3m', '6m']", - "description": "The maturity", - "default": "3m", - "optional": true - }, - { - "name": "provider", - "type": "Literal['fred']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", - "default": "fred", - "optional": true - } - ], - "fred": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[SelectedTreasuryBill]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fred']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "rate", - "type": "float", - "description": "SelectedTreasuryBill Rate.", - "default": "", - "optional": false - } - ], - "fred": [] - }, - "model": "SelectedTreasuryBill" - }, - "/fixedincome/government/us_yield_curve": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "US Yield Curve. Get United States yield curve.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.government.us_yield_curve(provider='fred')\nobb.fixedincome.government.us_yield_curve(inflation_adjusted=True, provider='fred')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "date", - "type": "Union[date, str]", - "description": "A specific date to get data for. Defaults to the most recent FRED entry.", - "default": null, - "optional": true - }, - { - "name": "inflation_adjusted", - "type": "bool", - "description": "Get inflation adjusted rates.", - "default": false, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fred']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", - "default": "fred", - "optional": true - } - ], - "fred": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[USYieldCurve]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fred']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "maturity", - "type": "float", - "description": "Maturity of the treasury rate in years.", - "default": "", - "optional": false - }, - { - "name": "rate", - "type": "float", - "description": "Associated rate given in decimal form (0.05 is 5%)", - "default": "", - "optional": false - } - ], - "fred": [] - }, - "model": "USYieldCurve" - }, - "/fixedincome/government/treasury_rates": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Government Treasury Rates.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.government.treasury_rates(provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['federal_reserve', 'fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'federal_reserve' if there is no default.", - "default": "federal_reserve", - "optional": true - } - ], - "federal_reserve": [], - "fmp": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[TreasuryRates]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['federal_reserve', 'fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "week_4", - "type": "float", - "description": "4 week Treasury bills rate (secondary market).", - "default": null, - "optional": true - }, - { - "name": "month_1", - "type": "float", - "description": "1 month Treasury rate.", - "default": null, - "optional": true - }, - { - "name": "month_2", - "type": "float", - "description": "2 month Treasury rate.", - "default": null, - "optional": true - }, - { - "name": "month_3", - "type": "float", - "description": "3 month Treasury rate.", - "default": null, - "optional": true - }, - { - "name": "month_6", - "type": "float", - "description": "6 month Treasury rate.", - "default": null, - "optional": true - }, - { - "name": "year_1", - "type": "float", - "description": "1 year Treasury rate.", - "default": null, - "optional": true - }, - { - "name": "year_2", - "type": "float", - "description": "2 year Treasury rate.", - "default": null, - "optional": true - }, - { - "name": "year_3", - "type": "float", - "description": "3 year Treasury rate.", - "default": null, - "optional": true - }, - { - "name": "year_5", - "type": "float", - "description": "5 year Treasury rate.", - "default": null, - "optional": true - }, - { - "name": "year_7", - "type": "float", - "description": "7 year Treasury rate.", - "default": null, - "optional": true - }, - { - "name": "year_10", - "type": "float", - "description": "10 year Treasury rate.", - "default": null, - "optional": true - }, - { - "name": "year_20", - "type": "float", - "description": "20 year Treasury rate.", - "default": null, - "optional": true - }, - { - "name": "year_30", - "type": "float", - "description": "30 year Treasury rate.", - "default": null, - "optional": true - } - ], - "federal_reserve": [], - "fmp": [] - }, - "model": "TreasuryRates" - }, - "/fixedincome/corporate/ice_bofa": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "ICE BofA US Corporate Bond Indices.\n\nThe ICE BofA US Corporate Index tracks the performance of US dollar denominated investment grade corporate debt\npublicly issued in the US domestic market. Qualifying securities must have an investment grade rating (based on an\naverage of Moody\u2019s, S&P and Fitch), at least 18 months to final maturity at the time of issuance, at least one year\nremaining term to final maturity as of the rebalance date, a fixed coupon schedule and a minimum amount\noutstanding of $250 million. The ICE BofA US Corporate Index is a component of the US Corporate Master Index.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.corporate.ice_bofa(provider='fred')\nobb.fixedincome.corporate.ice_bofa(index_type='yield_to_worst', provider='fred')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "index_type", - "type": "Literal['yield', 'yield_to_worst', 'total_return', 'spread']", - "description": "The type of series.", - "default": "yield", - "optional": true - }, - { - "name": "provider", - "type": "Literal['fred']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", - "default": "fred", - "optional": true - } - ], - "fred": [ - { - "name": "category", - "type": "Literal['all', 'duration', 'eur', 'usd']", - "description": "The type of category.", - "default": "all", - "optional": true - }, - { - "name": "area", - "type": "Literal['asia', 'emea', 'eu', 'ex_g10', 'latin_america', 'us']", - "description": "The type of area.", - "default": "us", - "optional": true - }, - { - "name": "grade", - "type": "Literal['a', 'aa', 'aaa', 'b', 'bb', 'bbb', 'ccc', 'crossover', 'high_grade', 'high_yield', 'non_financial', 'non_sovereign', 'private_sector', 'public_sector']", - "description": "The type of grade.", - "default": "non_sovereign", - "optional": true - }, - { - "name": "options", - "type": "bool", - "description": "Whether to include options in the results.", - "default": false, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[ICEBofA]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fred']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "rate", - "type": "float", - "description": "ICE BofA US Corporate Bond Indices Rate.", - "default": "", - "optional": false - } - ], - "fred": [] - }, - "model": "ICEBofA" - }, - "/fixedincome/corporate/moody": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Moody Corporate Bond Index.\n\nMoody's Aaa and Baa are investment bonds that acts as an index of\nthe performance of all bonds given an Aaa or Baa rating by Moody's Investors Service respectively.\nThese corporate bonds often are used in macroeconomics as an alternative to the federal ten-year\nTreasury Bill as an indicator of the interest rate.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.corporate.moody(provider='fred')\nobb.fixedincome.corporate.moody(index_type='baa', provider='fred')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "index_type", - "type": "Literal['aaa', 'baa']", - "description": "The type of series.", - "default": "aaa", - "optional": true - }, - { - "name": "provider", - "type": "Literal['fred']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", - "default": "fred", - "optional": true - } - ], - "fred": [ - { - "name": "spread", - "type": "Literal['treasury', 'fed_funds']", - "description": "The type of spread.", - "default": null, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[MoodyCorporateBondIndex]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fred']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "rate", - "type": "float", - "description": "Moody Corporate Bond Index Rate.", - "default": "", - "optional": false - } - ], - "fred": [] - }, - "model": "MoodyCorporateBondIndex" - }, - "/fixedincome/corporate/hqm": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "High Quality Market Corporate Bond.\n\nThe HQM yield curve represents the high quality corporate bond market, i.e.,\ncorporate bonds rated AAA, AA, or A. The HQM curve contains two regression terms.\nThese terms are adjustment factors that blend AAA, AA, and A bonds into a single HQM yield curve\nthat is the market-weighted average (MWA) quality of high quality bonds.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.corporate.hqm(provider='fred')\nobb.fixedincome.corporate.hqm(yield_curve='par', provider='fred')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "date", - "type": "Union[date, str]", - "description": "A specific date to get data for.", - "default": null, - "optional": true - }, - { - "name": "yield_curve", - "type": "Literal['spot', 'par']", - "description": "The yield curve type.", - "default": "spot", - "optional": true - }, - { - "name": "provider", - "type": "Literal['fred']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", - "default": "fred", - "optional": true - } - ], - "fred": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[HighQualityMarketCorporateBond]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fred']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "rate", - "type": "float", - "description": "HighQualityMarketCorporateBond Rate.", - "default": "", - "optional": false - }, - { - "name": "maturity", - "type": "str", - "description": "Maturity.", - "default": "", - "optional": false - }, - { - "name": "yield_curve", - "type": "Literal['spot', 'par']", - "description": "The yield curve type.", - "default": "", - "optional": false - } - ], - "fred": [ - { - "name": "series_id", - "type": "str", - "description": "FRED series id.", - "default": "", - "optional": false - } - ] - }, - "model": "HighQualityMarketCorporateBond" - }, - "/fixedincome/corporate/spot_rates": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Spot Rates.\n\nThe spot rates for any maturity is the yield on a bond that provides a single payment at that maturity.\nThis is a zero coupon bond.\nBecause each spot rate pertains to a single cashflow, it is the relevant interest rate\nconcept for discounting a pension liability at the same maturity.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.corporate.spot_rates(provider='fred')\nobb.fixedincome.corporate.spot_rates(maturity='10,20,30,50', provider='fred')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "maturity", - "type": "Union[Union[float, str], List[Union[float, str]]]", - "description": "Maturities in years. Multiple items allowed for provider(s): fred.", - "default": 10.0, - "optional": true - }, - { - "name": "category", - "type": "Union[str, List[str]]", - "description": "Rate category. Options: spot_rate, par_yield. Multiple items allowed for provider(s): fred.", - "default": "spot_rate", - "optional": true - }, - { - "name": "provider", - "type": "Literal['fred']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", - "default": "fred", - "optional": true - } - ], - "fred": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[SpotRate]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fred']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "rate", - "type": "float", - "description": "Spot Rate.", - "default": "", - "optional": false - } - ], - "fred": [] - }, - "model": "SpotRate" - }, - "/fixedincome/corporate/commercial_paper": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Commercial Paper.\n\nCommercial paper (CP) consists of short-term, promissory notes issued primarily by corporations.\nMaturities range up to 270 days but average about 30 days.\nMany companies use CP to raise cash needed for current transactions,\nand many find it to be a lower-cost alternative to bank loans.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.corporate.commercial_paper(provider='fred')\nobb.fixedincome.corporate.commercial_paper(maturity='15d', provider='fred')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "maturity", - "type": "Literal['overnight', '7d', '15d', '30d', '60d', '90d']", - "description": "The maturity.", - "default": "30d", - "optional": true - }, - { - "name": "category", - "type": "Literal['asset_backed', 'financial', 'nonfinancial']", - "description": "The category.", - "default": "financial", - "optional": true - }, - { - "name": "grade", - "type": "Literal['aa', 'a2_p2']", - "description": "The grade.", - "default": "aa", - "optional": true - }, - { - "name": "provider", - "type": "Literal['fred']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", - "default": "fred", - "optional": true - } - ], - "fred": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[CommercialPaper]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fred']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "rate", - "type": "float", - "description": "Commercial Paper Rate.", - "default": "", - "optional": false - } - ], - "fred": [] - }, - "model": "CommercialPaper" - }, - "/fixedincome/sofr": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Secured Overnight Financing Rate.\n\nThe Secured Overnight Financing Rate (SOFR) is a broad measure of the cost of\nborrowing cash overnight collateralizing by Treasury securities.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.sofr(provider='fred')\nobb.fixedincome.sofr(period=overnight, provider='fred')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['fred']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", - "default": "fred", - "optional": true - } - ], - "fred": [ - { - "name": "period", - "type": "Literal['overnight', '30_day', '90_day', '180_day', 'index']", - "description": "Period of SOFR rate.", - "default": "overnight", - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[SOFR]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fred']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "date", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "rate", - "type": "float", - "description": "SOFR rate.", - "default": "", - "optional": false - } - ], - "fred": [] - }, - "model": "SOFR" - }, - "/index/price/historical": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Historical Index Levels.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.index.price.historical(symbol='^GSPC', provider='fmp')\n# Not all providers have the same symbols.\nobb.index.price.historical(symbol='SPX', provider='intrinio')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio, polygon, yfinance.", - "default": "", - "optional": false - }, - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "interval", - "type": "str", - "description": "Time interval of the data to return.", - "default": "1d", - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp', 'intrinio', 'polygon', 'yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [], - "intrinio": [ - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": 10000, - "optional": true - } - ], - "polygon": [ - { - "name": "sort", - "type": "Literal['asc', 'desc']", - "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date.", - "default": "asc", - "optional": true - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": 49999, - "optional": true - } - ], - "yfinance": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[IndexHistorical]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'intrinio', 'polygon', 'yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "Union[date, datetime]", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "open", - "type": "Annotated[float, Strict(strict=True)]", - "description": "The open price.", - "default": null, - "optional": true - }, - { - "name": "high", - "type": "Annotated[float, Strict(strict=True)]", - "description": "The high price.", - "default": null, - "optional": true - }, - { - "name": "low", - "type": "Annotated[float, Strict(strict=True)]", - "description": "The low price.", - "default": null, - "optional": true - }, - { - "name": "close", - "type": "Annotated[float, Strict(strict=True)]", - "description": "The close price.", - "default": null, - "optional": true - }, - { - "name": "volume", - "type": "int", - "description": "The trading volume.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "vwap", - "type": "float", - "description": "Volume Weighted Average Price over the period.", - "default": null, - "optional": true - }, - { - "name": "change", - "type": "float", - "description": "Change in the price from the previous close.", - "default": null, - "optional": true - }, - { - "name": "change_percent", - "type": "float", - "description": "Change in the price from the previous close, as a normalized percent.", - "default": null, - "optional": true - } - ], - "intrinio": [], - "polygon": [ - { - "name": "transactions", - "type": "Annotated[int, Gt(gt=0)]", - "description": "Number of transactions for the symbol in the time period.", - "default": null, - "optional": true - } - ], - "yfinance": [] - }, - "model": "IndexHistorical" - }, - "/index/market": { - "deprecated": { - "flag": true, - "message": "This endpoint is deprecated; use `/index/price/historical` instead. Deprecated in OpenBB Platform V4.1 to be removed in V4.3." - }, - "description": "Historical Market Indices.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.index.market(symbol='^IBEX', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio, polygon, yfinance.", - "default": "", - "optional": false - }, - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "interval", - "type": "str", - "description": "Time interval of the data to return.", - "default": "1d", - "optional": true - }, - { - "name": "provider", - "type": "Literal['fmp', 'intrinio', 'polygon', 'yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [], - "intrinio": [ - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": 10000, - "optional": true - } - ], - "polygon": [ - { - "name": "sort", - "type": "Literal['asc', 'desc']", - "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date.", - "default": "asc", - "optional": true - }, - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return.", - "default": 49999, - "optional": true - } - ], - "yfinance": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[MarketIndices]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'intrinio', 'polygon', 'yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "Union[date, datetime]", - "description": "The date of the data.", - "default": "", - "optional": false - }, - { - "name": "open", - "type": "Annotated[float, Strict(strict=True)]", - "description": "The open price.", - "default": null, - "optional": true - }, - { - "name": "high", - "type": "Annotated[float, Strict(strict=True)]", - "description": "The high price.", - "default": null, - "optional": true - }, - { - "name": "low", - "type": "Annotated[float, Strict(strict=True)]", - "description": "The low price.", - "default": null, - "optional": true - }, - { - "name": "close", - "type": "Annotated[float, Strict(strict=True)]", - "description": "The close price.", - "default": null, - "optional": true - }, - { - "name": "volume", - "type": "int", - "description": "The trading volume.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "vwap", - "type": "float", - "description": "Volume Weighted Average Price over the period.", - "default": null, - "optional": true - }, - { - "name": "change", - "type": "float", - "description": "Change in the price from the previous close.", - "default": null, - "optional": true - }, - { - "name": "change_percent", - "type": "float", - "description": "Change in the price from the previous close, as a normalized percent.", - "default": null, - "optional": true - } - ], - "intrinio": [], - "polygon": [ - { - "name": "transactions", - "type": "Annotated[int, Gt(gt=0)]", - "description": "Number of transactions for the symbol in the time period.", - "default": null, - "optional": true - } - ], - "yfinance": [] - }, - "model": "MarketIndices" - }, - "/index/constituents": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Index Constituents.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.index.constituents(symbol='dowjones', provider='fmp')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['fmp']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[IndexConstituents]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - }, - { - "name": "name", - "type": "str", - "description": "Name of the constituent company in the index.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "sector", - "type": "str", - "description": "Sector the constituent company in the index belongs to.", - "default": "", - "optional": false - }, - { - "name": "sub_sector", - "type": "str", - "description": "Sub-sector the constituent company in the index belongs to.", - "default": null, - "optional": true - }, - { - "name": "headquarter", - "type": "str", - "description": "Location of the headquarter of the constituent company in the index.", - "default": null, - "optional": true - }, - { - "name": "date_first_added", - "type": "Union[str, date]", - "description": "Date the constituent company was added to the index.", - "default": null, - "optional": true - }, - { - "name": "cik", - "type": "int", - "description": "Central Index Key (CIK) for the requested entity.", - "default": null, - "optional": true - }, - { - "name": "founded", - "type": "Union[str, date]", - "description": "Founding year of the constituent company in the index.", - "default": null, - "optional": true - } - ] - }, - "model": "IndexConstituents" - }, - "/index/available": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "All indices available from a given provider.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.index.available(provider='fmp')\nobb.index.available(provider='yfinance')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "provider", - "type": "Literal['fmp', 'yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", - "default": "fmp", - "optional": true - } - ], - "fmp": [], - "yfinance": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[AvailableIndices]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['fmp', 'yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "name", - "type": "str", - "description": "Name of the index.", - "default": null, - "optional": true - }, - { - "name": "currency", - "type": "str", - "description": "Currency the index is traded in.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "stock_exchange", - "type": "str", - "description": "Stock exchange where the index is listed.", - "default": "", - "optional": false - }, - { - "name": "exchange_short_name", - "type": "str", - "description": "Short name of the stock exchange where the index is listed.", - "default": "", - "optional": false - } - ], - "yfinance": [ - { - "name": "code", - "type": "str", - "description": "ID code for keying the index in the OpenBB Terminal.", - "default": "", - "optional": false - }, - { - "name": "symbol", - "type": "str", - "description": "Symbol for the index.", - "default": "", - "optional": false - } - ] - }, - "model": "AvailableIndices" - }, - "/news/world": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "World News. Global news data.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.news.world(provider='fmp')\nobb.news.world(limit=100, provider='intrinio')\n# Get news on the specified dates.\nobb.news.world(start_date='2024-02-01', end_date='2024-02-07', provider='intrinio')\n# Display the headlines of the news.\nobb.news.world(display=headline, provider='benzinga')\n# Get news by topics.\nobb.news.world(topics=finance, provider='benzinga')\n# Get news by source using 'tingo' as provider.\nobb.news.world(provider='tiingo', source=bloomberg)\n```\n\n", - "parameters": { - "standard": [ - { - "name": "limit", - "type": "int", - "description": "The number of data entries to return. The number of articles to return.", - "default": 2500, - "optional": true - }, - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "provider", - "type": "Literal['benzinga', 'fmp', 'intrinio', 'tiingo']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'benzinga' if there is no default.", - "default": "benzinga", - "optional": true - } - ], - "benzinga": [ - { - "name": "date", - "type": "Union[date, str]", - "description": "A specific date to get data for.", - "default": null, - "optional": true - }, - { - "name": "display", - "type": "Literal['headline', 'abstract', 'full']", - "description": "Specify headline only (headline), headline + teaser (abstract), or headline + full body (full).", - "default": "full", - "optional": true - }, - { - "name": "updated_since", - "type": "int", - "description": "Number of seconds since the news was updated.", - "default": null, - "optional": true - }, - { - "name": "published_since", - "type": "int", - "description": "Number of seconds since the news was published.", - "default": null, - "optional": true - }, - { - "name": "sort", - "type": "Literal['id', 'created', 'updated']", - "description": "Key to sort the news by.", - "default": "created", - "optional": true - }, - { - "name": "order", - "type": "Literal['asc', 'desc']", - "description": "Order to sort the news by.", - "default": "desc", - "optional": true - }, - { - "name": "isin", - "type": "str", - "description": "The ISIN of the news to retrieve.", - "default": null, - "optional": true - }, - { - "name": "cusip", - "type": "str", - "description": "The CUSIP of the news to retrieve.", - "default": null, - "optional": true - }, - { - "name": "channels", - "type": "str", - "description": "Channels of the news to retrieve.", - "default": null, - "optional": true - }, - { - "name": "topics", - "type": "str", - "description": "Topics of the news to retrieve.", - "default": null, - "optional": true - }, - { - "name": "authors", - "type": "str", - "description": "Authors of the news to retrieve.", - "default": null, - "optional": true - }, - { - "name": "content_types", - "type": "str", - "description": "Content types of the news to retrieve.", - "default": null, - "optional": true - } - ], - "fmp": [], - "intrinio": [], - "tiingo": [ - { - "name": "offset", - "type": "int", - "description": "Page offset, used in conjunction with limit.", - "default": 0, - "optional": true - }, - { - "name": "source", - "type": "str", - "description": "A comma-separated list of the domains requested.", - "default": null, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[WorldNews]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['benzinga', 'fmp', 'intrinio', 'tiingo']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "datetime", - "description": "The date of the data. The published date of the article.", - "default": "", - "optional": false - }, - { - "name": "title", - "type": "str", - "description": "Title of the article.", - "default": "", - "optional": false - }, - { - "name": "images", - "type": "List[Dict[str, str]]", - "description": "Images associated with the article.", - "default": null, - "optional": true - }, - { - "name": "text", - "type": "str", - "description": "Text/body of the article.", - "default": null, - "optional": true - }, - { - "name": "url", - "type": "str", - "description": "URL to the article.", - "default": null, - "optional": true - } - ], - "benzinga": [ - { - "name": "id", - "type": "str", - "description": "Article ID.", - "default": "", - "optional": false - }, - { - "name": "author", - "type": "str", - "description": "Author of the news.", - "default": null, - "optional": true - }, - { - "name": "teaser", - "type": "str", - "description": "Teaser of the news.", - "default": null, - "optional": true - }, - { - "name": "channels", - "type": "str", - "description": "Channels associated with the news.", - "default": null, - "optional": true - }, - { - "name": "stocks", - "type": "str", - "description": "Stocks associated with the news.", - "default": null, - "optional": true - }, - { - "name": "tags", - "type": "str", - "description": "Tags associated with the news.", - "default": null, - "optional": true - }, - { - "name": "updated", - "type": "datetime", - "description": "Updated date of the news.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "site", - "type": "str", - "description": "News source.", - "default": "", - "optional": false - } - ], - "intrinio": [ - { - "name": "id", - "type": "str", - "description": "Article ID.", - "default": "", - "optional": false - }, - { - "name": "company", - "type": "Dict[str, Any]", - "description": "Company details related to the news article.", - "default": "", - "optional": false - } - ], - "tiingo": [ - { - "name": "symbols", - "type": "str", - "description": "Ticker tagged in the fetched news.", - "default": null, - "optional": true - }, - { - "name": "article_id", - "type": "int", - "description": "Unique ID of the news article.", - "default": "", - "optional": false - }, - { - "name": "site", - "type": "str", - "description": "News source.", - "default": "", - "optional": false - }, - { - "name": "tags", - "type": "str", - "description": "Tags associated with the news article.", - "default": null, - "optional": true - }, - { - "name": "crawl_date", - "type": "datetime", - "description": "Date the news article was crawled.", - "default": "", - "optional": false - } - ] - }, - "model": "WorldNews" - }, - "/news/company": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Company News. Get news for one or more companies.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.news.company(provider='benzinga')\nobb.news.company(limit=100, provider='benzinga')\n# Get news on the specified dates.\nobb.news.company(symbol='AAPL', start_date='2024-02-01', end_date='2024-02-07', provider='intrinio')\n# Display the headlines of the news.\nobb.news.company(symbol='AAPL', display=headline, provider='benzinga')\n# Get news for multiple symbols.\nobb.news.company(symbol='aapl,tsla', provider='fmp')\n# Get news company's ISIN.\nobb.news.company(symbol='NVDA', isin=US0378331005, provider='benzinga')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "Union[str, List[str]]", - "description": "Symbol to get data for. Multiple items allowed for provider(s): benzinga, fmp, intrinio, polygon, tiingo, yfinance.", - "default": null, - "optional": true - }, - { - "name": "start_date", - "type": "Union[date, str]", - "description": "Start date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "end_date", - "type": "Union[date, str]", - "description": "End date of the data, in YYYY-MM-DD format.", - "default": null, - "optional": true - }, - { - "name": "limit", - "type": "Annotated[int, Ge(ge=0)]", - "description": "The number of data entries to return.", - "default": 2500, - "optional": true - }, - { - "name": "provider", - "type": "Literal['benzinga', 'fmp', 'intrinio', 'polygon', 'tiingo', 'yfinance']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'benzinga' if there is no default.", - "default": "benzinga", - "optional": true - } - ], - "benzinga": [ - { - "name": "date", - "type": "Union[date, str]", - "description": "A specific date to get data for.", - "default": null, - "optional": true - }, - { - "name": "display", - "type": "Literal['headline', 'abstract', 'full']", - "description": "Specify headline only (headline), headline + teaser (abstract), or headline + full body (full).", - "default": "full", - "optional": true - }, - { - "name": "updated_since", - "type": "int", - "description": "Number of seconds since the news was updated.", - "default": null, - "optional": true - }, - { - "name": "published_since", - "type": "int", - "description": "Number of seconds since the news was published.", - "default": null, - "optional": true - }, - { - "name": "sort", - "type": "Literal['id', 'created', 'updated']", - "description": "Key to sort the news by.", - "default": "created", - "optional": true - }, - { - "name": "order", - "type": "Literal['asc', 'desc']", - "description": "Order to sort the news by.", - "default": "desc", - "optional": true - }, - { - "name": "isin", - "type": "str", - "description": "The company's ISIN.", - "default": null, - "optional": true - }, - { - "name": "cusip", - "type": "str", - "description": "The company's CUSIP.", - "default": null, - "optional": true - }, - { - "name": "channels", - "type": "str", - "description": "Channels of the news to retrieve.", - "default": null, - "optional": true - }, - { - "name": "topics", - "type": "str", - "description": "Topics of the news to retrieve.", - "default": null, - "optional": true - }, - { - "name": "authors", - "type": "str", - "description": "Authors of the news to retrieve.", - "default": null, - "optional": true - }, - { - "name": "content_types", - "type": "str", - "description": "Content types of the news to retrieve.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "page", - "type": "int", - "description": "Page number of the results. Use in combination with limit.", - "default": 0, - "optional": true - } - ], - "intrinio": [], - "polygon": [ - { - "name": "order", - "type": "Literal['asc', 'desc']", - "description": "Sort order of the articles.", - "default": "desc", - "optional": true - } - ], - "tiingo": [ - { - "name": "offset", - "type": "int", - "description": "Page offset, used in conjunction with limit.", - "default": 0, - "optional": true - }, - { - "name": "source", - "type": "str", - "description": "A comma-separated list of the domains requested.", - "default": null, - "optional": true - } - ], - "yfinance": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[CompanyNews]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['benzinga', 'fmp', 'intrinio', 'polygon', 'tiingo', 'yfinance']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "date", - "type": "datetime", - "description": "The date of the data. Here it is the published date of the article.", - "default": "", - "optional": false - }, - { - "name": "title", - "type": "str", - "description": "Title of the article.", - "default": "", - "optional": false - }, - { - "name": "text", - "type": "str", - "description": "Text/body of the article.", - "default": null, - "optional": true - }, - { - "name": "images", - "type": "List[Dict[str, str]]", - "description": "Images associated with the article.", - "default": null, - "optional": true - }, - { - "name": "url", - "type": "str", - "description": "URL to the article.", - "default": "", - "optional": false - }, - { - "name": "symbols", - "type": "str", - "description": "Symbols associated with the article.", - "default": null, - "optional": true - } - ], - "benzinga": [ - { - "name": "id", - "type": "str", - "description": "Article ID.", - "default": "", - "optional": false - }, - { - "name": "author", - "type": "str", - "description": "Author of the article.", - "default": null, - "optional": true - }, - { - "name": "teaser", - "type": "str", - "description": "Teaser of the news.", - "default": null, - "optional": true - }, - { - "name": "channels", - "type": "str", - "description": "Channels associated with the news.", - "default": null, - "optional": true - }, - { - "name": "stocks", - "type": "str", - "description": "Stocks associated with the news.", - "default": null, - "optional": true - }, - { - "name": "tags", - "type": "str", - "description": "Tags associated with the news.", - "default": null, - "optional": true - }, - { - "name": "updated", - "type": "datetime", - "description": "Updated date of the news.", - "default": null, - "optional": true - } - ], - "fmp": [ - { - "name": "source", - "type": "str", - "description": "Name of the news source.", - "default": "", - "optional": false - } - ], - "intrinio": [ - { - "name": "id", - "type": "str", - "description": "Article ID.", - "default": "", - "optional": false - } - ], - "polygon": [ - { - "name": "source", - "type": "str", - "description": "Source of the article.", - "default": null, - "optional": true - }, - { - "name": "tags", - "type": "str", - "description": "Keywords/tags in the article", - "default": null, - "optional": true - }, - { - "name": "id", - "type": "str", - "description": "Article ID.", - "default": "", - "optional": false - }, - { - "name": "amp_url", - "type": "str", - "description": "AMP URL.", - "default": null, - "optional": true - }, - { - "name": "publisher", - "type": "PolygonPublisher", - "description": "Publisher of the article.", - "default": "", - "optional": false - } - ], - "tiingo": [ - { - "name": "tags", - "type": "str", - "description": "Tags associated with the news article.", - "default": null, - "optional": true - }, - { - "name": "article_id", - "type": "int", - "description": "Unique ID of the news article.", - "default": "", - "optional": false - }, - { - "name": "source", - "type": "str", - "description": "News source.", - "default": "", - "optional": false - }, - { - "name": "crawl_date", - "type": "datetime", - "description": "Date the news article was crawled.", - "default": "", - "optional": false - } - ], - "yfinance": [ - { - "name": "source", - "type": "str", - "description": "Source of the news article", - "default": "", - "optional": false - } - ] - }, - "model": "CompanyNews" - }, - "/regulators/sec/cik_map": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Map a ticker symbol to a CIK number.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.regulators.sec.cik_map(symbol='MSFT', provider='sec')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol to get data for.", - "default": "", - "optional": false - }, - { - "name": "provider", - "type": "Literal['sec']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'sec' if there is no default.", - "default": "sec", - "optional": true - } - ], - "sec": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[CikMap]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['sec']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [ - { - "name": "cik", - "type": "Union[int, str]", - "description": "Central Index Key (CIK) for the requested entity.", - "default": null, - "optional": true - } - ], - "sec": [] - }, - "model": "CikMap" - }, - "/regulators/sec/institutions_search": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "Search SEC-regulated institutions by name and return a list of results with CIK numbers.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.regulators.sec.institutions_search(provider='sec')\nobb.regulators.sec.institutions_search(query='blackstone real estate', provider='sec')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "query", - "type": "str", - "description": "Search query.", - "default": "", - "optional": true - }, - { - "name": "use_cache", - "type": "bool", - "description": "Whether or not to use cache. If True, cache will store for seven days.", - "default": true, - "optional": true - }, - { - "name": "provider", - "type": "Literal['sec']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'sec' if there is no default.", - "default": "sec", - "optional": true - } - ], - "sec": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[InstitutionsSearch]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['sec']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [], - "sec": [ - { - "name": "name", - "type": "str", - "description": "The name of the institution.", - "default": null, - "optional": true - }, - { - "name": "cik", - "type": "Union[int, str]", - "description": "Central Index Key (CIK)", - "default": null, - "optional": true - } - ] - }, - "model": "InstitutionsSearch" + "openbb": "4.1.7", + "info": { + "title": "OpenBB Platform (Python)", + "description": "This is the OpenBB Platform (Python).", + "core": "1.1.6", + "extensions": { + "openbb_core_extension": [ + "commodity@1.0.4", + "crypto@1.1.5", + "currency@1.1.5", + "derivatives@1.1.5", + "economy@1.1.5", + "equity@1.1.5", + "etf@1.1.5", + "fixedincome@1.1.5", + "index@1.1.5", + "news@1.1.5", + "regulators@1.1.5" + ], + "openbb_provider_extension": [ + "benzinga@1.1.5", + "federal_reserve@1.1.5", + "fmp@1.1.5", + "fred@1.1.5", + "intrinio@1.1.5", + "oecd@1.1.5", + "polygon@1.1.5", + "sec@1.1.5", + "tiingo@1.1.5", + "tradingeconomics@1.1.5", + "yfinance@1.1.5" + ], + "openbb_obbject_extension": [] + } }, - "/regulators/sec/schema_files": { - "deprecated": { - "flag": null, - "message": null - }, - "description": "A tool for navigating the directory of SEC XML schema files by year.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.regulators.sec.schema_files(provider='sec')\n# Get a list of schema files.\ndata = obb.regulators.sec.schema_files().results\ndata.files[0]\n'https://xbrl.fasb.org/us-gaap/'\n# The directory structure can be navigated by constructing a URL from the 'results' list.\nurl = data.files[0]+data.files[-1]\n# The URL base will always be the 0 position in the list, feed the URL back in as a parameter.\nobb.regulators.sec.schema_files(url=url).results.files\n['https://xbrl.fasb.org/us-gaap/2024/'\n'USGAAP2024FileList.xml'\n'dis/'\n'dqcrules/'\n'ebp/'\n'elts/'\n'entire/'\n'meta/'\n'stm/'\n'us-gaap-2024.zip']\n```\n\n", - "parameters": { - "standard": [ - { - "name": "query", - "type": "str", - "description": "Search query.", - "default": "", - "optional": true - }, - { - "name": "use_cache", - "type": "bool", - "description": "Whether or not to use cache. If True, cache will store for seven days.", - "default": true, - "optional": true - }, - { - "name": "provider", - "type": "Literal['sec']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'sec' if there is no default.", - "default": "sec", - "optional": true - } - ], - "sec": [ - { - "name": "url", - "type": "str", - "description": "Enter an optional URL path to fetch the next level.", - "default": null, - "optional": true - } - ] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[SchemaFiles]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['sec']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [], - "sec": [ - { - "name": "files", - "type": "List[str]", - "description": "Dictionary of URLs to SEC Schema Files", - "default": "", - "optional": false - } - ] - }, - "model": "SchemaFiles" + "paths": { + "/crypto/price/historical": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get historical price data for cryptocurrency pair(s) within a provider.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.crypto.price.historical(symbol='BTCUSD', provider='fmp')\nobb.crypto.price.historical(symbol='BTCUSD', start_date='2024-01-01', end_date='2024-01-31', provider='fmp')\nobb.crypto.price.historical(symbol='BTCUSD,ETHUSD', start_date='2024-01-01', end_date='2024-01-31', provider='polygon')\n# Get monthly historical prices from Yahoo Finance for Ethereum.\nobb.crypto.price.historical(symbol='ETH-USD', interval=1m, start_date='2024-01-01', end_date='2024-12-31', provider='yfinance')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Can use CURR1-CURR2 or CURR1CURR2 format. Multiple items allowed for provider(s): fmp, polygon, tiingo, yfinance.", + "default": "", + "optional": false + }, + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp', 'polygon', 'tiingo', 'yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [ + { + "name": "interval", + "type": "Literal['1m', '5m', '15m', '30m', '1h', '4h', '1d']", + "description": "Time interval of the data to return.", + "default": "1d", + "optional": true + } + ], + "polygon": [ + { + "name": "interval", + "type": "str", + "description": "Time interval of the data to return. The numeric portion of the interval can be any positive integer. The letter portion can be one of the following: s, m, h, d, W, M, Q, Y", + "default": "1d", + "optional": true + }, + { + "name": "sort", + "type": "Literal['asc', 'desc']", + "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date.", + "default": "asc", + "optional": true + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": 49999, + "optional": true + } + ], + "tiingo": [ + { + "name": "interval", + "type": "Literal['1m', '5m', '15m', '30m', '1h', '4h', '1d']", + "description": "Time interval of the data to return.", + "default": "1d", + "optional": true + }, + { + "name": "exchanges", + "type": "List[str]", + "description": "To limit the query to a subset of exchanges e.g. ['POLONIEX', 'GDAX']", + "default": null, + "optional": true + } + ], + "yfinance": [ + { + "name": "interval", + "type": "Literal['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1W', '1M', '1Q']", + "description": "Time interval of the data to return.", + "default": "1d", + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[CryptoHistorical]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'polygon', 'tiingo', 'yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "Union[date, datetime]", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "open", + "type": "float", + "description": "The open price.", + "default": "", + "optional": false + }, + { + "name": "high", + "type": "float", + "description": "The high price.", + "default": "", + "optional": false + }, + { + "name": "low", + "type": "float", + "description": "The low price.", + "default": "", + "optional": false + }, + { + "name": "close", + "type": "float", + "description": "The close price.", + "default": "", + "optional": false + }, + { + "name": "volume", + "type": "float", + "description": "The trading volume.", + "default": "", + "optional": false + }, + { + "name": "vwap", + "type": "Annotated[float, Gt(gt=0)]", + "description": "Volume Weighted Average Price over the period.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "adj_close", + "type": "float", + "description": "The adjusted close price.", + "default": null, + "optional": true + }, + { + "name": "change", + "type": "float", + "description": "Change in the price from the previous close.", + "default": null, + "optional": true + }, + { + "name": "change_percent", + "type": "float", + "description": "Change in the price from the previous close, as a normalized percent.", + "default": null, + "optional": true + } + ], + "polygon": [ + { + "name": "transactions", + "type": "Annotated[int, Gt(gt=0)]", + "description": "Number of transactions for the symbol in the time period.", + "default": null, + "optional": true + } + ], + "tiingo": [ + { + "name": "transactions", + "type": "int", + "description": "Number of transactions for the symbol in the time period.", + "default": null, + "optional": true + }, + { + "name": "volume_notional", + "type": "float", + "description": "The last size done for the asset on the specific date in the quote currency. The volume of the asset on the specific date in the quote currency.", + "default": null, + "optional": true + } + ], + "yfinance": [] + }, + "model": "CryptoHistorical" + }, + "/crypto/search": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Search available cryptocurrency pairs within a provider.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.crypto.search(provider='fmp')\nobb.crypto.search(query='BTCUSD', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "query", + "type": "str", + "description": "Search query.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[CryptoSearch]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data. (Crypto)", + "default": "", + "optional": false + }, + { + "name": "name", + "type": "str", + "description": "Name of the crypto.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "currency", + "type": "str", + "description": "The currency the crypto trades for.", + "default": null, + "optional": true + }, + { + "name": "exchange", + "type": "str", + "description": "The exchange code the crypto trades on.", + "default": null, + "optional": true + }, + { + "name": "exchange_name", + "type": "str", + "description": "The short name of the exchange the crypto trades on.", + "default": null, + "optional": true + } + ] + }, + "model": "CryptoSearch" + }, + "/currency/price/historical": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Currency Historical Price. Currency historical data.\n\nCurrency historical prices refer to the past exchange rates of one currency against\nanother over a specific period.\nThis data provides insight into the fluctuations and trends in the foreign exchange market,\nhelping analysts, traders, and economists understand currency performance,\nevaluate economic health, and make predictions about future movements.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.currency.price.historical(symbol='EURUSD', provider='fmp')\n# Filter historical data with specific start and end date.\nobb.currency.price.historical(symbol='EURUSD', start_date='2023-01-01', end_date='2023-12-31', provider='fmp')\n# Get data with different granularity.\nobb.currency.price.historical(symbol='EURUSD', provider='polygon', interval=15m)\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Can use CURR1-CURR2 or CURR1CURR2 format. Multiple items allowed for provider(s): fmp, polygon, tiingo, yfinance.", + "default": "", + "optional": false + }, + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp', 'polygon', 'tiingo', 'yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [ + { + "name": "interval", + "type": "Literal['1m', '5m', '15m', '30m', '1h', '4h', '1d']", + "description": "Time interval of the data to return.", + "default": "1d", + "optional": true + } + ], + "polygon": [ + { + "name": "interval", + "type": "str", + "description": "Time interval of the data to return. The numeric portion of the interval can be any positive integer. The letter portion can be one of the following: s, m, h, d, W, M, Q, Y", + "default": "1d", + "optional": true + }, + { + "name": "sort", + "type": "Literal['asc', 'desc']", + "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date.", + "default": "asc", + "optional": true + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": 49999, + "optional": true + } + ], + "tiingo": [ + { + "name": "interval", + "type": "Literal['1m', '5m', '15m', '30m', '1h', '4h', '1d']", + "description": "Time interval of the data to return.", + "default": "1d", + "optional": true + } + ], + "yfinance": [ + { + "name": "interval", + "type": "Literal['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1W', '1M', '1Q']", + "description": "Time interval of the data to return.", + "default": "1d", + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[CurrencyHistorical]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'polygon', 'tiingo', 'yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "Union[date, datetime]", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "open", + "type": "float", + "description": "The open price.", + "default": "", + "optional": false + }, + { + "name": "high", + "type": "float", + "description": "The high price.", + "default": "", + "optional": false + }, + { + "name": "low", + "type": "float", + "description": "The low price.", + "default": "", + "optional": false + }, + { + "name": "close", + "type": "float", + "description": "The close price.", + "default": "", + "optional": false + }, + { + "name": "volume", + "type": "float", + "description": "The trading volume.", + "default": null, + "optional": true + }, + { + "name": "vwap", + "type": "Annotated[float, Gt(gt=0)]", + "description": "Volume Weighted Average Price over the period.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "adj_close", + "type": "float", + "description": "The adjusted close price.", + "default": null, + "optional": true + }, + { + "name": "change", + "type": "float", + "description": "Change in the price from the previous close.", + "default": null, + "optional": true + }, + { + "name": "change_percent", + "type": "float", + "description": "Change in the price from the previous close, as a normalized percent.", + "default": null, + "optional": true + } + ], + "polygon": [ + { + "name": "transactions", + "type": "Annotated[int, Gt(gt=0)]", + "description": "Number of transactions for the symbol in the time period.", + "default": null, + "optional": true + } + ], + "tiingo": [], + "yfinance": [] + }, + "model": "CurrencyHistorical" + }, + "/currency/search": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Currency Search.\n\nSearch available currency pairs.\nCurrency pairs are the national currencies from two countries coupled for trading on\nthe foreign exchange (FX) marketplace.\nBoth currencies will have exchange rates on which the trade will have its position basis.\nAll trading within the forex market, whether selling, buying, or trading, will take place through currency pairs.\n(ref: Investopedia)\nMajor currency pairs include pairs such as EUR/USD, USD/JPY, GBP/USD, etc.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.currency.search(provider='intrinio')\n# Search for 'EURUSD' currency pair using 'intrinio' as provider.\nobb.currency.search(provider='intrinio', symbol=EURUSD)\n# Search for actively traded currency pairs on the queried date using 'polygon' as provider.\nobb.currency.search(provider='polygon', date=2024-01-02, active=True)\n# Search for terms using 'polygon' as provider.\nobb.currency.search(provider='polygon', search=Euro zone)\n```\n\n", + "parameters": { + "standard": [ + { + "name": "provider", + "type": "Literal['fmp', 'intrinio', 'polygon']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [], + "intrinio": [], + "polygon": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol of the pair to search.", + "default": null, + "optional": true + }, + { + "name": "date", + "type": "Union[date, str]", + "description": "A specific date to get data for.", + "default": null, + "optional": true + }, + { + "name": "search", + "type": "str", + "description": "Search for terms within the ticker and/or company name.", + "default": "", + "optional": true + }, + { + "name": "active", + "type": "bool", + "description": "Specify if the tickers returned should be actively traded on the queried date.", + "default": true, + "optional": true + }, + { + "name": "order", + "type": "Literal['asc', 'desc']", + "description": "Order data by ascending or descending.", + "default": "asc", + "optional": true + }, + { + "name": "sort", + "type": "Literal['ticker', 'name', 'market', 'locale', 'currency_symbol', 'currency_name', 'base_currency_symbol', 'base_currency_name', 'last_updated_utc', 'delisted_utc']", + "description": "Sort field used for ordering.", + "default": "", + "optional": true + }, + { + "name": "limit", + "type": "Annotated[int, Gt(gt=0)]", + "description": "The number of data entries to return.", + "default": 1000, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[CurrencyPairs]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'intrinio', 'polygon']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "name", + "type": "str", + "description": "Name of the currency pair.", + "default": "", + "optional": false + } + ], + "fmp": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol of the currency pair.", + "default": "", + "optional": false + }, + { + "name": "currency", + "type": "str", + "description": "Base currency of the currency pair.", + "default": "", + "optional": false + }, + { + "name": "stock_exchange", + "type": "str", + "description": "Stock exchange of the currency pair.", + "default": null, + "optional": true + }, + { + "name": "exchange_short_name", + "type": "str", + "description": "Short name of the stock exchange of the currency pair.", + "default": null, + "optional": true + } + ], + "intrinio": [ + { + "name": "code", + "type": "str", + "description": "Code of the currency pair.", + "default": "", + "optional": false + }, + { + "name": "base_currency", + "type": "str", + "description": "ISO 4217 currency code of the base currency.", + "default": "", + "optional": false + }, + { + "name": "quote_currency", + "type": "str", + "description": "ISO 4217 currency code of the quote currency.", + "default": "", + "optional": false + } + ], + "polygon": [ + { + "name": "market", + "type": "str", + "description": "Name of the trading market. Always 'fx'.", + "default": "", + "optional": false + }, + { + "name": "locale", + "type": "str", + "description": "Locale of the currency pair.", + "default": "", + "optional": false + }, + { + "name": "currency_symbol", + "type": "str", + "description": "The symbol of the quote currency.", + "default": null, + "optional": true + }, + { + "name": "currency_name", + "type": "str", + "description": "Name of the quote currency.", + "default": null, + "optional": true + }, + { + "name": "base_currency_symbol", + "type": "str", + "description": "The symbol of the base currency.", + "default": null, + "optional": true + }, + { + "name": "base_currency_name", + "type": "str", + "description": "Name of the base currency.", + "default": null, + "optional": true + }, + { + "name": "last_updated_utc", + "type": "datetime", + "description": "The last updated timestamp in UTC.", + "default": "", + "optional": false + }, + { + "name": "delisted_utc", + "type": "datetime", + "description": "The delisted timestamp in UTC.", + "default": null, + "optional": true + } + ] + }, + "model": "CurrencyPairs" + }, + "/currency/snapshots": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Snapshots of currency exchange rates from an indirect or direct perspective of a base currency.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.currency.snapshots(provider='fmp')\n# Get exchange rates from USD and XAU to EUR, JPY, and GBP using 'fmp' as provider.\nobb.currency.snapshots(provider='fmp', base='USD,XAU', counter_currencies='EUR,JPY,GBP', quote_type='indirect')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "base", + "type": "Union[str, List[str]]", + "description": "The base currency symbol. Multiple items allowed for provider(s): fmp.", + "default": "usd", + "optional": true + }, + { + "name": "quote_type", + "type": "Literal['direct', 'indirect']", + "description": "Whether the quote is direct or indirect. Selecting 'direct' will return the exchange rate as the amount of domestic currency required to buy one unit of the foreign currency. Selecting 'indirect' (default) will return the exchange rate as the amount of foreign currency required to buy one unit of the domestic currency.", + "default": "indirect", + "optional": true + }, + { + "name": "counter_currencies", + "type": "Union[List[str], str]", + "description": "An optional list of counter currency symbols to filter for. None returns all.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[CurrencySnapshots]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "base_currency", + "type": "str", + "description": "The base, or domestic, currency.", + "default": "", + "optional": false + }, + { + "name": "counter_currency", + "type": "str", + "description": "The counter, or foreign, currency.", + "default": "", + "optional": false + }, + { + "name": "last_rate", + "type": "float", + "description": "The exchange rate, relative to the base currency. Rates are expressed as the amount of foreign currency received from selling one unit of the base currency, or the quantity of foreign currency required to purchase one unit of the domestic currency. To inverse the perspective, set the 'quote_type' parameter as 'direct'.", + "default": "", + "optional": false + }, + { + "name": "open", + "type": "float", + "description": "The open price.", + "default": null, + "optional": true + }, + { + "name": "high", + "type": "float", + "description": "The high price.", + "default": null, + "optional": true + }, + { + "name": "low", + "type": "float", + "description": "The low price.", + "default": null, + "optional": true + }, + { + "name": "close", + "type": "float", + "description": "The close price.", + "default": null, + "optional": true + }, + { + "name": "volume", + "type": "int", + "description": "The trading volume.", + "default": null, + "optional": true + }, + { + "name": "prev_close", + "type": "float", + "description": "The previous close price.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "change", + "type": "float", + "description": "The change in the price from the previous close.", + "default": null, + "optional": true + }, + { + "name": "change_percent", + "type": "float", + "description": "The change in the price from the previous close, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "ma50", + "type": "float", + "description": "The 50-day moving average.", + "default": null, + "optional": true + }, + { + "name": "ma200", + "type": "float", + "description": "The 200-day moving average.", + "default": null, + "optional": true + }, + { + "name": "year_high", + "type": "float", + "description": "The 52-week high.", + "default": null, + "optional": true + }, + { + "name": "year_low", + "type": "float", + "description": "The 52-week low.", + "default": null, + "optional": true + }, + { + "name": "last_rate_timestamp", + "type": "datetime", + "description": "The timestamp of the last rate.", + "default": null, + "optional": true + } + ] + }, + "model": "CurrencySnapshots" + }, + "/derivatives/options/chains": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the complete options chain for a ticker.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.derivatives.options.chains(symbol='AAPL', provider='intrinio')\n# Use the \"date\" parameter to get the end-of-day-data for a specific date, where supported.\nobb.derivatives.options.chains(symbol='AAPL', date=2023-01-25, provider='intrinio')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['intrinio']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'intrinio' if there is no default.", + "default": "intrinio", + "optional": true + } + ], + "intrinio": [ + { + "name": "date", + "type": "Union[date, str]", + "description": "The end-of-day date for options chains data.", + "default": null, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[OptionsChains]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['intrinio']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data. Here, it is the underlying symbol for the option.", + "default": null, + "optional": true + }, + { + "name": "contract_symbol", + "type": "str", + "description": "Contract symbol for the option.", + "default": "", + "optional": false + }, + { + "name": "eod_date", + "type": "date", + "description": "Date for which the options chains are returned.", + "default": null, + "optional": true + }, + { + "name": "expiration", + "type": "date", + "description": "Expiration date of the contract.", + "default": "", + "optional": false + }, + { + "name": "strike", + "type": "float", + "description": "Strike price of the contract.", + "default": "", + "optional": false + }, + { + "name": "option_type", + "type": "str", + "description": "Call or Put.", + "default": "", + "optional": false + }, + { + "name": "open_interest", + "type": "int", + "description": "Open interest on the contract.", + "default": null, + "optional": true + }, + { + "name": "volume", + "type": "int", + "description": "The trading volume.", + "default": null, + "optional": true + }, + { + "name": "theoretical_price", + "type": "float", + "description": "Theoretical value of the option.", + "default": null, + "optional": true + }, + { + "name": "last_trade_price", + "type": "float", + "description": "Last trade price of the option.", + "default": null, + "optional": true + }, + { + "name": "tick", + "type": "str", + "description": "Whether the last tick was up or down in price.", + "default": null, + "optional": true + }, + { + "name": "bid", + "type": "float", + "description": "Current bid price for the option.", + "default": null, + "optional": true + }, + { + "name": "bid_size", + "type": "int", + "description": "Bid size for the option.", + "default": null, + "optional": true + }, + { + "name": "ask", + "type": "float", + "description": "Current ask price for the option.", + "default": null, + "optional": true + }, + { + "name": "ask_size", + "type": "int", + "description": "Ask size for the option.", + "default": null, + "optional": true + }, + { + "name": "mark", + "type": "float", + "description": "The mid-price between the latest bid and ask.", + "default": null, + "optional": true + }, + { + "name": "open", + "type": "float", + "description": "The open price.", + "default": null, + "optional": true + }, + { + "name": "open_bid", + "type": "float", + "description": "The opening bid price for the option that day.", + "default": null, + "optional": true + }, + { + "name": "open_ask", + "type": "float", + "description": "The opening ask price for the option that day.", + "default": null, + "optional": true + }, + { + "name": "high", + "type": "float", + "description": "The high price.", + "default": null, + "optional": true + }, + { + "name": "bid_high", + "type": "float", + "description": "The highest bid price for the option that day.", + "default": null, + "optional": true + }, + { + "name": "ask_high", + "type": "float", + "description": "The highest ask price for the option that day.", + "default": null, + "optional": true + }, + { + "name": "low", + "type": "float", + "description": "The low price.", + "default": null, + "optional": true + }, + { + "name": "bid_low", + "type": "float", + "description": "The lowest bid price for the option that day.", + "default": null, + "optional": true + }, + { + "name": "ask_low", + "type": "float", + "description": "The lowest ask price for the option that day.", + "default": null, + "optional": true + }, + { + "name": "close", + "type": "float", + "description": "The close price.", + "default": null, + "optional": true + }, + { + "name": "close_size", + "type": "int", + "description": "The closing trade size for the option that day.", + "default": null, + "optional": true + }, + { + "name": "close_time", + "type": "datetime", + "description": "The time of the closing price for the option that day.", + "default": null, + "optional": true + }, + { + "name": "close_bid", + "type": "float", + "description": "The closing bid price for the option that day.", + "default": null, + "optional": true + }, + { + "name": "close_bid_size", + "type": "int", + "description": "The closing bid size for the option that day.", + "default": null, + "optional": true + }, + { + "name": "close_bid_time", + "type": "datetime", + "description": "The time of the bid closing price for the option that day.", + "default": null, + "optional": true + }, + { + "name": "close_ask", + "type": "float", + "description": "The closing ask price for the option that day.", + "default": null, + "optional": true + }, + { + "name": "close_ask_size", + "type": "int", + "description": "The closing ask size for the option that day.", + "default": null, + "optional": true + }, + { + "name": "close_ask_time", + "type": "datetime", + "description": "The time of the ask closing price for the option that day.", + "default": null, + "optional": true + }, + { + "name": "prev_close", + "type": "float", + "description": "The previous close price.", + "default": null, + "optional": true + }, + { + "name": "change", + "type": "float", + "description": "The change in the price of the option.", + "default": null, + "optional": true + }, + { + "name": "change_percent", + "type": "float", + "description": "Change, in normalizezd percentage points, of the option.", + "default": null, + "optional": true + }, + { + "name": "implied_volatility", + "type": "float", + "description": "Implied volatility of the option.", + "default": null, + "optional": true + }, + { + "name": "delta", + "type": "float", + "description": "Delta of the option.", + "default": null, + "optional": true + }, + { + "name": "gamma", + "type": "float", + "description": "Gamma of the option.", + "default": null, + "optional": true + }, + { + "name": "theta", + "type": "float", + "description": "Theta of the option.", + "default": null, + "optional": true + }, + { + "name": "vega", + "type": "float", + "description": "Vega of the option.", + "default": null, + "optional": true + }, + { + "name": "rho", + "type": "float", + "description": "Rho of the option.", + "default": null, + "optional": true + } + ], + "intrinio": [ + { + "name": "exercise_style", + "type": "str", + "description": "The exercise style of the option, American or European.", + "default": null, + "optional": true + } + ] + }, + "model": "OptionsChains" + }, + "/derivatives/options/unusual": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the complete options chain for a ticker.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.derivatives.options.unusual(provider='intrinio')\n# Use the 'symbol' parameter to get the most recent activity for a specific symbol.\nobb.derivatives.options.unusual(symbol='TSLA', provider='intrinio')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for. (the underlying symbol)", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['intrinio']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'intrinio' if there is no default.", + "default": "intrinio", + "optional": true + } + ], + "intrinio": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format. If no symbol is supplied, requests are only allowed for a single date. Use the start_date for the target date. Intrinio appears to have data beginning Feb/2022, but is unclear when it actually began.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format. If a symbol is not supplied, do not include an end date.", + "default": null, + "optional": true + }, + { + "name": "trade_type", + "type": "Literal['block', 'sweep', 'large']", + "description": "The type of unusual activity to query for.", + "default": null, + "optional": true + }, + { + "name": "sentiment", + "type": "Literal['bullish', 'bearish', 'neutral']", + "description": "The sentiment type to query for.", + "default": null, + "optional": true + }, + { + "name": "min_value", + "type": "Union[float, int]", + "description": "The inclusive minimum total value for the unusual activity.", + "default": null, + "optional": true + }, + { + "name": "max_value", + "type": "Union[float, int]", + "description": "The inclusive maximum total value for the unusual activity.", + "default": null, + "optional": true + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return. A typical day for all symbols will yield 50-80K records. The API will paginate at 1000 records. The high default limit (100K) is to be able to reliably capture the most days. The high absolute limit (1.25M) is to allow for outlier days. Queries at the absolute limit will take a long time, and might be unreliable. Apply filters to improve performance.", + "default": 100000, + "optional": true + }, + { + "name": "source", + "type": "Literal['delayed', 'realtime']", + "description": "The source of the data. Either realtime or delayed.", + "default": "delayed", + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[OptionsUnusual]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['intrinio']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "underlying_symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data. (the underlying symbol)", + "default": null, + "optional": true + }, + { + "name": "contract_symbol", + "type": "str", + "description": "Contract symbol for the option.", + "default": "", + "optional": false + } + ], + "intrinio": [ + { + "name": "trade_timestamp", + "type": "datetime", + "description": "The datetime of order placement.", + "default": "", + "optional": false + }, + { + "name": "trade_type", + "type": "Literal['block', 'sweep', 'large']", + "description": "The type of unusual trade.", + "default": "", + "optional": false + }, + { + "name": "sentiment", + "type": "Literal['bullish', 'bearish', 'neutral']", + "description": "Bullish, Bearish, or Neutral Sentiment is estimated based on whether the trade was executed at the bid, ask, or mark price.", + "default": "", + "optional": false + }, + { + "name": "bid_at_execution", + "type": "float", + "description": "Bid price at execution.", + "default": "", + "optional": false + }, + { + "name": "ask_at_execution", + "type": "float", + "description": "Ask price at execution.", + "default": "", + "optional": false + }, + { + "name": "average_price", + "type": "float", + "description": "The average premium paid per option contract.", + "default": "", + "optional": false + }, + { + "name": "underlying_price_at_execution", + "type": "float", + "description": "Price of the underlying security at execution of trade.", + "default": null, + "optional": true + }, + { + "name": "total_size", + "type": "int", + "description": "The total number of contracts involved in a single transaction.", + "default": "", + "optional": false + }, + { + "name": "total_value", + "type": "Union[int, float]", + "description": "The aggregated value of all option contract premiums included in the trade.", + "default": "", + "optional": false + } + ] + }, + "model": "OptionsUnusual" + }, + "/derivatives/futures/historical": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Historical futures prices.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.derivatives.futures.historical(symbol='ES', provider='yfinance')\n# Enter multiple symbols.\nobb.derivatives.futures.historical(symbol='ES,NQ', provider='yfinance')\n# Enter expiration dates as \"YYYY-MM\".\nobb.derivatives.futures.historical(symbol='ES', provider='yfinance', expiration='2025-12')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Multiple items allowed for provider(s): yfinance.", + "default": "", + "optional": false + }, + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "expiration", + "type": "str", + "description": "Future expiry date with format YYYY-MM", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'yfinance' if there is no default.", + "default": "yfinance", + "optional": true + } + ], + "yfinance": [ + { + "name": "interval", + "type": "Literal['1m', '2m', '5m', '15m', '30m', '60m', '90m', '1h', '1d', '5d', '1W', '1M', '1Q']", + "description": "Time interval of the data to return.", + "default": "1d", + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[FuturesHistorical]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "datetime", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "open", + "type": "float", + "description": "The open price.", + "default": "", + "optional": false + }, + { + "name": "high", + "type": "float", + "description": "The high price.", + "default": "", + "optional": false + }, + { + "name": "low", + "type": "float", + "description": "The low price.", + "default": "", + "optional": false + }, + { + "name": "close", + "type": "float", + "description": "The close price.", + "default": "", + "optional": false + }, + { + "name": "volume", + "type": "float", + "description": "The trading volume.", + "default": "", + "optional": false + } + ], + "yfinance": [] + }, + "model": "FuturesHistorical" + }, + "/derivatives/futures/curve": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Futures Term Structure, current or historical.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\n# Enter a date to get the term structure from a historical date.\nobb.derivatives.futures.curve(symbol='NG', provider='yfinance', date='2023-01-01')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "date", + "type": "Union[date, str]", + "description": "A specific date to get data for.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'yfinance' if there is no default.", + "default": "yfinance", + "optional": true + } + ], + "yfinance": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[FuturesCurve]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "expiration", + "type": "str", + "description": "Futures expiration month.", + "default": "", + "optional": false + }, + { + "name": "price", + "type": "float", + "description": "The close price.", + "default": null, + "optional": true + } + ], + "yfinance": [] + }, + "model": "FuturesCurve" + }, + "/economy/gdp/forecast": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get Forecasted GDP Data.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.gdp.forecast(provider='oecd')\nobb.economy.gdp.forecast(period='annual', type='real', provider='oecd')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "period", + "type": "Literal['quarter', 'annual']", + "description": "Time period of the data to return. Units for nominal GDP period. Either quarter or annual.", + "default": "annual", + "optional": true + }, + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "type", + "type": "Literal['nominal', 'real']", + "description": "Type of GDP to get forecast of. Either nominal or real.", + "default": "real", + "optional": true + }, + { + "name": "provider", + "type": "Literal['oecd']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'oecd' if there is no default.", + "default": "oecd", + "optional": true + } + ], + "oecd": [ + { + "name": "country", + "type": "Literal['argentina', 'asia', 'australia', 'austria', 'belgium', 'brazil', 'bulgaria', 'canada', 'chile', 'china', 'colombia', 'costa_rica', 'croatia', 'czech_republic', 'denmark', 'estonia', 'euro_area_17', 'finland', 'france', 'germany', 'greece', 'hungary', 'iceland', 'india', 'indonesia', 'ireland', 'israel', 'italy', 'japan', 'korea', 'latvia', 'lithuania', 'luxembourg', 'mexico', 'netherlands', 'new_zealand', 'non-oecd', 'norway', 'oecd_total', 'peru', 'poland', 'portugal', 'romania', 'russia', 'slovak_republic', 'slovenia', 'south_africa', 'spain', 'sweden', 'switzerland', 'turkey', 'united_kingdom', 'united_states', 'world']", + "description": "Country to get GDP for.", + "default": "united_states", + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[GdpForecast]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['oecd']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": null, + "optional": true + }, + { + "name": "value", + "type": "float", + "description": "Nominal GDP value on the date.", + "default": null, + "optional": true + } + ], + "oecd": [] + }, + "model": "GdpForecast" + }, + "/economy/gdp/nominal": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get Nominal GDP Data.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.gdp.nominal(provider='oecd')\nobb.economy.gdp.nominal(units='usd', provider='oecd')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "units", + "type": "Literal['usd', 'usd_cap']", + "description": "The unit of measurement for the data. Units to get nominal GDP in. Either usd or usd_cap indicating per capita.", + "default": "usd", + "optional": true + }, + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['oecd']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'oecd' if there is no default.", + "default": "oecd", + "optional": true + } + ], + "oecd": [ + { + "name": "country", + "type": "Literal['australia', 'austria', 'belgium', 'brazil', 'canada', 'chile', 'colombia', 'costa_rica', 'czech_republic', 'denmark', 'estonia', 'euro_area', 'european_union', 'finland', 'france', 'germany', 'greece', 'hungary', 'iceland', 'indonesia', 'ireland', 'israel', 'italy', 'japan', 'korea', 'latvia', 'lithuania', 'luxembourg', 'mexico', 'netherlands', 'new_zealand', 'norway', 'poland', 'portugal', 'russia', 'slovak_republic', 'slovenia', 'south_africa', 'spain', 'sweden', 'switzerland', 'turkey', 'united_kingdom', 'united_states', 'all']", + "description": "Country to get GDP for.", + "default": "united_states", + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[GdpNominal]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['oecd']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": null, + "optional": true + }, + { + "name": "value", + "type": "float", + "description": "Nominal GDP value on the date.", + "default": null, + "optional": true + } + ], + "oecd": [] + }, + "model": "GdpNominal" + }, + "/economy/gdp/real": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get Real GDP Data.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.gdp.real(provider='oecd')\nobb.economy.gdp.real(units='yoy', provider='oecd')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "units", + "type": "Literal['idx', 'qoq', 'yoy']", + "description": "The unit of measurement for the data. Either idx (indicating 2015=100), qoq (previous period) or yoy (same period, previous year).)", + "default": "yoy", + "optional": true + }, + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['oecd']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'oecd' if there is no default.", + "default": "oecd", + "optional": true + } + ], + "oecd": [ + { + "name": "country", + "type": "Literal['G20', 'G7', 'argentina', 'australia', 'austria', 'belgium', 'brazil', 'bulgaria', 'canada', 'chile', 'china', 'colombia', 'costa_rica', 'croatia', 'czech_republic', 'denmark', 'estonia', 'euro_area_19', 'europe', 'european_union_27', 'finland', 'france', 'germany', 'greece', 'hungary', 'iceland', 'india', 'indonesia', 'ireland', 'israel', 'italy', 'japan', 'korea', 'latvia', 'lithuania', 'luxembourg', 'mexico', 'netherlands', 'new_zealand', 'norway', 'oecd_total', 'poland', 'portugal', 'romania', 'russia', 'saudi_arabia', 'slovak_republic', 'slovenia', 'south_africa', 'spain', 'sweden', 'switzerland', 'turkey', 'united_kingdom', 'united_states', 'all']", + "description": "Country to get GDP for.", + "default": "united_states", + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[GdpReal]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['oecd']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": null, + "optional": true + }, + { + "name": "value", + "type": "float", + "description": "Nominal GDP value on the date.", + "default": null, + "optional": true + } + ], + "oecd": [] + }, + "model": "GdpReal" + }, + "/economy/calendar": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the upcoming, or historical, economic calendar of global events.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\n# By default, the calendar will be forward-looking.\nobb.economy.calendar(provider='fmp')\nobb.economy.calendar(provider='fmp', start_date='2020-03-01', end_date='2020-03-31')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp', 'tradingeconomics']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [], + "tradingeconomics": [ + { + "name": "country", + "type": "Union[str, List[str]]", + "description": "Country of the event. Multiple items allowed for provider(s): tradingeconomics.", + "default": null, + "optional": true + }, + { + "name": "importance", + "type": "Literal['Low', 'Medium', 'High']", + "description": "Importance of the event.", + "default": null, + "optional": true + }, + { + "name": "group", + "type": "Literal['interest rate', 'inflation', 'bonds', 'consumer', 'gdp', 'government', 'housing', 'labour', 'markets', 'money', 'prices', 'trade', 'business']", + "description": "Grouping of events", + "default": null, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EconomicCalendar]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'tradingeconomics']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "datetime", + "description": "The date of the data.", + "default": null, + "optional": true + }, + { + "name": "country", + "type": "str", + "description": "Country of event.", + "default": null, + "optional": true + }, + { + "name": "event", + "type": "str", + "description": "Event name.", + "default": null, + "optional": true + }, + { + "name": "reference", + "type": "str", + "description": "Abbreviated period for which released data refers to.", + "default": null, + "optional": true + }, + { + "name": "source", + "type": "str", + "description": "Source of the data.", + "default": null, + "optional": true + }, + { + "name": "sourceurl", + "type": "str", + "description": "Source URL.", + "default": null, + "optional": true + }, + { + "name": "actual", + "type": "Union[str, float]", + "description": "Latest released value.", + "default": null, + "optional": true + }, + { + "name": "previous", + "type": "Union[str, float]", + "description": "Value for the previous period after the revision (if revision is applicable).", + "default": null, + "optional": true + }, + { + "name": "consensus", + "type": "Union[str, float]", + "description": "Average forecast among a representative group of economists.", + "default": null, + "optional": true + }, + { + "name": "forecast", + "type": "Union[str, float]", + "description": "Trading Economics projections", + "default": null, + "optional": true + }, + { + "name": "url", + "type": "str", + "description": "Trading Economics URL", + "default": null, + "optional": true + }, + { + "name": "importance", + "type": "Union[Literal[0, 1, 2, 3], str]", + "description": "Importance of the event. 1-Low, 2-Medium, 3-High", + "default": null, + "optional": true + }, + { + "name": "currency", + "type": "str", + "description": "Currency of the data.", + "default": null, + "optional": true + }, + { + "name": "unit", + "type": "str", + "description": "Unit of the data.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "change", + "type": "float", + "description": "Value change since previous.", + "default": null, + "optional": true + }, + { + "name": "change_percent", + "type": "float", + "description": "Percentage change since previous.", + "default": null, + "optional": true + }, + { + "name": "updated_at", + "type": "datetime", + "description": "Last updated timestamp.", + "default": null, + "optional": true + }, + { + "name": "created_at", + "type": "datetime", + "description": "Created at timestamp.", + "default": null, + "optional": true + } + ], + "tradingeconomics": [] + }, + "model": "EconomicCalendar" + }, + "/economy/cpi": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get Consumer Price Index (CPI).\n\nReturns either the rescaled index value, or a rate of change (inflation).", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.cpi(country='japan,china,turkey', provider='fred')\n# Use the `units` parameter to define the reference period for the change in values.\nobb.economy.cpi(country='united_states,united_kingdom', units='growth_previous', provider='fred')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "country", + "type": "Union[str, List[str]]", + "description": "The country to get data. Multiple items allowed for provider(s): fred.", + "default": "", + "optional": false + }, + { + "name": "units", + "type": "Literal['growth_previous', 'growth_same', 'index_2015']", + "description": "The unit of measurement for the data. Options: - `growth_previous`: Percent growth from the previous period. If monthly data, this is month-over-month, etc - `growth_same`: Percent growth from the same period in the previous year. If looking at monthly data, this would be year-over-year, etc. - `index_2015`: Rescaled index value, such that the value in 2015 is 100.", + "default": "growth_same", + "optional": true + }, + { + "name": "frequency", + "type": "Literal['monthly', 'quarter', 'annual']", + "description": "The frequency of the data. Options: `monthly`, `quarter`, and `annual`.", + "default": "monthly", + "optional": true + }, + { + "name": "harmonized", + "type": "bool", + "description": "Whether you wish to obtain harmonized data.", + "default": false, + "optional": true + }, + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fred']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", + "default": "fred", + "optional": true + } + ], + "fred": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[ConsumerPriceIndex]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fred']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + } + ], + "fred": [] + }, + "model": "ConsumerPriceIndex" + }, + "/economy/risk_premium": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get Market Risk Premium by country.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.risk_premium(provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[RiskPremium]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "country", + "type": "str", + "description": "Market country.", + "default": "", + "optional": false + }, + { + "name": "continent", + "type": "str", + "description": "Continent of the country.", + "default": null, + "optional": true + }, + { + "name": "total_equity_risk_premium", + "type": "Annotated[float, Gt(gt=0)]", + "description": "Total equity risk premium for the country.", + "default": null, + "optional": true + }, + { + "name": "country_risk_premium", + "type": "Annotated[float, Ge(ge=0)]", + "description": "Country-specific risk premium.", + "default": null, + "optional": true + } + ], + "fmp": [] + }, + "model": "RiskPremium" + }, + "/economy/fred_search": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Search for FRED series or economic releases by ID or string.\n\nThis does not return the observation values, only the metadata.\nUse this function to find series IDs for `fred_series()`.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.fred_search(provider='fred')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "query", + "type": "str", + "description": "The search word(s).", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fred']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", + "default": "fred", + "optional": true + } + ], + "fred": [ + { + "name": "is_release", + "type": "bool", + "description": "Is release? If True, other search filter variables are ignored. If no query text or release_id is supplied, this defaults to True.", + "default": false, + "optional": true + }, + { + "name": "release_id", + "type": "Union[int, str]", + "description": "A specific release ID to target.", + "default": null, + "optional": true + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return. (1-1000)", + "default": null, + "optional": true + }, + { + "name": "offset", + "type": "Annotated[int, Ge(ge=0)]", + "description": "Offset the results in conjunction with limit.", + "default": 0, + "optional": true + }, + { + "name": "filter_variable", + "type": "Literal[None, 'frequency', 'units', 'seasonal_adjustment']", + "description": "Filter by an attribute.", + "default": null, + "optional": true + }, + { + "name": "filter_value", + "type": "str", + "description": "String value to filter the variable by. Used in conjunction with filter_variable.", + "default": null, + "optional": true + }, + { + "name": "tag_names", + "type": "str", + "description": "A semicolon delimited list of tag names that series match all of. Example: 'japan;imports'", + "default": null, + "optional": true + }, + { + "name": "exclude_tag_names", + "type": "str", + "description": "A semicolon delimited list of tag names that series match none of. Example: 'imports;services'. Requires that variable tag_names also be set to limit the number of matching series.", + "default": null, + "optional": true + }, + { + "name": "series_id", + "type": "str", + "description": "A FRED Series ID to return series group information for. This returns the required information to query for regional data. Not all series that are in FRED have geographical data. Entering a value for series_id will override all other parameters. Multiple series_ids can be separated by commas.", + "default": null, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[FredSearch]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fred']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "release_id", + "type": "Union[int, str]", + "description": "The release ID for queries.", + "default": null, + "optional": true + }, + { + "name": "series_id", + "type": "str", + "description": "The series ID for the item in the release.", + "default": null, + "optional": true + }, + { + "name": "name", + "type": "str", + "description": "The name of the release.", + "default": null, + "optional": true + }, + { + "name": "title", + "type": "str", + "description": "The title of the series.", + "default": null, + "optional": true + }, + { + "name": "observation_start", + "type": "date", + "description": "The date of the first observation in the series.", + "default": null, + "optional": true + }, + { + "name": "observation_end", + "type": "date", + "description": "The date of the last observation in the series.", + "default": null, + "optional": true + }, + { + "name": "frequency", + "type": "str", + "description": "The frequency of the data.", + "default": null, + "optional": true + }, + { + "name": "frequency_short", + "type": "str", + "description": "Short form of the data frequency.", + "default": null, + "optional": true + }, + { + "name": "units", + "type": "str", + "description": "The units of the data.", + "default": null, + "optional": true + }, + { + "name": "units_short", + "type": "str", + "description": "Short form of the data units.", + "default": null, + "optional": true + }, + { + "name": "seasonal_adjustment", + "type": "str", + "description": "The seasonal adjustment of the data.", + "default": null, + "optional": true + }, + { + "name": "seasonal_adjustment_short", + "type": "str", + "description": "Short form of the data seasonal adjustment.", + "default": null, + "optional": true + }, + { + "name": "last_updated", + "type": "datetime", + "description": "The datetime of the last update to the data.", + "default": null, + "optional": true + }, + { + "name": "notes", + "type": "str", + "description": "Description of the release.", + "default": null, + "optional": true + }, + { + "name": "press_release", + "type": "bool", + "description": "If the release is a press release.", + "default": null, + "optional": true + }, + { + "name": "url", + "type": "str", + "description": "URL to the release.", + "default": null, + "optional": true + } + ], + "fred": [ + { + "name": "popularity", + "type": "int", + "description": "Popularity of the series", + "default": null, + "optional": true + }, + { + "name": "group_popularity", + "type": "int", + "description": "Group popularity of the release", + "default": null, + "optional": true + }, + { + "name": "region_type", + "type": "str", + "description": "The region type of the series.", + "default": null, + "optional": true + }, + { + "name": "series_group", + "type": "Union[int, str]", + "description": "The series group ID of the series. This value is used to query for regional data.", + "default": null, + "optional": true + } + ] + }, + "model": "FredSearch" + }, + "/economy/fred_series": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get data by series ID from FRED.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.fred_series(symbol='NFCI', provider='fred')\n# Multiple series can be passed in as a list.\nobb.economy.fred_series(symbol='NFCI,STLFSI4', provider='fred')\n# Use the `transform` parameter to transform the data as change, log, or percent change.\nobb.economy.fred_series(symbol='CBBTCUSD', transform=pc1, provider='fred')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fred.", + "default": "", + "optional": false + }, + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": 100000, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fred', 'intrinio']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", + "default": "fred", + "optional": true + } + ], + "fred": [ + { + "name": "frequency", + "type": "Literal[None, 'a', 'q', 'm', 'w', 'd', 'wef', 'weth', 'wew', 'wetu', 'wem', 'wesu', 'wesa', 'bwew', 'bwem']", + "description": "Frequency aggregation to convert high frequency data to lower frequency. None = No change a = Annual q = Quarterly m = Monthly w = Weekly d = Daily wef = Weekly, Ending Friday weth = Weekly, Ending Thursday wew = Weekly, Ending Wednesday wetu = Weekly, Ending Tuesday wem = Weekly, Ending Monday wesu = Weekly, Ending Sunday wesa = Weekly, Ending Saturday bwew = Biweekly, Ending Wednesday bwem = Biweekly, Ending Monday", + "default": null, + "optional": true + }, + { + "name": "aggregation_method", + "type": "Literal[None, 'avg', 'sum', 'eop']", + "description": "A key that indicates the aggregation method used for frequency aggregation. This parameter has no affect if the frequency parameter is not set. avg = Average sum = Sum eop = End of Period", + "default": "eop", + "optional": true + }, + { + "name": "transform", + "type": "Literal[None, 'chg', 'ch1', 'pch', 'pc1', 'pca', 'cch', 'cca', 'log']", + "description": "Transformation type None = No transformation chg = Change ch1 = Change from Year Ago pch = Percent Change pc1 = Percent Change from Year Ago pca = Compounded Annual Rate of Change cch = Continuously Compounded Rate of Change cca = Continuously Compounded Annual Rate of Change log = Natural Log", + "default": null, + "optional": true + } + ], + "intrinio": [ + { + "name": "all_pages", + "type": "bool", + "description": "Returns all pages of data from the API call at once.", + "default": false, + "optional": true + }, + { + "name": "sleep", + "type": "float", + "description": "Time to sleep between requests to avoid rate limiting.", + "default": 1.0, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[FredSeries]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fred', 'intrinio']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + } + ], + "fred": [], + "intrinio": [ + { + "name": "value", + "type": "float", + "description": "Value of the index.", + "default": null, + "optional": true + } + ] + }, + "model": "FredSeries" + }, + "/economy/money_measures": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get Money Measures (M1/M2 and components).\n\nThe Federal Reserve publishes as part of the H.6 Release.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.money_measures(provider='federal_reserve')\nobb.economy.money_measures(adjusted=False, provider='federal_reserve')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "adjusted", + "type": "bool", + "description": "Whether to return seasonally adjusted data.", + "default": true, + "optional": true + }, + { + "name": "provider", + "type": "Literal['federal_reserve']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'federal_reserve' if there is no default.", + "default": "federal_reserve", + "optional": true + } + ], + "federal_reserve": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[MoneyMeasures]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['federal_reserve']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "month", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "M1", + "type": "float", + "description": "Value of the M1 money supply in billions.", + "default": "", + "optional": false + }, + { + "name": "M2", + "type": "float", + "description": "Value of the M2 money supply in billions.", + "default": "", + "optional": false + }, + { + "name": "currency", + "type": "float", + "description": "Value of currency in circulation in billions.", + "default": null, + "optional": true + }, + { + "name": "demand_deposits", + "type": "float", + "description": "Value of demand deposits in billions.", + "default": null, + "optional": true + }, + { + "name": "retail_money_market_funds", + "type": "float", + "description": "Value of retail money market funds in billions.", + "default": null, + "optional": true + }, + { + "name": "other_liquid_deposits", + "type": "float", + "description": "Value of other liquid deposits in billions.", + "default": null, + "optional": true + }, + { + "name": "small_denomination_time_deposits", + "type": "float", + "description": "Value of small denomination time deposits in billions.", + "default": null, + "optional": true + } + ], + "federal_reserve": [] + }, + "model": "MoneyMeasures" + }, + "/economy/unemployment": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get global unemployment data.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.unemployment(provider='oecd')\nobb.economy.unemployment(country=all, frequency=quarterly, provider='oecd')\n# Demographics for the statistics are selected with the `age` parameter.\nobb.economy.unemployment(country=all, frequency=quarterly, age=25-54, provider='oecd')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['oecd']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'oecd' if there is no default.", + "default": "oecd", + "optional": true + } + ], + "oecd": [ + { + "name": "country", + "type": "Literal['colombia', 'new_zealand', 'united_kingdom', 'italy', 'luxembourg', 'euro_area19', 'sweden', 'oecd', 'south_africa', 'denmark', 'canada', 'switzerland', 'slovakia', 'hungary', 'portugal', 'spain', 'france', 'czech_republic', 'costa_rica', 'japan', 'slovenia', 'russia', 'austria', 'latvia', 'netherlands', 'israel', 'iceland', 'united_states', 'ireland', 'mexico', 'germany', 'greece', 'turkey', 'australia', 'poland', 'south_korea', 'chile', 'finland', 'european_union27_2020', 'norway', 'lithuania', 'euro_area20', 'estonia', 'belgium', 'brazil', 'indonesia', 'all']", + "description": "Country to get GDP for.", + "default": "united_states", + "optional": true + }, + { + "name": "sex", + "type": "Literal['total', 'male', 'female']", + "description": "Sex to get unemployment for.", + "default": "total", + "optional": true + }, + { + "name": "frequency", + "type": "Literal['monthly', 'quarterly', 'annual']", + "description": "Frequency to get unemployment for.", + "default": "monthly", + "optional": true + }, + { + "name": "age", + "type": "Literal['total', '15-24', '15-64', '25-54', '55-64']", + "description": "Age group to get unemployment for. Total indicates 15 years or over", + "default": "total", + "optional": true + }, + { + "name": "seasonal_adjustment", + "type": "bool", + "description": "Whether to get seasonally adjusted unemployment. Defaults to False.", + "default": false, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[Unemployment]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['oecd']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": null, + "optional": true + }, + { + "name": "value", + "type": "float", + "description": "Unemployment rate (given as a whole number, i.e 10=10%)", + "default": null, + "optional": true + }, + { + "name": "country", + "type": "str", + "description": "Country for which unemployment rate is given", + "default": null, + "optional": true + } + ], + "oecd": [] + }, + "model": "Unemployment" + }, + "/economy/composite_leading_indicator": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Use the composite leading indicator (CLI).\n\nIt is designed to provide early signals of turning points\nin business cycles showing fluctuation of the economic activity around its long term potential level.\n\nCLIs show short-term economic movements in qualitative rather than quantitative terms.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.composite_leading_indicator(provider='oecd')\nobb.economy.composite_leading_indicator(country=all, provider='oecd')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['oecd']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'oecd' if there is no default.", + "default": "oecd", + "optional": true + } + ], + "oecd": [ + { + "name": "country", + "type": "Literal['united_states', 'united_kingdom', 'japan', 'mexico', 'indonesia', 'australia', 'brazil', 'canada', 'italy', 'germany', 'turkey', 'france', 'south_africa', 'south_korea', 'spain', 'india', 'china', 'g7', 'g20', 'all']", + "description": "Country to get GDP for.", + "default": "united_states", + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[CLI]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['oecd']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": null, + "optional": true + }, + { + "name": "value", + "type": "float", + "description": "CLI value", + "default": null, + "optional": true + }, + { + "name": "country", + "type": "str", + "description": "Country for which CLI is given", + "default": null, + "optional": true + } + ], + "oecd": [] + }, + "model": "CLI" + }, + "/economy/short_term_interest_rate": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get Short-term interest rates.\n\nThey are the rates at which short-term borrowings are effected between\nfinancial institutions or the rate at which short-term government paper is issued or traded in the market.\n\nShort-term interest rates are generally averages of daily rates, measured as a percentage.\nShort-term interest rates are based on three-month money market rates where available.\nTypical standardised names are \"money market rate\" and \"treasury bill rate\".", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.short_term_interest_rate(provider='oecd')\nobb.economy.short_term_interest_rate(country=all, frequency=quarterly, provider='oecd')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['oecd']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'oecd' if there is no default.", + "default": "oecd", + "optional": true + } + ], + "oecd": [ + { + "name": "country", + "type": "Literal['belgium', 'ireland', 'mexico', 'indonesia', 'new_zealand', 'japan', 'united_kingdom', 'france', 'chile', 'canada', 'netherlands', 'united_states', 'south_korea', 'norway', 'austria', 'south_africa', 'denmark', 'switzerland', 'hungary', 'luxembourg', 'australia', 'germany', 'sweden', 'iceland', 'turkey', 'greece', 'israel', 'czech_republic', 'latvia', 'slovenia', 'poland', 'estonia', 'lithuania', 'portugal', 'costa_rica', 'slovakia', 'finland', 'spain', 'russia', 'euro_area19', 'colombia', 'italy', 'india', 'china', 'croatia', 'all']", + "description": "Country to get GDP for.", + "default": "united_states", + "optional": true + }, + { + "name": "frequency", + "type": "Literal['monthly', 'quarterly', 'annual']", + "description": "Frequency to get interest rate for for.", + "default": "monthly", + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[STIR]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['oecd']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": null, + "optional": true + }, + { + "name": "value", + "type": "float", + "description": "Interest rate (given as a whole number, i.e 10=10%)", + "default": null, + "optional": true + }, + { + "name": "country", + "type": "str", + "description": "Country for which interest rate is given", + "default": null, + "optional": true + } + ], + "oecd": [] + }, + "model": "STIR" + }, + "/economy/long_term_interest_rate": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get Long-term interest rates that refer to government bonds maturing in ten years.\n\nRates are mainly determined by the price charged by the lender, the risk from the borrower and the\nfall in the capital value. Long-term interest rates are generally averages of daily rates,\nmeasured as a percentage. These interest rates are implied by the prices at which the government bonds are\ntraded on financial markets, not the interest rates at which the loans were issued.\nIn all cases, they refer to bonds whose capital repayment is guaranteed by governments.\nLong-term interest rates are one of the determinants of business investment.\nLow long-term interest rates encourage investment in new equipment and high interest rates discourage it.\nInvestment is, in turn, a major source of economic growth.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.long_term_interest_rate(provider='oecd')\nobb.economy.long_term_interest_rate(country=all, frequency=quarterly, provider='oecd')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['oecd']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'oecd' if there is no default.", + "default": "oecd", + "optional": true + } + ], + "oecd": [ + { + "name": "country", + "type": "Literal['belgium', 'ireland', 'mexico', 'indonesia', 'new_zealand', 'japan', 'united_kingdom', 'france', 'chile', 'canada', 'netherlands', 'united_states', 'south_korea', 'norway', 'austria', 'south_africa', 'denmark', 'switzerland', 'hungary', 'luxembourg', 'australia', 'germany', 'sweden', 'iceland', 'turkey', 'greece', 'israel', 'czech_republic', 'latvia', 'slovenia', 'poland', 'estonia', 'lithuania', 'portugal', 'costa_rica', 'slovakia', 'finland', 'spain', 'russia', 'euro_area19', 'colombia', 'italy', 'india', 'china', 'croatia', 'all']", + "description": "Country to get GDP for.", + "default": "united_states", + "optional": true + }, + { + "name": "frequency", + "type": "Literal['monthly', 'quarterly', 'annual']", + "description": "Frequency to get interest rate for for.", + "default": "monthly", + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[LTIR]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['oecd']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": null, + "optional": true + }, + { + "name": "value", + "type": "float", + "description": "Interest rate (given as a whole number, i.e 10=10%)", + "default": null, + "optional": true + }, + { + "name": "country", + "type": "str", + "description": "Country for which interest rate is given", + "default": null, + "optional": true + } + ], + "oecd": [] + }, + "model": "LTIR" + }, + "/economy/fred_regional": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Query the Geo Fred API for regional economic data by series group.\n\nThe series group ID is found by using `fred_search` and the `series_id` parameter.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.economy.fred_regional(symbol='NYICLAIMS', provider='fred')\n# With a date, time series data is returned.\nobb.economy.fred_regional(symbol='NYICLAIMS', start_date='2021-01-01', end_date='2021-12-31', limit=10, provider='fred')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": 100000, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fred']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", + "default": "fred", + "optional": true + } + ], + "fred": [ + { + "name": "is_series_group", + "type": "bool", + "description": "When True, the symbol provided is for a series_group, else it is for a series ID.", + "default": false, + "optional": true + }, + { + "name": "region_type", + "type": "Literal['bea', 'msa', 'frb', 'necta', 'state', 'country', 'county', 'censusregion']", + "description": "The type of regional data. Parameter is only valid when `is_series_group` is True.", + "default": null, + "optional": true + }, + { + "name": "season", + "type": "Literal['SA', 'NSA', 'SSA']", + "description": "The seasonal adjustments to the data. Parameter is only valid when `is_series_group` is True.", + "default": "NSA", + "optional": true + }, + { + "name": "units", + "type": "str", + "description": "The units of the data. This should match the units returned from searching by series ID. An incorrect field will not necessarily return an error. Parameter is only valid when `is_series_group` is True.", + "default": null, + "optional": true + }, + { + "name": "frequency", + "type": "Literal['d', 'w', 'bw', 'm', 'q', 'sa', 'a', 'wef', 'weth', 'wew', 'wetu', 'wem', 'wesu', 'wesa', 'bwew', 'bwem']", + "description": "Frequency aggregation to convert high frequency data to lower frequency. Parameter is only valid when `is_series_group` is True. a = Annual sa= Semiannual q = Quarterly m = Monthly w = Weekly d = Daily wef = Weekly, Ending Friday weth = Weekly, Ending Thursday wew = Weekly, Ending Wednesday wetu = Weekly, Ending Tuesday wem = Weekly, Ending Monday wesu = Weekly, Ending Sunday wesa = Weekly, Ending Saturday bwew = Biweekly, Ending Wednesday bwem = Biweekly, Ending Monday", + "default": null, + "optional": true + }, + { + "name": "aggregation_method", + "type": "Literal['avg', 'sum', 'eop']", + "description": "A key that indicates the aggregation method used for frequency aggregation. This parameter has no affect if the frequency parameter is not set. Only valid when `is_series_group` is True. avg = Average sum = Sum eop = End of Period", + "default": "avg", + "optional": true + }, + { + "name": "transform", + "type": "Literal['lin', 'chg', 'ch1', 'pch', 'pc1', 'pca', 'cch', 'cca', 'log']", + "description": "Transformation type. Only valid when `is_series_group` is True. lin = Levels (No transformation) chg = Change ch1 = Change from Year Ago pch = Percent Change pc1 = Percent Change from Year Ago pca = Compounded Annual Rate of Change cch = Continuously Compounded Rate of Change cca = Continuously Compounded Annual Rate of Change log = Natural Log", + "default": "lin", + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[FredRegional]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fred']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + } + ], + "fred": [ + { + "name": "region", + "type": "str", + "description": "The name of the region.", + "default": "", + "optional": false + }, + { + "name": "code", + "type": "Union[str, int]", + "description": "The code of the region.", + "default": "", + "optional": false + }, + { + "name": "value", + "type": "Union[float, int]", + "description": "The obersvation value. The units are defined in the search results by series ID.", + "default": null, + "optional": true + }, + { + "name": "series_id", + "type": "str", + "description": "The individual series ID for the region.", + "default": "", + "optional": false + } + ] + }, + "model": "FredRegional" + }, + "/equity/calendar/ipo": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get historical and upcoming initial public offerings (IPOs).", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.calendar.ipo(provider='intrinio')\n# Get all IPOs available.\nobb.equity.calendar.ipo(provider='intrinio')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": null, + "optional": true + }, + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": 100, + "optional": true + }, + { + "name": "provider", + "type": "Literal['intrinio']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'intrinio' if there is no default.", + "default": "intrinio", + "optional": true + } + ], + "intrinio": [ + { + "name": "status", + "type": "Literal['upcoming', 'priced', 'withdrawn']", + "description": "Status of the IPO. [upcoming, priced, or withdrawn]", + "default": null, + "optional": true + }, + { + "name": "min_value", + "type": "int", + "description": "Return IPOs with an offer dollar amount greater than the given amount.", + "default": null, + "optional": true + }, + { + "name": "max_value", + "type": "int", + "description": "Return IPOs with an offer dollar amount less than the given amount.", + "default": null, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[CalendarIpo]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['intrinio']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": null, + "optional": true + }, + { + "name": "ipo_date", + "type": "date", + "description": "The date of the IPO, when the stock first trades on a major exchange.", + "default": null, + "optional": true + } + ], + "intrinio": [ + { + "name": "status", + "type": "Literal['upcoming', 'priced', 'withdrawn']", + "description": "The status of the IPO. Upcoming IPOs have not taken place yet but are expected to. Priced IPOs have taken place. Withdrawn IPOs were expected to take place, but were subsequently withdrawn.", + "default": null, + "optional": true + }, + { + "name": "exchange", + "type": "str", + "description": "The acronym of the stock exchange that the company is going to trade publicly on. Typically NYSE or NASDAQ.", + "default": null, + "optional": true + }, + { + "name": "offer_amount", + "type": "float", + "description": "The total dollar amount of shares offered in the IPO. Typically this is share price * share count", + "default": null, + "optional": true + }, + { + "name": "share_price", + "type": "float", + "description": "The price per share at which the IPO was offered.", + "default": null, + "optional": true + }, + { + "name": "share_price_lowest", + "type": "float", + "description": "The expected lowest price per share at which the IPO will be offered. Before an IPO is priced, companies typically provide a range of prices per share at which they expect to offer the IPO (typically available for upcoming IPOs).", + "default": null, + "optional": true + }, + { + "name": "share_price_highest", + "type": "float", + "description": "The expected highest price per share at which the IPO will be offered. Before an IPO is priced, companies typically provide a range of prices per share at which they expect to offer the IPO (typically available for upcoming IPOs).", + "default": null, + "optional": true + }, + { + "name": "share_count", + "type": "int", + "description": "The number of shares offered in the IPO.", + "default": null, + "optional": true + }, + { + "name": "share_count_lowest", + "type": "int", + "description": "The expected lowest number of shares that will be offered in the IPO. Before an IPO is priced, companies typically provide a range of shares that they expect to offer in the IPO (typically available for upcoming IPOs).", + "default": null, + "optional": true + }, + { + "name": "share_count_highest", + "type": "int", + "description": "The expected highest number of shares that will be offered in the IPO. Before an IPO is priced, companies typically provide a range of shares that they expect to offer in the IPO (typically available for upcoming IPOs).", + "default": null, + "optional": true + }, + { + "name": "announcement_url", + "type": "str", + "description": "The URL to the company's announcement of the IPO", + "default": null, + "optional": true + }, + { + "name": "sec_report_url", + "type": "str", + "description": "The URL to the company's S-1, S-1/A, F-1, or F-1/A SEC filing, which is required to be filed before an IPO takes place.", + "default": null, + "optional": true + }, + { + "name": "open_price", + "type": "float", + "description": "The opening price at the beginning of the first trading day (only available for priced IPOs).", + "default": null, + "optional": true + }, + { + "name": "close_price", + "type": "float", + "description": "The closing price at the end of the first trading day (only available for priced IPOs).", + "default": null, + "optional": true + }, + { + "name": "volume", + "type": "int", + "description": "The volume at the end of the first trading day (only available for priced IPOs).", + "default": null, + "optional": true + }, + { + "name": "day_change", + "type": "float", + "description": "The percentage change between the open price and the close price on the first trading day (only available for priced IPOs).", + "default": null, + "optional": true + }, + { + "name": "week_change", + "type": "float", + "description": "The percentage change between the open price on the first trading day and the close price approximately a week after the first trading day (only available for priced IPOs).", + "default": null, + "optional": true + }, + { + "name": "month_change", + "type": "float", + "description": "The percentage change between the open price on the first trading day and the close price approximately a month after the first trading day (only available for priced IPOs).", + "default": null, + "optional": true + }, + { + "name": "id", + "type": "str", + "description": "The Intrinio ID of the IPO.", + "default": null, + "optional": true + }, + { + "name": "company", + "type": "IntrinioCompany", + "description": "The company that is going public via the IPO.", + "default": null, + "optional": true + }, + { + "name": "security", + "type": "IntrinioSecurity", + "description": "The primary Security for the Company that is going public via the IPO", + "default": null, + "optional": true + } + ] + }, + "model": "CalendarIpo" + }, + "/equity/calendar/dividend": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get historical and upcoming dividend payments. Includes dividend amount, ex-dividend and payment dates.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.calendar.dividend(provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[CalendarDividend]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "ex_dividend_date", + "type": "date", + "description": "The ex-dividend date - the date on which the stock begins trading without rights to the dividend.", + "default": "", + "optional": false + }, + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "amount", + "type": "float", + "description": "The dividend amount per share.", + "default": null, + "optional": true + }, + { + "name": "name", + "type": "str", + "description": "Name of the entity.", + "default": null, + "optional": true + }, + { + "name": "record_date", + "type": "date", + "description": "The record date of ownership for eligibility.", + "default": null, + "optional": true + }, + { + "name": "payment_date", + "type": "date", + "description": "The payment date of the dividend.", + "default": null, + "optional": true + }, + { + "name": "declaration_date", + "type": "date", + "description": "Declaration date of the dividend.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "adjusted_amount", + "type": "float", + "description": "The adjusted-dividend amount.", + "default": null, + "optional": true + }, + { + "name": "label", + "type": "str", + "description": "Ex-dividend date formatted for display.", + "default": null, + "optional": true + } + ] + }, + "model": "CalendarDividend" + }, + "/equity/calendar/splits": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get historical and upcoming stock split operations.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.calendar.splits(provider='fmp')\n# Get stock splits calendar for specific dates.\nobb.equity.calendar.splits(start_date='2024-02-01', end_date='2024-02-07', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[CalendarSplits]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "label", + "type": "str", + "description": "Label of the stock splits.", + "default": "", + "optional": false + }, + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "numerator", + "type": "float", + "description": "Numerator of the stock splits.", + "default": "", + "optional": false + }, + { + "name": "denominator", + "type": "float", + "description": "Denominator of the stock splits.", + "default": "", + "optional": false + } + ], + "fmp": [] + }, + "model": "CalendarSplits" + }, + "/equity/calendar/earnings": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get historical and upcoming company earnings releases. Includes earnings per share (EPS) and revenue data.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.calendar.earnings(provider='fmp')\n# Get earnings calendar for specific dates.\nobb.equity.calendar.earnings(start_date='2024-02-01', end_date='2024-02-07', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[CalendarEarnings]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "report_date", + "type": "date", + "description": "The date of the earnings report.", + "default": "", + "optional": false + }, + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "name", + "type": "str", + "description": "Name of the entity.", + "default": null, + "optional": true + }, + { + "name": "eps_previous", + "type": "float", + "description": "The earnings-per-share from the same previously reported period.", + "default": null, + "optional": true + }, + { + "name": "eps_consensus", + "type": "float", + "description": "The analyst conesus earnings-per-share estimate.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "eps_actual", + "type": "float", + "description": "The actual earnings per share announced.", + "default": null, + "optional": true + }, + { + "name": "revenue_actual", + "type": "float", + "description": "The actual reported revenue.", + "default": null, + "optional": true + }, + { + "name": "revenue_consensus", + "type": "float", + "description": "The revenue forecast consensus.", + "default": null, + "optional": true + }, + { + "name": "period_ending", + "type": "date", + "description": "The fiscal period end date.", + "default": null, + "optional": true + }, + { + "name": "reporting_time", + "type": "str", + "description": "The reporting time - e.g. after market close.", + "default": null, + "optional": true + }, + { + "name": "updated_date", + "type": "date", + "description": "The date the data was updated last.", + "default": null, + "optional": true + } + ] + }, + "model": "CalendarEarnings" + }, + "/equity/compare/peers": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the closest peers for a given company.\n\nPeers consist of companies trading on the same exchange, operating within the same sector\nand with comparable market capitalizations.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.compare.peers(symbol='AAPL', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EquityPeers]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "peers_list", + "type": "List[str]", + "description": "A list of equity peers based on sector, exchange and market cap.", + "default": "", + "optional": true + } + ], + "fmp": [] + }, + "model": "EquityPeers" + }, + "/equity/estimates/price_target": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get analyst price targets by company.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.estimates.price_target(provider='benzinga')\n# Get price targets for Microsoft using 'benzinga' as provider.\nobb.equity.estimates.price_target(start_date=2020-01-01, end_date=2024-02-16, limit=10, symbol='msft', provider='benzinga', action=downgrades)\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Multiple items allowed for provider(s): benzinga, fmp.", + "default": null, + "optional": true + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": 200, + "optional": true + }, + { + "name": "provider", + "type": "Literal['benzinga', 'fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'benzinga' if there is no default.", + "default": "benzinga", + "optional": true + } + ], + "benzinga": [ + { + "name": "page", + "type": "int", + "description": "Page offset. For optimization, performance and technical reasons, page offsets are limited from 0 - 100000. Limit the query results by other parameters such as date. Used in conjunction with the limit and date parameters.", + "default": 0, + "optional": true + }, + { + "name": "date", + "type": "Union[date, str]", + "description": "Date for calendar data, shorthand for date_from and date_to.", + "default": null, + "optional": true + }, + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "updated", + "type": "Union[date, int]", + "description": "Records last Updated Unix timestamp (UTC). This will force the sort order to be Greater Than or Equal to the timestamp indicated. The date can be a date string or a Unix timestamp. The date string must be in the format of YYYY-MM-DD.", + "default": null, + "optional": true + }, + { + "name": "importance", + "type": "int", + "description": "Importance level to filter by. Uses Greater Than or Equal To the importance indicated", + "default": null, + "optional": true + }, + { + "name": "action", + "type": "Literal['downgrades', 'maintains', 'reinstates', 'reiterates', 'upgrades', 'assumes', 'initiates', 'terminates', 'removes', 'suspends', 'firm_dissolved']", + "description": "Filter by a specific action_company.", + "default": null, + "optional": true + }, + { + "name": "analyst_ids", + "type": "Union[List[str], str]", + "description": "Comma-separated list of analyst (person) IDs. Omitting will bring back all available analysts.", + "default": null, + "optional": true + }, + { + "name": "firm_ids", + "type": "Union[List[str], str]", + "description": "Comma-separated list of firm IDs.", + "default": null, + "optional": true + }, + { + "name": "fields", + "type": "Union[List[str], str]", + "description": "Comma-separated list of fields to include in the response. See https://docs.benzinga.io/benzinga-apis/calendar/get-ratings to learn about the available fields.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "with_grade", + "type": "bool", + "description": "Include upgrades and downgrades in the response.", + "default": false, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[PriceTarget]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['benzinga', 'fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "published_date", + "type": "Union[date, datetime]", + "description": "Published date of the price target.", + "default": "", + "optional": false + }, + { + "name": "published_time", + "type": "datetime.time", + "description": "Time of the original rating, UTC.", + "default": null, + "optional": true + }, + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "exchange", + "type": "str", + "description": "Exchange where the company is traded.", + "default": null, + "optional": true + }, + { + "name": "company_name", + "type": "str", + "description": "Name of company that is the subject of rating.", + "default": null, + "optional": true + }, + { + "name": "analyst_name", + "type": "str", + "description": "Analyst name.", + "default": null, + "optional": true + }, + { + "name": "analyst_firm", + "type": "str", + "description": "Name of the analyst firm that published the price target.", + "default": null, + "optional": true + }, + { + "name": "currency", + "type": "str", + "description": "Currency the data is denominated in.", + "default": null, + "optional": true + }, + { + "name": "price_target", + "type": "float", + "description": "The current price target.", + "default": null, + "optional": true + }, + { + "name": "adj_price_target", + "type": "float", + "description": "Adjusted price target for splits and stock dividends.", + "default": null, + "optional": true + }, + { + "name": "price_target_previous", + "type": "float", + "description": "Previous price target.", + "default": null, + "optional": true + }, + { + "name": "previous_adj_price_target", + "type": "float", + "description": "Previous adjusted price target.", + "default": null, + "optional": true + }, + { + "name": "price_when_posted", + "type": "float", + "description": "Price when posted.", + "default": null, + "optional": true + }, + { + "name": "rating_current", + "type": "str", + "description": "The analyst's rating for the company.", + "default": null, + "optional": true + }, + { + "name": "rating_previous", + "type": "str", + "description": "Previous analyst rating for the company.", + "default": null, + "optional": true + }, + { + "name": "action", + "type": "str", + "description": "Description of the change in rating from firm's last rating.", + "default": null, + "optional": true + } + ], + "benzinga": [ + { + "name": "action_change", + "type": "Literal['Announces', 'Maintains', 'Lowers', 'Raises', 'Removes', 'Adjusts']", + "description": "Description of the change in price target from firm's last price target.", + "default": null, + "optional": true + }, + { + "name": "importance", + "type": "Literal[0, 1, 2, 3, 4, 5]", + "description": "Subjective Basis of How Important Event is to Market. 5 = High", + "default": null, + "optional": true + }, + { + "name": "notes", + "type": "str", + "description": "Notes of the price target.", + "default": null, + "optional": true + }, + { + "name": "analyst_id", + "type": "str", + "description": "Id of the analyst.", + "default": null, + "optional": true + }, + { + "name": "url_news", + "type": "str", + "description": "URL for analyst ratings news articles for this ticker on Benzinga.com.", + "default": null, + "optional": true + }, + { + "name": "url_analyst", + "type": "str", + "description": "URL for analyst ratings page for this ticker on Benzinga.com.", + "default": null, + "optional": true + }, + { + "name": "id", + "type": "str", + "description": "Unique ID of this entry.", + "default": null, + "optional": true + }, + { + "name": "last_updated", + "type": "datetime", + "description": "Last updated timestamp, UTC.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "news_url", + "type": "str", + "description": "News URL of the price target.", + "default": null, + "optional": true + }, + { + "name": "news_title", + "type": "str", + "description": "News title of the price target.", + "default": null, + "optional": true + }, + { + "name": "news_publisher", + "type": "str", + "description": "News publisher of the price target.", + "default": null, + "optional": true + }, + { + "name": "news_base_url", + "type": "str", + "description": "News base URL of the price target.", + "default": null, + "optional": true + } + ] + }, + "model": "PriceTarget" + }, + "/equity/estimates/historical": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get historical analyst estimates for earnings and revenue.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.estimates.historical(symbol='AAPL', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [ + { + "name": "period", + "type": "Literal['quarter', 'annual']", + "description": "Time period of the data to return.", + "default": "annual", + "optional": true + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": null, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[AnalystEstimates]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "estimated_revenue_low", + "type": "int", + "description": "Estimated revenue low.", + "default": null, + "optional": true + }, + { + "name": "estimated_revenue_high", + "type": "int", + "description": "Estimated revenue high.", + "default": null, + "optional": true + }, + { + "name": "estimated_revenue_avg", + "type": "int", + "description": "Estimated revenue average.", + "default": null, + "optional": true + }, + { + "name": "estimated_sga_expense_low", + "type": "int", + "description": "Estimated SGA expense low.", + "default": null, + "optional": true + }, + { + "name": "estimated_sga_expense_high", + "type": "int", + "description": "Estimated SGA expense high.", + "default": null, + "optional": true + }, + { + "name": "estimated_sga_expense_avg", + "type": "int", + "description": "Estimated SGA expense average.", + "default": null, + "optional": true + }, + { + "name": "estimated_ebitda_low", + "type": "int", + "description": "Estimated EBITDA low.", + "default": null, + "optional": true + }, + { + "name": "estimated_ebitda_high", + "type": "int", + "description": "Estimated EBITDA high.", + "default": null, + "optional": true + }, + { + "name": "estimated_ebitda_avg", + "type": "int", + "description": "Estimated EBITDA average.", + "default": null, + "optional": true + }, + { + "name": "estimated_ebit_low", + "type": "int", + "description": "Estimated EBIT low.", + "default": null, + "optional": true + }, + { + "name": "estimated_ebit_high", + "type": "int", + "description": "Estimated EBIT high.", + "default": null, + "optional": true + }, + { + "name": "estimated_ebit_avg", + "type": "int", + "description": "Estimated EBIT average.", + "default": null, + "optional": true + }, + { + "name": "estimated_net_income_low", + "type": "int", + "description": "Estimated net income low.", + "default": null, + "optional": true + }, + { + "name": "estimated_net_income_high", + "type": "int", + "description": "Estimated net income high.", + "default": null, + "optional": true + }, + { + "name": "estimated_net_income_avg", + "type": "int", + "description": "Estimated net income average.", + "default": null, + "optional": true + }, + { + "name": "estimated_eps_avg", + "type": "float", + "description": "Estimated EPS average.", + "default": null, + "optional": true + }, + { + "name": "estimated_eps_high", + "type": "float", + "description": "Estimated EPS high.", + "default": null, + "optional": true + }, + { + "name": "estimated_eps_low", + "type": "float", + "description": "Estimated EPS low.", + "default": null, + "optional": true + }, + { + "name": "number_analyst_estimated_revenue", + "type": "int", + "description": "Number of analysts who estimated revenue.", + "default": null, + "optional": true + }, + { + "name": "number_analysts_estimated_eps", + "type": "int", + "description": "Number of analysts who estimated EPS.", + "default": null, + "optional": true + } + ], + "fmp": [] + }, + "model": "AnalystEstimates" + }, + "/equity/estimates/consensus": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get consensus price target and recommendation.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.estimates.consensus(symbol='AAPL', provider='fmp')\nobb.equity.estimates.consensus(symbol='AAPL,MSFT', provider='yfinance')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio, yfinance.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp', 'intrinio', 'yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [], + "intrinio": [ + { + "name": "industry_group_number", + "type": "int", + "description": "The Zacks industry group number.", + "default": null, + "optional": true + } + ], + "yfinance": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[PriceTargetConsensus]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'intrinio', 'yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "name", + "type": "str", + "description": "The company name", + "default": null, + "optional": true + }, + { + "name": "target_high", + "type": "float", + "description": "High target of the price target consensus.", + "default": null, + "optional": true + }, + { + "name": "target_low", + "type": "float", + "description": "Low target of the price target consensus.", + "default": null, + "optional": true + }, + { + "name": "target_consensus", + "type": "float", + "description": "Consensus target of the price target consensus.", + "default": null, + "optional": true + }, + { + "name": "target_median", + "type": "float", + "description": "Median target of the price target consensus.", + "default": null, + "optional": true + } + ], + "fmp": [], + "intrinio": [ + { + "name": "standard_deviation", + "type": "float", + "description": "The standard deviation of target price estimates.", + "default": null, + "optional": true + }, + { + "name": "total_anaylsts", + "type": "int", + "description": "The total number of target price estimates in consensus.", + "default": null, + "optional": true + }, + { + "name": "raised", + "type": "int", + "description": "The number of analysts that have raised their target price estimates.", + "default": null, + "optional": true + }, + { + "name": "lowered", + "type": "int", + "description": "The number of analysts that have lowered their target price estimates.", + "default": null, + "optional": true + }, + { + "name": "most_recent_date", + "type": "date", + "description": "The date of the most recent estimate.", + "default": null, + "optional": true + }, + { + "name": "industry_group_number", + "type": "int", + "description": "The Zacks industry group number.", + "default": null, + "optional": true + } + ], + "yfinance": [ + { + "name": "recommendation", + "type": "str", + "description": "Recommendation - buy, sell, etc.", + "default": null, + "optional": true + }, + { + "name": "recommendation_mean", + "type": "float", + "description": "Mean recommendation score where 1 is strong buy and 5 is strong sell.", + "default": null, + "optional": true + }, + { + "name": "number_of_analysts", + "type": "int", + "description": "Number of analysts providing opinions.", + "default": null, + "optional": true + }, + { + "name": "current_price", + "type": "float", + "description": "Current price of the stock.", + "default": null, + "optional": true + }, + { + "name": "currency", + "type": "str", + "description": "Currency the stock is priced in.", + "default": null, + "optional": true + } + ] + }, + "model": "PriceTargetConsensus" + }, + "/equity/estimates/analyst_search": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Search for specific analysts and get their forecast track record.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.estimates.analyst_search(provider='benzinga')\nobb.equity.estimates.analyst_search(firm_name='Wedbush', provider='benzinga')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "analyst_name", + "type": "Union[str, List[str]]", + "description": "Analyst names to return. Omitting will return all available analysts. Multiple items allowed for provider(s): benzinga.", + "default": null, + "optional": true + }, + { + "name": "firm_name", + "type": "Union[str, List[str]]", + "description": "Firm names to return. Omitting will return all available firms. Multiple items allowed for provider(s): benzinga.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['benzinga']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'benzinga' if there is no default.", + "default": "benzinga", + "optional": true + } + ], + "benzinga": [ + { + "name": "analyst_ids", + "type": "Union[str, List[str]]", + "description": "List of analyst IDs to return. Multiple items allowed for provider(s): benzinga.", + "default": null, + "optional": true + }, + { + "name": "firm_ids", + "type": "Union[str, List[str]]", + "description": "Firm IDs to return. Multiple items allowed for provider(s): benzinga.", + "default": null, + "optional": true + }, + { + "name": "limit", + "type": "int", + "description": "Number of results returned. Limit 1000.", + "default": 100, + "optional": true + }, + { + "name": "page", + "type": "int", + "description": "Page offset. For optimization, performance and technical reasons, page offsets are limited from 0 - 100000. Limit the query results by other parameters such as date.", + "default": 0, + "optional": true + }, + { + "name": "fields", + "type": "Union[str, List[str]]", + "description": "Fields to include in the response. See https://docs.benzinga.io/benzinga-apis/calendar/get-ratings to learn about the available fields. Multiple items allowed for provider(s): benzinga.", + "default": null, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[AnalystSearch]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['benzinga']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "last_updated", + "type": "datetime", + "description": "Date of the last update.", + "default": null, + "optional": true + }, + { + "name": "firm_name", + "type": "str", + "description": "Firm name of the analyst.", + "default": null, + "optional": true + }, + { + "name": "name_first", + "type": "str", + "description": "Analyst first name.", + "default": null, + "optional": true + }, + { + "name": "name_last", + "type": "str", + "description": "Analyst last name.", + "default": null, + "optional": true + }, + { + "name": "name_full", + "type": "str", + "description": "Analyst full name.", + "default": "", + "optional": false + } + ], + "benzinga": [ + { + "name": "analyst_id", + "type": "str", + "description": "ID of the analyst.", + "default": null, + "optional": true + }, + { + "name": "firm_id", + "type": "str", + "description": "ID of the analyst firm.", + "default": null, + "optional": true + }, + { + "name": "smart_score", + "type": "float", + "description": "A weighted average of the total_ratings_percentile, overall_avg_return_percentile, and overall_success_rate", + "default": null, + "optional": true + }, + { + "name": "overall_success_rate", + "type": "float", + "description": "The percentage (normalized) of gain/loss ratings that resulted in a gain overall.", + "default": null, + "optional": true + }, + { + "name": "overall_avg_return_percentile", + "type": "float", + "description": "The percentile (normalized) of this analyst's overall average return per rating in comparison to other analysts' overall average returns per rating.", + "default": null, + "optional": true + }, + { + "name": "total_ratings_percentile", + "type": "float", + "description": "The percentile (normalized) of this analyst's total number of ratings in comparison to the total number of ratings published by all other analysts", + "default": null, + "optional": true + }, + { + "name": "total_ratings", + "type": "int", + "description": "Number of recommendations made by this analyst.", + "default": null, + "optional": true + }, + { + "name": "overall_gain_count", + "type": "int", + "description": "The number of ratings that have gained value since the date of recommendation", + "default": null, + "optional": true + }, + { + "name": "overall_loss_count", + "type": "int", + "description": "The number of ratings that have lost value since the date of recommendation", + "default": null, + "optional": true + }, + { + "name": "overall_average_return", + "type": "float", + "description": "The average percent (normalized) price difference per rating since the date of recommendation", + "default": null, + "optional": true + }, + { + "name": "overall_std_dev", + "type": "float", + "description": "The standard deviation in percent (normalized) price difference in the analyst's ratings since the date of recommendation", + "default": null, + "optional": true + }, + { + "name": "gain_count_1m", + "type": "int", + "description": "The number of ratings that have gained value over the last month", + "default": null, + "optional": true + }, + { + "name": "loss_count_1m", + "type": "int", + "description": "The number of ratings that have lost value over the last month", + "default": null, + "optional": true + }, + { + "name": "average_return_1m", + "type": "float", + "description": "The average percent (normalized) price difference per rating over the last month", + "default": null, + "optional": true + }, + { + "name": "std_dev_1m", + "type": "float", + "description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last month", + "default": null, + "optional": true + }, + { + "name": "smart_score_1m", + "type": "float", + "description": "A weighted average smart score over the last month.", + "default": null, + "optional": true + }, + { + "name": "success_rate_1m", + "type": "float", + "description": "The percentage (normalized) of gain/loss ratings that resulted in a gain over the last month", + "default": null, + "optional": true + }, + { + "name": "gain_count_3m", + "type": "int", + "description": "The number of ratings that have gained value over the last 3 months", + "default": null, + "optional": true + }, + { + "name": "loss_count_3m", + "type": "int", + "description": "The number of ratings that have lost value over the last 3 months", + "default": null, + "optional": true + }, + { + "name": "average_return_3m", + "type": "float", + "description": "The average percent (normalized) price difference per rating over the last 3 months", + "default": null, + "optional": true + }, + { + "name": "std_dev_3m", + "type": "float", + "description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 3 months", + "default": null, + "optional": true + }, + { + "name": "smart_score_3m", + "type": "float", + "description": "A weighted average smart score over the last 3 months.", + "default": null, + "optional": true + }, + { + "name": "success_rate_3m", + "type": "float", + "description": "The percentage (normalized) of gain/loss ratings that resulted in a gain over the last 3 months", + "default": null, + "optional": true + }, + { + "name": "gain_count_6m", + "type": "int", + "description": "The number of ratings that have gained value over the last 6 months", + "default": null, + "optional": true + }, + { + "name": "loss_count_6m", + "type": "int", + "description": "The number of ratings that have lost value over the last 6 months", + "default": null, + "optional": true + }, + { + "name": "average_return_6m", + "type": "float", + "description": "The average percent (normalized) price difference per rating over the last 6 months", + "default": null, + "optional": true + }, + { + "name": "std_dev_6m", + "type": "float", + "description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 6 months", + "default": null, + "optional": true + }, + { + "name": "gain_count_9m", + "type": "int", + "description": "The number of ratings that have gained value over the last 9 months", + "default": null, + "optional": true + }, + { + "name": "loss_count_9m", + "type": "int", + "description": "The number of ratings that have lost value over the last 9 months", + "default": null, + "optional": true + }, + { + "name": "average_return_9m", + "type": "float", + "description": "The average percent (normalized) price difference per rating over the last 9 months", + "default": null, + "optional": true + }, + { + "name": "std_dev_9m", + "type": "float", + "description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 9 months", + "default": null, + "optional": true + }, + { + "name": "smart_score_9m", + "type": "float", + "description": "A weighted average smart score over the last 9 months.", + "default": null, + "optional": true + }, + { + "name": "success_rate_9m", + "type": "float", + "description": "The percentage (normalized) of gain/loss ratings that resulted in a gain over the last 9 months", + "default": null, + "optional": true + }, + { + "name": "gain_count_1y", + "type": "int", + "description": "The number of ratings that have gained value over the last 1 year", + "default": null, + "optional": true + }, + { + "name": "loss_count_1y", + "type": "int", + "description": "The number of ratings that have lost value over the last 1 year", + "default": null, + "optional": true + }, + { + "name": "average_return_1y", + "type": "float", + "description": "The average percent (normalized) price difference per rating over the last 1 year", + "default": null, + "optional": true + }, + { + "name": "std_dev_1y", + "type": "float", + "description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 1 year", + "default": null, + "optional": true + }, + { + "name": "smart_score_1y", + "type": "float", + "description": "A weighted average smart score over the last 1 year.", + "default": null, + "optional": true + }, + { + "name": "success_rate_1y", + "type": "float", + "description": "The percentage (normalized) of gain/loss ratings that resulted in a gain over the last 1 year", + "default": null, + "optional": true + }, + { + "name": "gain_count_2y", + "type": "int", + "description": "The number of ratings that have gained value over the last 2 years", + "default": null, + "optional": true + }, + { + "name": "loss_count_2y", + "type": "int", + "description": "The number of ratings that have lost value over the last 2 years", + "default": null, + "optional": true + }, + { + "name": "average_return_2y", + "type": "float", + "description": "The average percent (normalized) price difference per rating over the last 2 years", + "default": null, + "optional": true + }, + { + "name": "std_dev_2y", + "type": "float", + "description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 2 years", + "default": null, + "optional": true + }, + { + "name": "smart_score_2y", + "type": "float", + "description": "A weighted average smart score over the last 3 years.", + "default": null, + "optional": true + }, + { + "name": "success_rate_2y", + "type": "float", + "description": "The percentage (normalized) of gain/loss ratings that resulted in a gain over the last 2 years", + "default": null, + "optional": true + }, + { + "name": "gain_count_3y", + "type": "int", + "description": "The number of ratings that have gained value over the last 3 years", + "default": null, + "optional": true + }, + { + "name": "loss_count_3y", + "type": "int", + "description": "The number of ratings that have lost value over the last 3 years", + "default": null, + "optional": true + }, + { + "name": "average_return_3y", + "type": "float", + "description": "The average percent (normalized) price difference per rating over the last 3 years", + "default": null, + "optional": true + }, + { + "name": "std_dev_3y", + "type": "float", + "description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 3 years", + "default": null, + "optional": true + }, + { + "name": "smart_score_3y", + "type": "float", + "description": "A weighted average smart score over the last 3 years.", + "default": null, + "optional": true + }, + { + "name": "success_rate_3y", + "type": "float", + "description": "The percentage (normalized) of gain/loss ratings that resulted in a gain over the last 3 years", + "default": null, + "optional": true + } + ] + }, + "model": "AnalystSearch" + }, + "/equity/estimates/forward_sales": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get forward sales estimates.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.estimates.forward_sales(symbol='AAPL', provider='intrinio')\nobb.equity.estimates.forward_sales(fiscal_year=2025, fiscal_period=fy, provider='intrinio')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Multiple items allowed for provider(s): intrinio.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['intrinio']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'intrinio' if there is no default.", + "default": "intrinio", + "optional": true + } + ], + "intrinio": [ + { + "name": "fiscal_year", + "type": "int", + "description": "The future fiscal year to retrieve estimates for. When no symbol and year is supplied the current calendar year is used.", + "default": null, + "optional": true + }, + { + "name": "fiscal_period", + "type": "Literal['fy', 'q1', 'q2', 'q3', 'q4']", + "description": "The future fiscal period to retrieve estimates for.", + "default": null, + "optional": true + }, + { + "name": "calendar_year", + "type": "int", + "description": "The future calendar year to retrieve estimates for. When no symbol and year is supplied the current calendar year is used.", + "default": null, + "optional": true + }, + { + "name": "calendar_period", + "type": "Literal['q1', 'q2', 'q3', 'q4']", + "description": "The future calendar period to retrieve estimates for.", + "default": null, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[ForwardSalesEstimates]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['intrinio']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "name", + "type": "str", + "description": "Name of the entity.", + "default": null, + "optional": true + }, + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "fiscal_year", + "type": "int", + "description": "Fiscal year for the estimate.", + "default": null, + "optional": true + }, + { + "name": "fiscal_period", + "type": "str", + "description": "Fiscal quarter for the estimate.", + "default": null, + "optional": true + }, + { + "name": "calendar_year", + "type": "int", + "description": "Calendar year for the estimate.", + "default": null, + "optional": true + }, + { + "name": "calendar_period", + "type": "str", + "description": "Calendar quarter for the estimate.", + "default": null, + "optional": true + }, + { + "name": "low_estimate", + "type": "int", + "description": "The sales estimate low for the period.", + "default": null, + "optional": true + }, + { + "name": "high_estimate", + "type": "int", + "description": "The sales estimate high for the period.", + "default": null, + "optional": true + }, + { + "name": "mean", + "type": "int", + "description": "The sales estimate mean for the period.", + "default": null, + "optional": true + }, + { + "name": "median", + "type": "int", + "description": "The sales estimate median for the period.", + "default": null, + "optional": true + }, + { + "name": "standard_deviation", + "type": "int", + "description": "The sales estimate standard deviation for the period.", + "default": null, + "optional": true + }, + { + "name": "number_of_analysts", + "type": "int", + "description": "Number of analysts providing estimates for the period.", + "default": null, + "optional": true + } + ], + "intrinio": [ + { + "name": "revisions_1w_up", + "type": "int", + "description": "Number of revisions up in the last week.", + "default": null, + "optional": true + }, + { + "name": "revisions_1w_down", + "type": "int", + "description": "Number of revisions down in the last week.", + "default": null, + "optional": true + }, + { + "name": "revisions_1w_change_percent", + "type": "float", + "description": "The analyst revisions percent change in estimate for the period of 1 week.", + "default": null, + "optional": true + }, + { + "name": "revisions_1m_up", + "type": "int", + "description": "Number of revisions up in the last month.", + "default": null, + "optional": true + }, + { + "name": "revisions_1m_down", + "type": "int", + "description": "Number of revisions down in the last month.", + "default": null, + "optional": true + }, + { + "name": "revisions_1m_change_percent", + "type": "float", + "description": "The analyst revisions percent change in estimate for the period of 1 month.", + "default": null, + "optional": true + }, + { + "name": "revisions_3m_up", + "type": "int", + "description": "Number of revisions up in the last 3 months.", + "default": null, + "optional": true + }, + { + "name": "revisions_3m_down", + "type": "int", + "description": "Number of revisions down in the last 3 months.", + "default": null, + "optional": true + }, + { + "name": "revisions_3m_change_percent", + "type": "float", + "description": "The analyst revisions percent change in estimate for the period of 3 months.", + "default": null, + "optional": true + } + ] + }, + "model": "ForwardSalesEstimates" + }, + "/equity/estimates/forward_eps": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get forward EPS estimates.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.estimates.forward_eps(symbol='AAPL', provider='intrinio')\nobb.equity.estimates.forward_eps(fiscal_year=2025, fiscal_period=fy, provider='intrinio')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp', 'intrinio']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [ + { + "name": "fiscal_period", + "type": "Literal['annual', 'quarter']", + "description": "The future fiscal period to retrieve estimates for.", + "default": "annual", + "optional": true + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": null, + "optional": true + }, + { + "name": "include_historical", + "type": "bool", + "description": "If True, the data will include all past data and the limit will be ignored.", + "default": false, + "optional": true + } + ], + "intrinio": [ + { + "name": "fiscal_year", + "type": "int", + "description": "The future fiscal year to retrieve estimates for. When no symbol and year is supplied the current calendar year is used.", + "default": null, + "optional": true + }, + { + "name": "fiscal_period", + "type": "Literal['fy', 'q1', 'q2', 'q3', 'q4']", + "description": "The future fiscal period to retrieve estimates for.", + "default": null, + "optional": true + }, + { + "name": "calendar_year", + "type": "int", + "description": "The future calendar year to retrieve estimates for. When no symbol and year is supplied the current calendar year is used.", + "default": null, + "optional": true + }, + { + "name": "calendar_period", + "type": "Literal['q1', 'q2', 'q3', 'q4']", + "description": "The future calendar period to retrieve estimates for.", + "default": null, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[ForwardEpsEstimates]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'intrinio']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "name", + "type": "str", + "description": "Name of the entity.", + "default": null, + "optional": true + }, + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "fiscal_year", + "type": "int", + "description": "Fiscal year for the estimate.", + "default": null, + "optional": true + }, + { + "name": "fiscal_period", + "type": "str", + "description": "Fiscal quarter for the estimate.", + "default": null, + "optional": true + }, + { + "name": "calendar_year", + "type": "int", + "description": "Calendar year for the estimate.", + "default": null, + "optional": true + }, + { + "name": "calendar_period", + "type": "str", + "description": "Calendar quarter for the estimate.", + "default": null, + "optional": true + }, + { + "name": "low_estimate", + "type": "float", + "description": "Estimated EPS low for the period.", + "default": null, + "optional": true + }, + { + "name": "high_estimate", + "type": "float", + "description": "Estimated EPS high for the period.", + "default": null, + "optional": true + }, + { + "name": "mean", + "type": "float", + "description": "Estimated EPS mean for the period.", + "default": null, + "optional": true + }, + { + "name": "median", + "type": "float", + "description": "Estimated EPS median for the period.", + "default": null, + "optional": true + }, + { + "name": "standard_deviation", + "type": "float", + "description": "Estimated EPS standard deviation for the period.", + "default": null, + "optional": true + }, + { + "name": "number_of_analysts", + "type": "int", + "description": "Number of analysts providing estimates for the period.", + "default": null, + "optional": true + } + ], + "fmp": [], + "intrinio": [ + { + "name": "revisions_change_percent", + "type": "float", + "description": "The earnings per share (EPS) percent change in estimate for the period.", + "default": null, + "optional": true + }, + { + "name": "mean_1w", + "type": "float", + "description": "The mean estimate for the period one week ago.", + "default": null, + "optional": true + }, + { + "name": "mean_1m", + "type": "float", + "description": "The mean estimate for the period one month ago.", + "default": null, + "optional": true + }, + { + "name": "mean_2m", + "type": "float", + "description": "The mean estimate for the period two months ago.", + "default": null, + "optional": true + }, + { + "name": "mean_3m", + "type": "float", + "description": "The mean estimate for the period three months ago.", + "default": null, + "optional": true + } + ] + }, + "model": "ForwardEpsEstimates" + }, + "/equity/discovery/gainers": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the top price gainers in the stock market.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.discovery.gainers(provider='yfinance')\nobb.equity.discovery.gainers(sort='desc', provider='yfinance')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "sort", + "type": "Literal['asc', 'desc']", + "description": "Sort order. Possible values: 'asc', 'desc'. Default: 'desc'.", + "default": "desc", + "optional": true + }, + { + "name": "provider", + "type": "Literal['yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'yfinance' if there is no default.", + "default": "yfinance", + "optional": true + } + ], + "yfinance": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EquityGainers]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "name", + "type": "str", + "description": "Name of the entity.", + "default": "", + "optional": false + }, + { + "name": "price", + "type": "float", + "description": "Last price.", + "default": "", + "optional": false + }, + { + "name": "change", + "type": "float", + "description": "Change in price value.", + "default": "", + "optional": false + }, + { + "name": "percent_change", + "type": "float", + "description": "Percent change.", + "default": "", + "optional": false + }, + { + "name": "volume", + "type": "float", + "description": "The trading volume.", + "default": "", + "optional": false + } + ], + "yfinance": [ + { + "name": "market_cap", + "type": "float", + "description": "Market Cap.", + "default": "", + "optional": false + }, + { + "name": "avg_volume_3_months", + "type": "float", + "description": "Average volume over the last 3 months in millions.", + "default": "", + "optional": false + }, + { + "name": "pe_ratio_ttm", + "type": "float", + "description": "PE Ratio (TTM).", + "default": null, + "optional": true + } + ] + }, + "model": "EquityGainers" + }, + "/equity/discovery/losers": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the top price losers in the stock market.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.discovery.losers(provider='yfinance')\nobb.equity.discovery.losers(sort='desc', provider='yfinance')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "sort", + "type": "Literal['asc', 'desc']", + "description": "Sort order. Possible values: 'asc', 'desc'. Default: 'desc'.", + "default": "desc", + "optional": true + }, + { + "name": "provider", + "type": "Literal['yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'yfinance' if there is no default.", + "default": "yfinance", + "optional": true + } + ], + "yfinance": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EquityLosers]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "name", + "type": "str", + "description": "Name of the entity.", + "default": "", + "optional": false + }, + { + "name": "price", + "type": "float", + "description": "Last price.", + "default": "", + "optional": false + }, + { + "name": "change", + "type": "float", + "description": "Change in price value.", + "default": "", + "optional": false + }, + { + "name": "percent_change", + "type": "float", + "description": "Percent change.", + "default": "", + "optional": false + }, + { + "name": "volume", + "type": "float", + "description": "The trading volume.", + "default": "", + "optional": false + } + ], + "yfinance": [ + { + "name": "market_cap", + "type": "float", + "description": "Market Cap.", + "default": "", + "optional": false + }, + { + "name": "avg_volume_3_months", + "type": "float", + "description": "Average volume over the last 3 months in millions.", + "default": "", + "optional": false + }, + { + "name": "pe_ratio_ttm", + "type": "float", + "description": "PE Ratio (TTM).", + "default": null, + "optional": true + } + ] + }, + "model": "EquityLosers" + }, + "/equity/discovery/active": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the most actively traded stocks based on volume.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.discovery.active(provider='yfinance')\nobb.equity.discovery.active(sort='desc', provider='yfinance')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "sort", + "type": "Literal['asc', 'desc']", + "description": "Sort order. Possible values: 'asc', 'desc'. Default: 'desc'.", + "default": "desc", + "optional": true + }, + { + "name": "provider", + "type": "Literal['yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'yfinance' if there is no default.", + "default": "yfinance", + "optional": true + } + ], + "yfinance": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EquityActive]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "name", + "type": "str", + "description": "Name of the entity.", + "default": "", + "optional": false + }, + { + "name": "price", + "type": "float", + "description": "Last price.", + "default": "", + "optional": false + }, + { + "name": "change", + "type": "float", + "description": "Change in price value.", + "default": "", + "optional": false + }, + { + "name": "percent_change", + "type": "float", + "description": "Percent change.", + "default": "", + "optional": false + }, + { + "name": "volume", + "type": "float", + "description": "The trading volume.", + "default": "", + "optional": false + } + ], + "yfinance": [ + { + "name": "market_cap", + "type": "float", + "description": "Market Cap displayed in billions.", + "default": "", + "optional": false + }, + { + "name": "avg_volume_3_months", + "type": "float", + "description": "Average volume over the last 3 months in millions.", + "default": "", + "optional": false + }, + { + "name": "pe_ratio_ttm", + "type": "float", + "description": "PE Ratio (TTM).", + "default": null, + "optional": true + } + ] + }, + "model": "EquityActive" + }, + "/equity/discovery/undervalued_large_caps": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get potentially undervalued large cap stocks.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.discovery.undervalued_large_caps(provider='yfinance')\nobb.equity.discovery.undervalued_large_caps(sort='desc', provider='yfinance')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "sort", + "type": "Literal['asc', 'desc']", + "description": "Sort order. Possible values: 'asc', 'desc'. Default: 'desc'.", + "default": "desc", + "optional": true + }, + { + "name": "provider", + "type": "Literal['yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'yfinance' if there is no default.", + "default": "yfinance", + "optional": true + } + ], + "yfinance": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EquityUndervaluedLargeCaps]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "name", + "type": "str", + "description": "Name of the entity.", + "default": "", + "optional": false + }, + { + "name": "price", + "type": "float", + "description": "Last price.", + "default": "", + "optional": false + }, + { + "name": "change", + "type": "float", + "description": "Change in price value.", + "default": "", + "optional": false + }, + { + "name": "percent_change", + "type": "float", + "description": "Percent change.", + "default": "", + "optional": false + }, + { + "name": "volume", + "type": "float", + "description": "The trading volume.", + "default": "", + "optional": false + } + ], + "yfinance": [ + { + "name": "market_cap", + "type": "float", + "description": "Market Cap.", + "default": null, + "optional": true + }, + { + "name": "avg_volume_3_months", + "type": "float", + "description": "Average volume over the last 3 months in millions.", + "default": null, + "optional": true + }, + { + "name": "pe_ratio_ttm", + "type": "float", + "description": "PE Ratio (TTM).", + "default": null, + "optional": true + } + ] + }, + "model": "EquityUndervaluedLargeCaps" + }, + "/equity/discovery/undervalued_growth": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get potentially undervalued growth stocks.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.discovery.undervalued_growth(provider='yfinance')\nobb.equity.discovery.undervalued_growth(sort='desc', provider='yfinance')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "sort", + "type": "Literal['asc', 'desc']", + "description": "Sort order. Possible values: 'asc', 'desc'. Default: 'desc'.", + "default": "desc", + "optional": true + }, + { + "name": "provider", + "type": "Literal['yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'yfinance' if there is no default.", + "default": "yfinance", + "optional": true + } + ], + "yfinance": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EquityUndervaluedGrowth]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "name", + "type": "str", + "description": "Name of the entity.", + "default": "", + "optional": false + }, + { + "name": "price", + "type": "float", + "description": "Last price.", + "default": "", + "optional": false + }, + { + "name": "change", + "type": "float", + "description": "Change in price value.", + "default": "", + "optional": false + }, + { + "name": "percent_change", + "type": "float", + "description": "Percent change.", + "default": "", + "optional": false + }, + { + "name": "volume", + "type": "float", + "description": "The trading volume.", + "default": "", + "optional": false + } + ], + "yfinance": [ + { + "name": "market_cap", + "type": "float", + "description": "Market Cap.", + "default": null, + "optional": true + }, + { + "name": "avg_volume_3_months", + "type": "float", + "description": "Average volume over the last 3 months in millions.", + "default": null, + "optional": true + }, + { + "name": "pe_ratio_ttm", + "type": "float", + "description": "PE Ratio (TTM).", + "default": null, + "optional": true + } + ] + }, + "model": "EquityUndervaluedGrowth" + }, + "/equity/discovery/aggressive_small_caps": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get top small cap stocks based on earnings growth.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.discovery.aggressive_small_caps(provider='yfinance')\nobb.equity.discovery.aggressive_small_caps(sort='desc', provider='yfinance')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "sort", + "type": "Literal['asc', 'desc']", + "description": "Sort order. Possible values: 'asc', 'desc'. Default: 'desc'.", + "default": "desc", + "optional": true + }, + { + "name": "provider", + "type": "Literal['yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'yfinance' if there is no default.", + "default": "yfinance", + "optional": true + } + ], + "yfinance": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EquityAggressiveSmallCaps]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "name", + "type": "str", + "description": "Name of the entity.", + "default": "", + "optional": false + }, + { + "name": "price", + "type": "float", + "description": "Last price.", + "default": "", + "optional": false + }, + { + "name": "change", + "type": "float", + "description": "Change in price value.", + "default": "", + "optional": false + }, + { + "name": "percent_change", + "type": "float", + "description": "Percent change.", + "default": "", + "optional": false + }, + { + "name": "volume", + "type": "float", + "description": "The trading volume.", + "default": "", + "optional": false + } + ], + "yfinance": [ + { + "name": "market_cap", + "type": "float", + "description": "Market Cap.", + "default": null, + "optional": true + }, + { + "name": "avg_volume_3_months", + "type": "float", + "description": "Average volume over the last 3 months in millions.", + "default": null, + "optional": true + }, + { + "name": "pe_ratio_ttm", + "type": "float", + "description": "PE Ratio (TTM).", + "default": null, + "optional": true + } + ] + }, + "model": "EquityAggressiveSmallCaps" + }, + "/equity/discovery/growth_tech": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get top tech stocks based on revenue and earnings growth.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.discovery.growth_tech(provider='yfinance')\nobb.equity.discovery.growth_tech(sort='desc', provider='yfinance')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "sort", + "type": "Literal['asc', 'desc']", + "description": "Sort order. Possible values: 'asc', 'desc'. Default: 'desc'.", + "default": "desc", + "optional": true + }, + { + "name": "provider", + "type": "Literal['yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'yfinance' if there is no default.", + "default": "yfinance", + "optional": true + } + ], + "yfinance": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[GrowthTechEquities]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "name", + "type": "str", + "description": "Name of the entity.", + "default": "", + "optional": false + }, + { + "name": "price", + "type": "float", + "description": "Last price.", + "default": "", + "optional": false + }, + { + "name": "change", + "type": "float", + "description": "Change in price value.", + "default": "", + "optional": false + }, + { + "name": "percent_change", + "type": "float", + "description": "Percent change.", + "default": "", + "optional": false + }, + { + "name": "volume", + "type": "float", + "description": "The trading volume.", + "default": "", + "optional": false + } + ], + "yfinance": [ + { + "name": "market_cap", + "type": "float", + "description": "Market Cap.", + "default": null, + "optional": true + }, + { + "name": "avg_volume_3_months", + "type": "float", + "description": "Average volume over the last 3 months in millions.", + "default": null, + "optional": true + }, + { + "name": "pe_ratio_ttm", + "type": "float", + "description": "PE Ratio (TTM).", + "default": null, + "optional": true + } + ] + }, + "model": "GrowthTechEquities" + }, + "/equity/discovery/filings": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the URLs to SEC filings reported to EDGAR database, such as 10-K, 10-Q, 8-K, and more.\n\nSEC filings include Form 10-K, Form 10-Q, Form 8-K, the proxy statement, Forms 3, 4, and 5, Schedule 13, Form 114,\nForeign Investment Disclosures and others. The annual 10-K report is required to be\nfiled annually and includes the company's financial statements, management discussion and analysis,\nand audited financial statements.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.discovery.filings(provider='fmp')\n# Get filings for the year 2023, limited to 100 results\nobb.equity.discovery.filings(start_date='2023-01-01', end_date='2023-12-31', limit=100, provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "form_type", + "type": "str", + "description": "Filter by form type. Visit https://www.sec.gov/forms for a list of supported form types.", + "default": null, + "optional": true + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": 100, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [ + { + "name": "is_done", + "type": "bool", + "description": "Flag for whether or not the filing is done.", + "default": null, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[DiscoveryFilings]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "cik", + "type": "str", + "description": "Central Index Key (CIK) for the requested entity.", + "default": "", + "optional": false + }, + { + "name": "title", + "type": "str", + "description": "Title of the filing.", + "default": "", + "optional": false + }, + { + "name": "date", + "type": "datetime", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "form_type", + "type": "str", + "description": "The form type of the filing", + "default": "", + "optional": false + }, + { + "name": "link", + "type": "str", + "description": "URL to the filing page on the SEC site.", + "default": "", + "optional": false + } + ], + "fmp": [] + }, + "model": "DiscoveryFilings" + }, + "/equity/fundamental/multiples": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get equity valuation multiples for a given company.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.multiples(symbol='AAPL', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EquityValuationMultiples]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "revenue_per_share_ttm", + "type": "float", + "description": "Revenue per share calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "net_income_per_share_ttm", + "type": "float", + "description": "Net income per share calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "operating_cash_flow_per_share_ttm", + "type": "float", + "description": "Operating cash flow per share calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "free_cash_flow_per_share_ttm", + "type": "float", + "description": "Free cash flow per share calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "cash_per_share_ttm", + "type": "float", + "description": "Cash per share calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "book_value_per_share_ttm", + "type": "float", + "description": "Book value per share calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "tangible_book_value_per_share_ttm", + "type": "float", + "description": "Tangible book value per share calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "shareholders_equity_per_share_ttm", + "type": "float", + "description": "Shareholders equity per share calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "interest_debt_per_share_ttm", + "type": "float", + "description": "Interest debt per share calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "market_cap_ttm", + "type": "float", + "description": "Market capitalization calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "enterprise_value_ttm", + "type": "float", + "description": "Enterprise value calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "pe_ratio_ttm", + "type": "float", + "description": "Price-to-earnings ratio (P/E ratio) calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "price_to_sales_ratio_ttm", + "type": "float", + "description": "Price-to-sales ratio calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "pocf_ratio_ttm", + "type": "float", + "description": "Price-to-operating cash flow ratio calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "pfcf_ratio_ttm", + "type": "float", + "description": "Price-to-free cash flow ratio calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "pb_ratio_ttm", + "type": "float", + "description": "Price-to-book ratio calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "ptb_ratio_ttm", + "type": "float", + "description": "Price-to-tangible book ratio calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "ev_to_sales_ttm", + "type": "float", + "description": "Enterprise value-to-sales ratio calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "enterprise_value_over_ebitda_ttm", + "type": "float", + "description": "Enterprise value-to-EBITDA ratio calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "ev_to_operating_cash_flow_ttm", + "type": "float", + "description": "Enterprise value-to-operating cash flow ratio calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "ev_to_free_cash_flow_ttm", + "type": "float", + "description": "Enterprise value-to-free cash flow ratio calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "earnings_yield_ttm", + "type": "float", + "description": "Earnings yield calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "free_cash_flow_yield_ttm", + "type": "float", + "description": "Free cash flow yield calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "debt_to_equity_ttm", + "type": "float", + "description": "Debt-to-equity ratio calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "debt_to_assets_ttm", + "type": "float", + "description": "Debt-to-assets ratio calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "net_debt_to_ebitda_ttm", + "type": "float", + "description": "Net debt-to-EBITDA ratio calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "current_ratio_ttm", + "type": "float", + "description": "Current ratio calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "interest_coverage_ttm", + "type": "float", + "description": "Interest coverage calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "income_quality_ttm", + "type": "float", + "description": "Income quality calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "dividend_yield_ttm", + "type": "float", + "description": "Dividend yield calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "dividend_yield_percentage_ttm", + "type": "float", + "description": "Dividend yield percentage calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "dividend_to_market_cap_ttm", + "type": "float", + "description": "Dividend to market capitalization ratio calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "dividend_per_share_ttm", + "type": "float", + "description": "Dividend per share calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "payout_ratio_ttm", + "type": "float", + "description": "Payout ratio calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "sales_general_and_administrative_to_revenue_ttm", + "type": "float", + "description": "Sales general and administrative expenses-to-revenue ratio calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "research_and_development_to_revenue_ttm", + "type": "float", + "description": "Research and development expenses-to-revenue ratio calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "intangibles_to_total_assets_ttm", + "type": "float", + "description": "Intangibles-to-total assets ratio calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "capex_to_operating_cash_flow_ttm", + "type": "float", + "description": "Capital expenditures-to-operating cash flow ratio calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "capex_to_revenue_ttm", + "type": "float", + "description": "Capital expenditures-to-revenue ratio calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "capex_to_depreciation_ttm", + "type": "float", + "description": "Capital expenditures-to-depreciation ratio calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "stock_based_compensation_to_revenue_ttm", + "type": "float", + "description": "Stock-based compensation-to-revenue ratio calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "graham_number_ttm", + "type": "float", + "description": "Graham number calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "roic_ttm", + "type": "float", + "description": "Return on invested capital calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "return_on_tangible_assets_ttm", + "type": "float", + "description": "Return on tangible assets calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "graham_net_net_ttm", + "type": "float", + "description": "Graham net-net working capital calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "working_capital_ttm", + "type": "float", + "description": "Working capital calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "tangible_asset_value_ttm", + "type": "float", + "description": "Tangible asset value calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "net_current_asset_value_ttm", + "type": "float", + "description": "Net current asset value calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "invested_capital_ttm", + "type": "float", + "description": "Invested capital calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "average_receivables_ttm", + "type": "float", + "description": "Average receivables calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "average_payables_ttm", + "type": "float", + "description": "Average payables calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "average_inventory_ttm", + "type": "float", + "description": "Average inventory calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "days_sales_outstanding_ttm", + "type": "float", + "description": "Days sales outstanding calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "days_payables_outstanding_ttm", + "type": "float", + "description": "Days payables outstanding calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "days_of_inventory_on_hand_ttm", + "type": "float", + "description": "Days of inventory on hand calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "receivables_turnover_ttm", + "type": "float", + "description": "Receivables turnover calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "payables_turnover_ttm", + "type": "float", + "description": "Payables turnover calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "inventory_turnover_ttm", + "type": "float", + "description": "Inventory turnover calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "roe_ttm", + "type": "float", + "description": "Return on equity calculated as trailing twelve months.", + "default": null, + "optional": true + }, + { + "name": "capex_per_share_ttm", + "type": "float", + "description": "Capital expenditures per share calculated as trailing twelve months.", + "default": null, + "optional": true + } + ], + "fmp": [] + }, + "model": "EquityValuationMultiples" + }, + "/equity/fundamental/balance": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the balance sheet for a given company.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.balance(symbol='AAPL', provider='fmp')\nobb.equity.fundamental.balance(symbol='AAPL', period='annual', limit=5, provider='intrinio')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "period", + "type": "str", + "description": "Time period of the data to return.", + "default": "annual", + "optional": true + }, + { + "name": "limit", + "type": "Annotated[int, Ge(ge=0)]", + "description": "The number of data entries to return.", + "default": 5, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp', 'intrinio', 'polygon', 'yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [], + "intrinio": [ + { + "name": "fiscal_year", + "type": "int", + "description": "The specific fiscal year. Reports do not go beyond 2008.", + "default": null, + "optional": true + } + ], + "polygon": [ + { + "name": "filing_date", + "type": "date", + "description": "Filing date of the financial statement.", + "default": null, + "optional": true + }, + { + "name": "filing_date_lt", + "type": "date", + "description": "Filing date less than the given date.", + "default": null, + "optional": true + }, + { + "name": "filing_date_lte", + "type": "date", + "description": "Filing date less than or equal to the given date.", + "default": null, + "optional": true + }, + { + "name": "filing_date_gt", + "type": "date", + "description": "Filing date greater than the given date.", + "default": null, + "optional": true + }, + { + "name": "filing_date_gte", + "type": "date", + "description": "Filing date greater than or equal to the given date.", + "default": null, + "optional": true + }, + { + "name": "period_of_report_date", + "type": "date", + "description": "Period of report date of the financial statement.", + "default": null, + "optional": true + }, + { + "name": "period_of_report_date_lt", + "type": "date", + "description": "Period of report date less than the given date.", + "default": null, + "optional": true + }, + { + "name": "period_of_report_date_lte", + "type": "date", + "description": "Period of report date less than or equal to the given date.", + "default": null, + "optional": true + }, + { + "name": "period_of_report_date_gt", + "type": "date", + "description": "Period of report date greater than the given date.", + "default": null, + "optional": true + }, + { + "name": "period_of_report_date_gte", + "type": "date", + "description": "Period of report date greater than or equal to the given date.", + "default": null, + "optional": true + }, + { + "name": "include_sources", + "type": "bool", + "description": "Whether to include the sources of the financial statement.", + "default": true, + "optional": true + }, + { + "name": "order", + "type": "Literal['asc', 'desc']", + "description": "Order of the financial statement.", + "default": null, + "optional": true + }, + { + "name": "sort", + "type": "Literal['filing_date', 'period_of_report_date']", + "description": "Sort of the financial statement.", + "default": null, + "optional": true + } + ], + "yfinance": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[BalanceSheet]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'intrinio', 'polygon', 'yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "period_ending", + "type": "date", + "description": "The end date of the reporting period.", + "default": "", + "optional": false + }, + { + "name": "fiscal_period", + "type": "str", + "description": "The fiscal period of the report.", + "default": null, + "optional": true + }, + { + "name": "fiscal_year", + "type": "int", + "description": "The fiscal year of the fiscal period.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "filing_date", + "type": "date", + "description": "The date when the filing was made.", + "default": null, + "optional": true + }, + { + "name": "accepted_date", + "type": "datetime", + "description": "The date and time when the filing was accepted.", + "default": null, + "optional": true + }, + { + "name": "reported_currency", + "type": "str", + "description": "The currency in which the balance sheet was reported.", + "default": null, + "optional": true + }, + { + "name": "cash_and_cash_equivalents", + "type": "float", + "description": "Cash and cash equivalents.", + "default": null, + "optional": true + }, + { + "name": "short_term_investments", + "type": "float", + "description": "Short term investments.", + "default": null, + "optional": true + }, + { + "name": "cash_and_short_term_investments", + "type": "float", + "description": "Cash and short term investments.", + "default": null, + "optional": true + }, + { + "name": "net_receivables", + "type": "float", + "description": "Net receivables.", + "default": null, + "optional": true + }, + { + "name": "inventory", + "type": "float", + "description": "Inventory.", + "default": null, + "optional": true + }, + { + "name": "other_current_assets", + "type": "float", + "description": "Other current assets.", + "default": null, + "optional": true + }, + { + "name": "total_current_assets", + "type": "float", + "description": "Total current assets.", + "default": null, + "optional": true + }, + { + "name": "plant_property_equipment_net", + "type": "float", + "description": "Plant property equipment net.", + "default": null, + "optional": true + }, + { + "name": "goodwill", + "type": "float", + "description": "Goodwill.", + "default": null, + "optional": true + }, + { + "name": "intangible_assets", + "type": "float", + "description": "Intangible assets.", + "default": null, + "optional": true + }, + { + "name": "goodwill_and_intangible_assets", + "type": "float", + "description": "Goodwill and intangible assets.", + "default": null, + "optional": true + }, + { + "name": "long_term_investments", + "type": "float", + "description": "Long term investments.", + "default": null, + "optional": true + }, + { + "name": "tax_assets", + "type": "float", + "description": "Tax assets.", + "default": null, + "optional": true + }, + { + "name": "other_non_current_assets", + "type": "float", + "description": "Other non current assets.", + "default": null, + "optional": true + }, + { + "name": "non_current_assets", + "type": "float", + "description": "Total non current assets.", + "default": null, + "optional": true + }, + { + "name": "other_assets", + "type": "float", + "description": "Other assets.", + "default": null, + "optional": true + }, + { + "name": "total_assets", + "type": "float", + "description": "Total assets.", + "default": null, + "optional": true + }, + { + "name": "accounts_payable", + "type": "float", + "description": "Accounts payable.", + "default": null, + "optional": true + }, + { + "name": "short_term_debt", + "type": "float", + "description": "Short term debt.", + "default": null, + "optional": true + }, + { + "name": "tax_payables", + "type": "float", + "description": "Tax payables.", + "default": null, + "optional": true + }, + { + "name": "current_deferred_revenue", + "type": "float", + "description": "Current deferred revenue.", + "default": null, + "optional": true + }, + { + "name": "other_current_liabilities", + "type": "float", + "description": "Other current liabilities.", + "default": null, + "optional": true + }, + { + "name": "total_current_liabilities", + "type": "float", + "description": "Total current liabilities.", + "default": null, + "optional": true + }, + { + "name": "long_term_debt", + "type": "float", + "description": "Long term debt.", + "default": null, + "optional": true + }, + { + "name": "deferred_revenue_non_current", + "type": "float", + "description": "Non current deferred revenue.", + "default": null, + "optional": true + }, + { + "name": "deferred_tax_liabilities_non_current", + "type": "float", + "description": "Deferred tax liabilities non current.", + "default": null, + "optional": true + }, + { + "name": "other_non_current_liabilities", + "type": "float", + "description": "Other non current liabilities.", + "default": null, + "optional": true + }, + { + "name": "total_non_current_liabilities", + "type": "float", + "description": "Total non current liabilities.", + "default": null, + "optional": true + }, + { + "name": "other_liabilities", + "type": "float", + "description": "Other liabilities.", + "default": null, + "optional": true + }, + { + "name": "capital_lease_obligations", + "type": "float", + "description": "Capital lease obligations.", + "default": null, + "optional": true + }, + { + "name": "total_liabilities", + "type": "float", + "description": "Total liabilities.", + "default": null, + "optional": true + }, + { + "name": "preferred_stock", + "type": "float", + "description": "Preferred stock.", + "default": null, + "optional": true + }, + { + "name": "common_stock", + "type": "float", + "description": "Common stock.", + "default": null, + "optional": true + }, + { + "name": "retained_earnings", + "type": "float", + "description": "Retained earnings.", + "default": null, + "optional": true + }, + { + "name": "accumulated_other_comprehensive_income", + "type": "float", + "description": "Accumulated other comprehensive income (loss).", + "default": null, + "optional": true + }, + { + "name": "other_shareholders_equity", + "type": "float", + "description": "Other shareholders equity.", + "default": null, + "optional": true + }, + { + "name": "other_total_shareholders_equity", + "type": "float", + "description": "Other total shareholders equity.", + "default": null, + "optional": true + }, + { + "name": "total_common_equity", + "type": "float", + "description": "Total common equity.", + "default": null, + "optional": true + }, + { + "name": "total_equity_non_controlling_interests", + "type": "float", + "description": "Total equity non controlling interests.", + "default": null, + "optional": true + }, + { + "name": "total_liabilities_and_shareholders_equity", + "type": "float", + "description": "Total liabilities and shareholders equity.", + "default": null, + "optional": true + }, + { + "name": "minority_interest", + "type": "float", + "description": "Minority interest.", + "default": null, + "optional": true + }, + { + "name": "total_liabilities_and_total_equity", + "type": "float", + "description": "Total liabilities and total equity.", + "default": null, + "optional": true + }, + { + "name": "total_investments", + "type": "float", + "description": "Total investments.", + "default": null, + "optional": true + }, + { + "name": "total_debt", + "type": "float", + "description": "Total debt.", + "default": null, + "optional": true + }, + { + "name": "net_debt", + "type": "float", + "description": "Net debt.", + "default": null, + "optional": true + }, + { + "name": "link", + "type": "str", + "description": "Link to the filing.", + "default": null, + "optional": true + }, + { + "name": "final_link", + "type": "str", + "description": "Link to the filing document.", + "default": null, + "optional": true + } + ], + "intrinio": [ + { + "name": "reported_currency", + "type": "str", + "description": "The currency in which the balance sheet is reported.", + "default": null, + "optional": true + }, + { + "name": "cash_and_cash_equivalents", + "type": "float", + "description": "Cash and cash equivalents.", + "default": null, + "optional": true + }, + { + "name": "cash_and_due_from_banks", + "type": "float", + "description": "Cash and due from banks.", + "default": null, + "optional": true + }, + { + "name": "restricted_cash", + "type": "float", + "description": "Restricted cash.", + "default": null, + "optional": true + }, + { + "name": "short_term_investments", + "type": "float", + "description": "Short term investments.", + "default": null, + "optional": true + }, + { + "name": "federal_funds_sold", + "type": "float", + "description": "Federal funds sold.", + "default": null, + "optional": true + }, + { + "name": "accounts_receivable", + "type": "float", + "description": "Accounts receivable.", + "default": null, + "optional": true + }, + { + "name": "note_and_lease_receivable", + "type": "float", + "description": "Note and lease receivable. (Vendor non-trade receivables)", + "default": null, + "optional": true + }, + { + "name": "inventories", + "type": "float", + "description": "Net Inventories.", + "default": null, + "optional": true + }, + { + "name": "customer_and_other_receivables", + "type": "float", + "description": "Customer and other receivables.", + "default": null, + "optional": true + }, + { + "name": "interest_bearing_deposits_at_other_banks", + "type": "float", + "description": "Interest bearing deposits at other banks.", + "default": null, + "optional": true + }, + { + "name": "time_deposits_placed_and_other_short_term_investments", + "type": "float", + "description": "Time deposits placed and other short term investments.", + "default": null, + "optional": true + }, + { + "name": "trading_account_securities", + "type": "float", + "description": "Trading account securities.", + "default": null, + "optional": true + }, + { + "name": "loans_and_leases", + "type": "float", + "description": "Loans and leases.", + "default": null, + "optional": true + }, + { + "name": "allowance_for_loan_and_lease_losses", + "type": "float", + "description": "Allowance for loan and lease losses.", + "default": null, + "optional": true + }, + { + "name": "current_deferred_refundable_income_taxes", + "type": "float", + "description": "Current deferred refundable income taxes.", + "default": null, + "optional": true + }, + { + "name": "other_current_assets", + "type": "float", + "description": "Other current assets.", + "default": null, + "optional": true + }, + { + "name": "loans_and_leases_net_of_allowance", + "type": "float", + "description": "Loans and leases net of allowance.", + "default": null, + "optional": true + }, + { + "name": "accrued_investment_income", + "type": "float", + "description": "Accrued investment income.", + "default": null, + "optional": true + }, + { + "name": "other_current_non_operating_assets", + "type": "float", + "description": "Other current non-operating assets.", + "default": null, + "optional": true + }, + { + "name": "loans_held_for_sale", + "type": "float", + "description": "Loans held for sale.", + "default": null, + "optional": true + }, + { + "name": "prepaid_expenses", + "type": "float", + "description": "Prepaid expenses.", + "default": null, + "optional": true + }, + { + "name": "total_current_assets", + "type": "float", + "description": "Total current assets.", + "default": null, + "optional": true + }, + { + "name": "plant_property_equipment_gross", + "type": "float", + "description": "Plant property equipment gross.", + "default": null, + "optional": true + }, + { + "name": "accumulated_depreciation", + "type": "float", + "description": "Accumulated depreciation.", + "default": null, + "optional": true + }, + { + "name": "premises_and_equipment_net", + "type": "float", + "description": "Net premises and equipment.", + "default": null, + "optional": true + }, + { + "name": "plant_property_equipment_net", + "type": "float", + "description": "Net plant property equipment.", + "default": null, + "optional": true + }, + { + "name": "long_term_investments", + "type": "float", + "description": "Long term investments.", + "default": null, + "optional": true + }, + { + "name": "mortgage_servicing_rights", + "type": "float", + "description": "Mortgage servicing rights.", + "default": null, + "optional": true + }, + { + "name": "unearned_premiums_asset", + "type": "float", + "description": "Unearned premiums asset.", + "default": null, + "optional": true + }, + { + "name": "non_current_note_lease_receivables", + "type": "float", + "description": "Non-current note lease receivables.", + "default": null, + "optional": true + }, + { + "name": "deferred_acquisition_cost", + "type": "float", + "description": "Deferred acquisition cost.", + "default": null, + "optional": true + }, + { + "name": "goodwill", + "type": "float", + "description": "Goodwill.", + "default": null, + "optional": true + }, + { + "name": "separate_account_business_assets", + "type": "float", + "description": "Separate account business assets.", + "default": null, + "optional": true + }, + { + "name": "non_current_deferred_refundable_income_taxes", + "type": "float", + "description": "Noncurrent deferred refundable income taxes.", + "default": null, + "optional": true + }, + { + "name": "intangible_assets", + "type": "float", + "description": "Intangible assets.", + "default": null, + "optional": true + }, + { + "name": "employee_benefit_assets", + "type": "float", + "description": "Employee benefit assets.", + "default": null, + "optional": true + }, + { + "name": "other_assets", + "type": "float", + "description": "Other assets.", + "default": null, + "optional": true + }, + { + "name": "other_non_current_operating_assets", + "type": "float", + "description": "Other noncurrent operating assets.", + "default": null, + "optional": true + }, + { + "name": "other_non_current_non_operating_assets", + "type": "float", + "description": "Other noncurrent non-operating assets.", + "default": null, + "optional": true + }, + { + "name": "interest_bearing_deposits", + "type": "float", + "description": "Interest bearing deposits.", + "default": null, + "optional": true + }, + { + "name": "total_non_current_assets", + "type": "float", + "description": "Total noncurrent assets.", + "default": null, + "optional": true + }, + { + "name": "total_assets", + "type": "float", + "description": "Total assets.", + "default": null, + "optional": true + }, + { + "name": "non_interest_bearing_deposits", + "type": "float", + "description": "Non interest bearing deposits.", + "default": null, + "optional": true + }, + { + "name": "federal_funds_purchased_and_securities_sold", + "type": "float", + "description": "Federal funds purchased and securities sold.", + "default": null, + "optional": true + }, + { + "name": "bankers_acceptance_outstanding", + "type": "float", + "description": "Bankers acceptance outstanding.", + "default": null, + "optional": true + }, + { + "name": "short_term_debt", + "type": "float", + "description": "Short term debt.", + "default": null, + "optional": true + }, + { + "name": "accounts_payable", + "type": "float", + "description": "Accounts payable.", + "default": null, + "optional": true + }, + { + "name": "current_deferred_revenue", + "type": "float", + "description": "Current deferred revenue.", + "default": null, + "optional": true + }, + { + "name": "current_deferred_payable_income_tax_liabilities", + "type": "float", + "description": "Current deferred payable income tax liabilities.", + "default": null, + "optional": true + }, + { + "name": "accrued_interest_payable", + "type": "float", + "description": "Accrued interest payable.", + "default": null, + "optional": true + }, + { + "name": "accrued_expenses", + "type": "float", + "description": "Accrued expenses.", + "default": null, + "optional": true + }, + { + "name": "other_short_term_payables", + "type": "float", + "description": "Other short term payables.", + "default": null, + "optional": true + }, + { + "name": "customer_deposits", + "type": "float", + "description": "Customer deposits.", + "default": null, + "optional": true + }, + { + "name": "dividends_payable", + "type": "float", + "description": "Dividends payable.", + "default": null, + "optional": true + }, + { + "name": "claims_and_claim_expense", + "type": "float", + "description": "Claims and claim expense.", + "default": null, + "optional": true + }, + { + "name": "future_policy_benefits", + "type": "float", + "description": "Future policy benefits.", + "default": null, + "optional": true + }, + { + "name": "current_employee_benefit_liabilities", + "type": "float", + "description": "Current employee benefit liabilities.", + "default": null, + "optional": true + }, + { + "name": "unearned_premiums_liability", + "type": "float", + "description": "Unearned premiums liability.", + "default": null, + "optional": true + }, + { + "name": "other_taxes_payable", + "type": "float", + "description": "Other taxes payable.", + "default": null, + "optional": true + }, + { + "name": "policy_holder_funds", + "type": "float", + "description": "Policy holder funds.", + "default": null, + "optional": true + }, + { + "name": "other_current_liabilities", + "type": "float", + "description": "Other current liabilities.", + "default": null, + "optional": true + }, + { + "name": "other_current_non_operating_liabilities", + "type": "float", + "description": "Other current non-operating liabilities.", + "default": null, + "optional": true + }, + { + "name": "separate_account_business_liabilities", + "type": "float", + "description": "Separate account business liabilities.", + "default": null, + "optional": true + }, + { + "name": "total_current_liabilities", + "type": "float", + "description": "Total current liabilities.", + "default": null, + "optional": true + }, + { + "name": "long_term_debt", + "type": "float", + "description": "Long term debt.", + "default": null, + "optional": true + }, + { + "name": "other_long_term_liabilities", + "type": "float", + "description": "Other long term liabilities.", + "default": null, + "optional": true + }, + { + "name": "non_current_deferred_revenue", + "type": "float", + "description": "Non-current deferred revenue.", + "default": null, + "optional": true + }, + { + "name": "non_current_deferred_payable_income_tax_liabilities", + "type": "float", + "description": "Non-current deferred payable income tax liabilities.", + "default": null, + "optional": true + }, + { + "name": "non_current_employee_benefit_liabilities", + "type": "float", + "description": "Non-current employee benefit liabilities.", + "default": null, + "optional": true + }, + { + "name": "other_non_current_operating_liabilities", + "type": "float", + "description": "Other non-current operating liabilities.", + "default": null, + "optional": true + }, + { + "name": "other_non_current_non_operating_liabilities", + "type": "float", + "description": "Other non-current, non-operating liabilities.", + "default": null, + "optional": true + }, + { + "name": "total_non_current_liabilities", + "type": "float", + "description": "Total non-current liabilities.", + "default": null, + "optional": true + }, + { + "name": "capital_lease_obligations", + "type": "float", + "description": "Capital lease obligations.", + "default": null, + "optional": true + }, + { + "name": "asset_retirement_reserve_litigation_obligation", + "type": "float", + "description": "Asset retirement reserve litigation obligation.", + "default": null, + "optional": true + }, + { + "name": "total_liabilities", + "type": "float", + "description": "Total liabilities.", + "default": null, + "optional": true + }, + { + "name": "commitments_contingencies", + "type": "float", + "description": "Commitments contingencies.", + "default": null, + "optional": true + }, + { + "name": "redeemable_non_controlling_interest", + "type": "float", + "description": "Redeemable non-controlling interest.", + "default": null, + "optional": true + }, + { + "name": "preferred_stock", + "type": "float", + "description": "Preferred stock.", + "default": null, + "optional": true + }, + { + "name": "common_stock", + "type": "float", + "description": "Common stock.", + "default": null, + "optional": true + }, + { + "name": "retained_earnings", + "type": "float", + "description": "Retained earnings.", + "default": null, + "optional": true + }, + { + "name": "treasury_stock", + "type": "float", + "description": "Treasury stock.", + "default": null, + "optional": true + }, + { + "name": "accumulated_other_comprehensive_income", + "type": "float", + "description": "Accumulated other comprehensive income.", + "default": null, + "optional": true + }, + { + "name": "participating_policy_holder_equity", + "type": "float", + "description": "Participating policy holder equity.", + "default": null, + "optional": true + }, + { + "name": "other_equity_adjustments", + "type": "float", + "description": "Other equity adjustments.", + "default": null, + "optional": true + }, + { + "name": "total_common_equity", + "type": "float", + "description": "Total common equity.", + "default": null, + "optional": true + }, + { + "name": "total_preferred_common_equity", + "type": "float", + "description": "Total preferred common equity.", + "default": null, + "optional": true + }, + { + "name": "non_controlling_interest", + "type": "float", + "description": "Non-controlling interest.", + "default": null, + "optional": true + }, + { + "name": "total_equity_non_controlling_interests", + "type": "float", + "description": "Total equity non-controlling interests.", + "default": null, + "optional": true + }, + { + "name": "total_liabilities_shareholders_equity", + "type": "float", + "description": "Total liabilities and shareholders equity.", + "default": null, + "optional": true + } + ], + "polygon": [ + { + "name": "accounts_receivable", + "type": "int", + "description": "Accounts receivable", + "default": null, + "optional": true + }, + { + "name": "marketable_securities", + "type": "int", + "description": "Marketable securities", + "default": null, + "optional": true + }, + { + "name": "prepaid_expenses", + "type": "int", + "description": "Prepaid expenses", + "default": null, + "optional": true + }, + { + "name": "other_current_assets", + "type": "int", + "description": "Other current assets", + "default": null, + "optional": true + }, + { + "name": "total_current_assets", + "type": "int", + "description": "Total current assets", + "default": null, + "optional": true + }, + { + "name": "property_plant_equipment_net", + "type": "int", + "description": "Property plant and equipment net", + "default": null, + "optional": true + }, + { + "name": "inventory", + "type": "int", + "description": "Inventory", + "default": null, + "optional": true + }, + { + "name": "other_non_current_assets", + "type": "int", + "description": "Other non-current assets", + "default": null, + "optional": true + }, + { + "name": "total_non_current_assets", + "type": "int", + "description": "Total non-current assets", + "default": null, + "optional": true + }, + { + "name": "intangible_assets", + "type": "int", + "description": "Intangible assets", + "default": null, + "optional": true + }, + { + "name": "total_assets", + "type": "int", + "description": "Total assets", + "default": null, + "optional": true + }, + { + "name": "accounts_payable", + "type": "int", + "description": "Accounts payable", + "default": null, + "optional": true + }, + { + "name": "employee_wages", + "type": "int", + "description": "Employee wages", + "default": null, + "optional": true + }, + { + "name": "other_current_liabilities", + "type": "int", + "description": "Other current liabilities", + "default": null, + "optional": true + }, + { + "name": "total_current_liabilities", + "type": "int", + "description": "Total current liabilities", + "default": null, + "optional": true + }, + { + "name": "other_non_current_liabilities", + "type": "int", + "description": "Other non-current liabilities", + "default": null, + "optional": true + }, + { + "name": "total_non_current_liabilities", + "type": "int", + "description": "Total non-current liabilities", + "default": null, + "optional": true + }, + { + "name": "long_term_debt", + "type": "int", + "description": "Long term debt", + "default": null, + "optional": true + }, + { + "name": "total_liabilities", + "type": "int", + "description": "Total liabilities", + "default": null, + "optional": true + }, + { + "name": "minority_interest", + "type": "int", + "description": "Minority interest", + "default": null, + "optional": true + }, + { + "name": "temporary_equity_attributable_to_parent", + "type": "int", + "description": "Temporary equity attributable to parent", + "default": null, + "optional": true + }, + { + "name": "equity_attributable_to_parent", + "type": "int", + "description": "Equity attributable to parent", + "default": null, + "optional": true + }, + { + "name": "temporary_equity", + "type": "int", + "description": "Temporary equity", + "default": null, + "optional": true + }, + { + "name": "preferred_stock", + "type": "int", + "description": "Preferred stock", + "default": null, + "optional": true + }, + { + "name": "redeemable_non_controlling_interest", + "type": "int", + "description": "Redeemable non-controlling interest", + "default": null, + "optional": true + }, + { + "name": "redeemable_non_controlling_interest_other", + "type": "int", + "description": "Redeemable non-controlling interest other", + "default": null, + "optional": true + }, + { + "name": "total_stock_holders_equity", + "type": "int", + "description": "Total stock holders equity", + "default": null, + "optional": true + }, + { + "name": "total_liabilities_and_stock_holders_equity", + "type": "int", + "description": "Total liabilities and stockholders equity", + "default": null, + "optional": true + }, + { + "name": "total_equity", + "type": "int", + "description": "Total equity", + "default": null, + "optional": true + } + ], + "yfinance": [] + }, + "model": "BalanceSheet" + }, + "/equity/fundamental/balance_growth": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the growth of a company's balance sheet items over time.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.balance_growth(symbol='AAPL', provider='fmp')\nobb.equity.fundamental.balance_growth(symbol='AAPL', limit=10, provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": 10, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[BalanceSheetGrowth]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": null, + "optional": true + }, + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "period", + "type": "str", + "description": "Reporting period.", + "default": "", + "optional": false + }, + { + "name": "growth_cash_and_cash_equivalents", + "type": "float", + "description": "Growth rate of cash and cash equivalents.", + "default": "", + "optional": false + }, + { + "name": "growth_short_term_investments", + "type": "float", + "description": "Growth rate of short-term investments.", + "default": "", + "optional": false + }, + { + "name": "growth_cash_and_short_term_investments", + "type": "float", + "description": "Growth rate of cash and short-term investments.", + "default": "", + "optional": false + }, + { + "name": "growth_net_receivables", + "type": "float", + "description": "Growth rate of net receivables.", + "default": "", + "optional": false + }, + { + "name": "growth_inventory", + "type": "float", + "description": "Growth rate of inventory.", + "default": "", + "optional": false + }, + { + "name": "growth_other_current_assets", + "type": "float", + "description": "Growth rate of other current assets.", + "default": "", + "optional": false + }, + { + "name": "growth_total_current_assets", + "type": "float", + "description": "Growth rate of total current assets.", + "default": "", + "optional": false + }, + { + "name": "growth_property_plant_equipment_net", + "type": "float", + "description": "Growth rate of net property, plant, and equipment.", + "default": "", + "optional": false + }, + { + "name": "growth_goodwill", + "type": "float", + "description": "Growth rate of goodwill.", + "default": "", + "optional": false + }, + { + "name": "growth_intangible_assets", + "type": "float", + "description": "Growth rate of intangible assets.", + "default": "", + "optional": false + }, + { + "name": "growth_goodwill_and_intangible_assets", + "type": "float", + "description": "Growth rate of goodwill and intangible assets.", + "default": "", + "optional": false + }, + { + "name": "growth_long_term_investments", + "type": "float", + "description": "Growth rate of long-term investments.", + "default": "", + "optional": false + }, + { + "name": "growth_tax_assets", + "type": "float", + "description": "Growth rate of tax assets.", + "default": "", + "optional": false + }, + { + "name": "growth_other_non_current_assets", + "type": "float", + "description": "Growth rate of other non-current assets.", + "default": "", + "optional": false + }, + { + "name": "growth_total_non_current_assets", + "type": "float", + "description": "Growth rate of total non-current assets.", + "default": "", + "optional": false + }, + { + "name": "growth_other_assets", + "type": "float", + "description": "Growth rate of other assets.", + "default": "", + "optional": false + }, + { + "name": "growth_total_assets", + "type": "float", + "description": "Growth rate of total assets.", + "default": "", + "optional": false + }, + { + "name": "growth_account_payables", + "type": "float", + "description": "Growth rate of accounts payable.", + "default": "", + "optional": false + }, + { + "name": "growth_short_term_debt", + "type": "float", + "description": "Growth rate of short-term debt.", + "default": "", + "optional": false + }, + { + "name": "growth_tax_payables", + "type": "float", + "description": "Growth rate of tax payables.", + "default": "", + "optional": false + }, + { + "name": "growth_deferred_revenue", + "type": "float", + "description": "Growth rate of deferred revenue.", + "default": "", + "optional": false + }, + { + "name": "growth_other_current_liabilities", + "type": "float", + "description": "Growth rate of other current liabilities.", + "default": "", + "optional": false + }, + { + "name": "growth_total_current_liabilities", + "type": "float", + "description": "Growth rate of total current liabilities.", + "default": "", + "optional": false + }, + { + "name": "growth_long_term_debt", + "type": "float", + "description": "Growth rate of long-term debt.", + "default": "", + "optional": false + }, + { + "name": "growth_deferred_revenue_non_current", + "type": "float", + "description": "Growth rate of non-current deferred revenue.", + "default": "", + "optional": false + }, + { + "name": "growth_deferrred_tax_liabilities_non_current", + "type": "float", + "description": "Growth rate of non-current deferred tax liabilities.", + "default": "", + "optional": false + }, + { + "name": "growth_other_non_current_liabilities", + "type": "float", + "description": "Growth rate of other non-current liabilities.", + "default": "", + "optional": false + }, + { + "name": "growth_total_non_current_liabilities", + "type": "float", + "description": "Growth rate of total non-current liabilities.", + "default": "", + "optional": false + }, + { + "name": "growth_other_liabilities", + "type": "float", + "description": "Growth rate of other liabilities.", + "default": "", + "optional": false + }, + { + "name": "growth_total_liabilities", + "type": "float", + "description": "Growth rate of total liabilities.", + "default": "", + "optional": false + }, + { + "name": "growth_common_stock", + "type": "float", + "description": "Growth rate of common stock.", + "default": "", + "optional": false + }, + { + "name": "growth_retained_earnings", + "type": "float", + "description": "Growth rate of retained earnings.", + "default": "", + "optional": false + }, + { + "name": "growth_accumulated_other_comprehensive_income_loss", + "type": "float", + "description": "Growth rate of accumulated other comprehensive income/loss.", + "default": "", + "optional": false + }, + { + "name": "growth_othertotal_stockholders_equity", + "type": "float", + "description": "Growth rate of other total stockholders' equity.", + "default": "", + "optional": false + }, + { + "name": "growth_total_stockholders_equity", + "type": "float", + "description": "Growth rate of total stockholders' equity.", + "default": "", + "optional": false + }, + { + "name": "growth_total_liabilities_and_stockholders_equity", + "type": "float", + "description": "Growth rate of total liabilities and stockholders' equity.", + "default": "", + "optional": false + }, + { + "name": "growth_total_investments", + "type": "float", + "description": "Growth rate of total investments.", + "default": "", + "optional": false + }, + { + "name": "growth_total_debt", + "type": "float", + "description": "Growth rate of total debt.", + "default": "", + "optional": false + }, + { + "name": "growth_net_debt", + "type": "float", + "description": "Growth rate of net debt.", + "default": "", + "optional": false + } + ], + "fmp": [] + }, + "model": "BalanceSheetGrowth" + }, + "/equity/fundamental/cash": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the cash flow statement for a given company.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.cash(symbol='AAPL', provider='fmp')\nobb.equity.fundamental.cash(symbol='AAPL', period='annual', limit=5, provider='intrinio')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "period", + "type": "str", + "description": "Time period of the data to return.", + "default": "annual", + "optional": true + }, + { + "name": "limit", + "type": "Annotated[int, Ge(ge=0)]", + "description": "The number of data entries to return.", + "default": 5, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp', 'intrinio', 'polygon', 'yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [], + "intrinio": [ + { + "name": "fiscal_year", + "type": "int", + "description": "The specific fiscal year. Reports do not go beyond 2008.", + "default": null, + "optional": true + } + ], + "polygon": [ + { + "name": "filing_date", + "type": "date", + "description": "Filing date of the financial statement.", + "default": null, + "optional": true + }, + { + "name": "filing_date_lt", + "type": "date", + "description": "Filing date less than the given date.", + "default": null, + "optional": true + }, + { + "name": "filing_date_lte", + "type": "date", + "description": "Filing date less than or equal to the given date.", + "default": null, + "optional": true + }, + { + "name": "filing_date_gt", + "type": "date", + "description": "Filing date greater than the given date.", + "default": null, + "optional": true + }, + { + "name": "filing_date_gte", + "type": "date", + "description": "Filing date greater than or equal to the given date.", + "default": null, + "optional": true + }, + { + "name": "period_of_report_date", + "type": "date", + "description": "Period of report date of the financial statement.", + "default": null, + "optional": true + }, + { + "name": "period_of_report_date_lt", + "type": "date", + "description": "Period of report date less than the given date.", + "default": null, + "optional": true + }, + { + "name": "period_of_report_date_lte", + "type": "date", + "description": "Period of report date less than or equal to the given date.", + "default": null, + "optional": true + }, + { + "name": "period_of_report_date_gt", + "type": "date", + "description": "Period of report date greater than the given date.", + "default": null, + "optional": true + }, + { + "name": "period_of_report_date_gte", + "type": "date", + "description": "Period of report date greater than or equal to the given date.", + "default": null, + "optional": true + }, + { + "name": "include_sources", + "type": "bool", + "description": "Whether to include the sources of the financial statement.", + "default": false, + "optional": true + }, + { + "name": "order", + "type": "Literal[None, 'asc', 'desc']", + "description": "Order of the financial statement.", + "default": null, + "optional": true + }, + { + "name": "sort", + "type": "Literal[None, 'filing_date', 'period_of_report_date']", + "description": "Sort of the financial statement.", + "default": null, + "optional": true + } + ], + "yfinance": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[CashFlowStatement]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'intrinio', 'polygon', 'yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "period_ending", + "type": "date", + "description": "The end date of the reporting period.", + "default": "", + "optional": false + }, + { + "name": "fiscal_period", + "type": "str", + "description": "The fiscal period of the report.", + "default": null, + "optional": true + }, + { + "name": "fiscal_year", + "type": "int", + "description": "The fiscal year of the fiscal period.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "filing_date", + "type": "date", + "description": "The date of the filing.", + "default": null, + "optional": true + }, + { + "name": "accepted_date", + "type": "datetime", + "description": "The date the filing was accepted.", + "default": null, + "optional": true + }, + { + "name": "reported_currency", + "type": "str", + "description": "The currency in which the cash flow statement was reported.", + "default": null, + "optional": true + }, + { + "name": "net_income", + "type": "float", + "description": "Net income.", + "default": null, + "optional": true + }, + { + "name": "depreciation_and_amortization", + "type": "float", + "description": "Depreciation and amortization.", + "default": null, + "optional": true + }, + { + "name": "deferred_income_tax", + "type": "float", + "description": "Deferred income tax.", + "default": null, + "optional": true + }, + { + "name": "stock_based_compensation", + "type": "float", + "description": "Stock-based compensation.", + "default": null, + "optional": true + }, + { + "name": "change_in_working_capital", + "type": "float", + "description": "Change in working capital.", + "default": null, + "optional": true + }, + { + "name": "change_in_account_receivables", + "type": "float", + "description": "Change in account receivables.", + "default": null, + "optional": true + }, + { + "name": "change_in_inventory", + "type": "float", + "description": "Change in inventory.", + "default": null, + "optional": true + }, + { + "name": "change_in_account_payable", + "type": "float", + "description": "Change in account payable.", + "default": null, + "optional": true + }, + { + "name": "change_in_other_working_capital", + "type": "float", + "description": "Change in other working capital.", + "default": null, + "optional": true + }, + { + "name": "change_in_other_non_cash_items", + "type": "float", + "description": "Change in other non-cash items.", + "default": null, + "optional": true + }, + { + "name": "net_cash_from_operating_activities", + "type": "float", + "description": "Net cash from operating activities.", + "default": null, + "optional": true + }, + { + "name": "purchase_of_property_plant_and_equipment", + "type": "float", + "description": "Purchase of property, plant and equipment.", + "default": null, + "optional": true + }, + { + "name": "acquisitions", + "type": "float", + "description": "Acquisitions.", + "default": null, + "optional": true + }, + { + "name": "purchase_of_investment_securities", + "type": "float", + "description": "Purchase of investment securities.", + "default": null, + "optional": true + }, + { + "name": "sale_and_maturity_of_investments", + "type": "float", + "description": "Sale and maturity of investments.", + "default": null, + "optional": true + }, + { + "name": "other_investing_activities", + "type": "float", + "description": "Other investing activities.", + "default": null, + "optional": true + }, + { + "name": "net_cash_from_investing_activities", + "type": "float", + "description": "Net cash from investing activities.", + "default": null, + "optional": true + }, + { + "name": "repayment_of_debt", + "type": "float", + "description": "Repayment of debt.", + "default": null, + "optional": true + }, + { + "name": "issuance_of_common_equity", + "type": "float", + "description": "Issuance of common equity.", + "default": null, + "optional": true + }, + { + "name": "repurchase_of_common_equity", + "type": "float", + "description": "Repurchase of common equity.", + "default": null, + "optional": true + }, + { + "name": "payment_of_dividends", + "type": "float", + "description": "Payment of dividends.", + "default": null, + "optional": true + }, + { + "name": "other_financing_activities", + "type": "float", + "description": "Other financing activities.", + "default": null, + "optional": true + }, + { + "name": "net_cash_from_financing_activities", + "type": "float", + "description": "Net cash from financing activities.", + "default": null, + "optional": true + }, + { + "name": "effect_of_exchange_rate_changes_on_cash", + "type": "float", + "description": "Effect of exchange rate changes on cash.", + "default": null, + "optional": true + }, + { + "name": "net_change_in_cash_and_equivalents", + "type": "float", + "description": "Net change in cash and equivalents.", + "default": null, + "optional": true + }, + { + "name": "cash_at_beginning_of_period", + "type": "float", + "description": "Cash at beginning of period.", + "default": null, + "optional": true + }, + { + "name": "cash_at_end_of_period", + "type": "float", + "description": "Cash at end of period.", + "default": null, + "optional": true + }, + { + "name": "operating_cash_flow", + "type": "float", + "description": "Operating cash flow.", + "default": null, + "optional": true + }, + { + "name": "capital_expenditure", + "type": "float", + "description": "Capital expenditure.", + "default": null, + "optional": true + }, + { + "name": "free_cash_flow", + "type": "float", + "description": "None", + "default": null, + "optional": true + }, + { + "name": "link", + "type": "str", + "description": "Link to the filing.", + "default": null, + "optional": true + }, + { + "name": "final_link", + "type": "str", + "description": "Link to the filing document.", + "default": null, + "optional": true + } + ], + "intrinio": [ + { + "name": "reported_currency", + "type": "str", + "description": "The currency in which the balance sheet is reported.", + "default": null, + "optional": true + }, + { + "name": "net_income_continuing_operations", + "type": "float", + "description": "Net Income (Continuing Operations)", + "default": null, + "optional": true + }, + { + "name": "net_income_discontinued_operations", + "type": "float", + "description": "Net Income (Discontinued Operations)", + "default": null, + "optional": true + }, + { + "name": "net_income", + "type": "float", + "description": "Consolidated Net Income.", + "default": null, + "optional": true + }, + { + "name": "provision_for_loan_losses", + "type": "float", + "description": "Provision for Loan Losses", + "default": null, + "optional": true + }, + { + "name": "provision_for_credit_losses", + "type": "float", + "description": "Provision for credit losses", + "default": null, + "optional": true + }, + { + "name": "depreciation_expense", + "type": "float", + "description": "Depreciation Expense.", + "default": null, + "optional": true + }, + { + "name": "amortization_expense", + "type": "float", + "description": "Amortization Expense.", + "default": null, + "optional": true + }, + { + "name": "share_based_compensation", + "type": "float", + "description": "Share-based compensation.", + "default": null, + "optional": true + }, + { + "name": "non_cash_adjustments_to_reconcile_net_income", + "type": "float", + "description": "Non-Cash Adjustments to Reconcile Net Income.", + "default": null, + "optional": true + }, + { + "name": "changes_in_operating_assets_and_liabilities", + "type": "float", + "description": "Changes in Operating Assets and Liabilities (Net)", + "default": null, + "optional": true + }, + { + "name": "net_cash_from_continuing_operating_activities", + "type": "float", + "description": "Net Cash from Continuing Operating Activities", + "default": null, + "optional": true + }, + { + "name": "net_cash_from_discontinued_operating_activities", + "type": "float", + "description": "Net Cash from Discontinued Operating Activities", + "default": null, + "optional": true + }, + { + "name": "net_cash_from_operating_activities", + "type": "float", + "description": "Net Cash from Operating Activities", + "default": null, + "optional": true + }, + { + "name": "divestitures", + "type": "float", + "description": "Divestitures", + "default": null, + "optional": true + }, + { + "name": "sale_of_property_plant_and_equipment", + "type": "float", + "description": "Sale of Property, Plant, and Equipment", + "default": null, + "optional": true + }, + { + "name": "acquisitions", + "type": "float", + "description": "Acquisitions", + "default": null, + "optional": true + }, + { + "name": "purchase_of_investments", + "type": "float", + "description": "Purchase of Investments", + "default": null, + "optional": true + }, + { + "name": "purchase_of_investment_securities", + "type": "float", + "description": "Purchase of Investment Securities", + "default": null, + "optional": true + }, + { + "name": "sale_and_maturity_of_investments", + "type": "float", + "description": "Sale and Maturity of Investments", + "default": null, + "optional": true + }, + { + "name": "loans_held_for_sale", + "type": "float", + "description": "Loans Held for Sale (Net)", + "default": null, + "optional": true + }, + { + "name": "purchase_of_property_plant_and_equipment", + "type": "float", + "description": "Purchase of Property, Plant, and Equipment", + "default": null, + "optional": true + }, + { + "name": "other_investing_activities", + "type": "float", + "description": "Other Investing Activities (Net)", + "default": null, + "optional": true + }, + { + "name": "net_cash_from_continuing_investing_activities", + "type": "float", + "description": "Net Cash from Continuing Investing Activities", + "default": null, + "optional": true + }, + { + "name": "net_cash_from_discontinued_investing_activities", + "type": "float", + "description": "Net Cash from Discontinued Investing Activities", + "default": null, + "optional": true + }, + { + "name": "net_cash_from_investing_activities", + "type": "float", + "description": "Net Cash from Investing Activities", + "default": null, + "optional": true + }, + { + "name": "payment_of_dividends", + "type": "float", + "description": "Payment of Dividends", + "default": null, + "optional": true + }, + { + "name": "repurchase_of_common_equity", + "type": "float", + "description": "Repurchase of Common Equity", + "default": null, + "optional": true + }, + { + "name": "repurchase_of_preferred_equity", + "type": "float", + "description": "Repurchase of Preferred Equity", + "default": null, + "optional": true + }, + { + "name": "issuance_of_common_equity", + "type": "float", + "description": "Issuance of Common Equity", + "default": null, + "optional": true + }, + { + "name": "issuance_of_preferred_equity", + "type": "float", + "description": "Issuance of Preferred Equity", + "default": null, + "optional": true + }, + { + "name": "issuance_of_debt", + "type": "float", + "description": "Issuance of Debt", + "default": null, + "optional": true + }, + { + "name": "repayment_of_debt", + "type": "float", + "description": "Repayment of Debt", + "default": null, + "optional": true + }, + { + "name": "other_financing_activities", + "type": "float", + "description": "Other Financing Activities (Net)", + "default": null, + "optional": true + }, + { + "name": "cash_interest_received", + "type": "float", + "description": "Cash Interest Received", + "default": null, + "optional": true + }, + { + "name": "net_change_in_deposits", + "type": "float", + "description": "Net Change in Deposits", + "default": null, + "optional": true + }, + { + "name": "net_increase_in_fed_funds_sold", + "type": "float", + "description": "Net Increase in Fed Funds Sold", + "default": null, + "optional": true + }, + { + "name": "net_cash_from_continuing_financing_activities", + "type": "float", + "description": "Net Cash from Continuing Financing Activities", + "default": null, + "optional": true + }, + { + "name": "net_cash_from_discontinued_financing_activities", + "type": "float", + "description": "Net Cash from Discontinued Financing Activities", + "default": null, + "optional": true + }, + { + "name": "net_cash_from_financing_activities", + "type": "float", + "description": "Net Cash from Financing Activities", + "default": null, + "optional": true + }, + { + "name": "effect_of_exchange_rate_changes", + "type": "float", + "description": "Effect of Exchange Rate Changes", + "default": null, + "optional": true + }, + { + "name": "other_net_changes_in_cash", + "type": "float", + "description": "Other Net Changes in Cash", + "default": null, + "optional": true + }, + { + "name": "net_change_in_cash_and_equivalents", + "type": "float", + "description": "Net Change in Cash and Equivalents", + "default": null, + "optional": true + }, + { + "name": "cash_income_taxes_paid", + "type": "float", + "description": "Cash Income Taxes Paid", + "default": null, + "optional": true + }, + { + "name": "cash_interest_paid", + "type": "float", + "description": "Cash Interest Paid", + "default": null, + "optional": true + } + ], + "polygon": [ + { + "name": "net_cash_flow_from_operating_activities_continuing", + "type": "int", + "description": "Net cash flow from operating activities continuing.", + "default": null, + "optional": true + }, + { + "name": "net_cash_flow_from_operating_activities_discontinued", + "type": "int", + "description": "Net cash flow from operating activities discontinued.", + "default": null, + "optional": true + }, + { + "name": "net_cash_flow_from_operating_activities", + "type": "int", + "description": "Net cash flow from operating activities.", + "default": null, + "optional": true + }, + { + "name": "net_cash_flow_from_investing_activities_continuing", + "type": "int", + "description": "Net cash flow from investing activities continuing.", + "default": null, + "optional": true + }, + { + "name": "net_cash_flow_from_investing_activities_discontinued", + "type": "int", + "description": "Net cash flow from investing activities discontinued.", + "default": null, + "optional": true + }, + { + "name": "net_cash_flow_from_investing_activities", + "type": "int", + "description": "Net cash flow from investing activities.", + "default": null, + "optional": true + }, + { + "name": "net_cash_flow_from_financing_activities_continuing", + "type": "int", + "description": "Net cash flow from financing activities continuing.", + "default": null, + "optional": true + }, + { + "name": "net_cash_flow_from_financing_activities_discontinued", + "type": "int", + "description": "Net cash flow from financing activities discontinued.", + "default": null, + "optional": true + }, + { + "name": "net_cash_flow_from_financing_activities", + "type": "int", + "description": "Net cash flow from financing activities.", + "default": null, + "optional": true + }, + { + "name": "net_cash_flow_continuing", + "type": "int", + "description": "Net cash flow continuing.", + "default": null, + "optional": true + }, + { + "name": "net_cash_flow_discontinued", + "type": "int", + "description": "Net cash flow discontinued.", + "default": null, + "optional": true + }, + { + "name": "exchange_gains_losses", + "type": "int", + "description": "Exchange gains losses.", + "default": null, + "optional": true + }, + { + "name": "net_cash_flow", + "type": "int", + "description": "Net cash flow.", + "default": null, + "optional": true + } + ], + "yfinance": [] + }, + "model": "CashFlowStatement" + }, + "/equity/fundamental/reported_financials": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get financial statements as reported by the company.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.reported_financials(symbol='AAPL', provider='intrinio')\n# Get AAPL balance sheet with a limit of 10 items.\nobb.equity.fundamental.reported_financials(symbol='AAPL', period='annual', statement_type='balance', limit=10, provider='intrinio')\n# Get reported income statement\nobb.equity.fundamental.reported_financials(symbol='AAPL', statement_type='income', provider='intrinio')\n# Get reported cash flow statement\nobb.equity.fundamental.reported_financials(symbol='AAPL', statement_type='cash', provider='intrinio')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "period", + "type": "str", + "description": "Time period of the data to return.", + "default": "annual", + "optional": true + }, + { + "name": "statement_type", + "type": "str", + "description": "The type of financial statement - i.e, balance, income, cash.", + "default": "balance", + "optional": true + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return. Although the response object contains multiple results, because of the variance in the fields, year-to-year and quarter-to-quarter, it is recommended to view results in small chunks.", + "default": 100, + "optional": true + }, + { + "name": "provider", + "type": "Literal['intrinio']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'intrinio' if there is no default.", + "default": "intrinio", + "optional": true + } + ], + "intrinio": [ + { + "name": "fiscal_year", + "type": "int", + "description": "The specific fiscal year. Reports do not go beyond 2008.", + "default": null, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[ReportedFinancials]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['intrinio']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "period_ending", + "type": "date", + "description": "The ending date of the reporting period.", + "default": "", + "optional": false + }, + { + "name": "fiscal_period", + "type": "str", + "description": "The fiscal period of the report (e.g. FY, Q1, etc.).", + "default": "", + "optional": false + }, + { + "name": "fiscal_year", + "type": "int", + "description": "The fiscal year of the fiscal period.", + "default": null, + "optional": true + } + ], + "intrinio": [] + }, + "model": "ReportedFinancials" + }, + "/equity/fundamental/cash_growth": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the growth of a company's cash flow statement items over time.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.cash_growth(symbol='AAPL', provider='fmp')\nobb.equity.fundamental.cash_growth(symbol='AAPL', limit=10, provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": 10, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[CashFlowStatementGrowth]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": null, + "optional": true + }, + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "period", + "type": "str", + "description": "Period the statement is returned for.", + "default": "", + "optional": false + }, + { + "name": "growth_net_income", + "type": "float", + "description": "Growth rate of net income.", + "default": "", + "optional": false + }, + { + "name": "growth_depreciation_and_amortization", + "type": "float", + "description": "Growth rate of depreciation and amortization.", + "default": "", + "optional": false + }, + { + "name": "growth_deferred_income_tax", + "type": "float", + "description": "Growth rate of deferred income tax.", + "default": "", + "optional": false + }, + { + "name": "growth_stock_based_compensation", + "type": "float", + "description": "Growth rate of stock-based compensation.", + "default": "", + "optional": false + }, + { + "name": "growth_change_in_working_capital", + "type": "float", + "description": "Growth rate of change in working capital.", + "default": "", + "optional": false + }, + { + "name": "growth_accounts_receivables", + "type": "float", + "description": "Growth rate of accounts receivables.", + "default": "", + "optional": false + }, + { + "name": "growth_inventory", + "type": "float", + "description": "Growth rate of inventory.", + "default": "", + "optional": false + }, + { + "name": "growth_accounts_payables", + "type": "float", + "description": "Growth rate of accounts payables.", + "default": "", + "optional": false + }, + { + "name": "growth_other_working_capital", + "type": "float", + "description": "Growth rate of other working capital.", + "default": "", + "optional": false + }, + { + "name": "growth_other_non_cash_items", + "type": "float", + "description": "Growth rate of other non-cash items.", + "default": "", + "optional": false + }, + { + "name": "growth_net_cash_provided_by_operating_activities", + "type": "float", + "description": "Growth rate of net cash provided by operating activities.", + "default": "", + "optional": false + }, + { + "name": "growth_investments_in_property_plant_and_equipment", + "type": "float", + "description": "Growth rate of investments in property, plant, and equipment.", + "default": "", + "optional": false + }, + { + "name": "growth_acquisitions_net", + "type": "float", + "description": "Growth rate of net acquisitions.", + "default": "", + "optional": false + }, + { + "name": "growth_purchases_of_investments", + "type": "float", + "description": "Growth rate of purchases of investments.", + "default": "", + "optional": false + }, + { + "name": "growth_sales_maturities_of_investments", + "type": "float", + "description": "Growth rate of sales maturities of investments.", + "default": "", + "optional": false + }, + { + "name": "growth_other_investing_activities", + "type": "float", + "description": "Growth rate of other investing activities.", + "default": "", + "optional": false + }, + { + "name": "growth_net_cash_used_for_investing_activities", + "type": "float", + "description": "Growth rate of net cash used for investing activities.", + "default": "", + "optional": false + }, + { + "name": "growth_debt_repayment", + "type": "float", + "description": "Growth rate of debt repayment.", + "default": "", + "optional": false + }, + { + "name": "growth_common_stock_issued", + "type": "float", + "description": "Growth rate of common stock issued.", + "default": "", + "optional": false + }, + { + "name": "growth_common_stock_repurchased", + "type": "float", + "description": "Growth rate of common stock repurchased.", + "default": "", + "optional": false + }, + { + "name": "growth_dividends_paid", + "type": "float", + "description": "Growth rate of dividends paid.", + "default": "", + "optional": false + }, + { + "name": "growth_other_financing_activities", + "type": "float", + "description": "Growth rate of other financing activities.", + "default": "", + "optional": false + }, + { + "name": "growth_net_cash_used_provided_by_financing_activities", + "type": "float", + "description": "Growth rate of net cash used/provided by financing activities.", + "default": "", + "optional": false + }, + { + "name": "growth_effect_of_forex_changes_on_cash", + "type": "float", + "description": "Growth rate of the effect of foreign exchange changes on cash.", + "default": "", + "optional": false + }, + { + "name": "growth_net_change_in_cash", + "type": "float", + "description": "Growth rate of net change in cash.", + "default": "", + "optional": false + }, + { + "name": "growth_cash_at_end_of_period", + "type": "float", + "description": "Growth rate of cash at the end of the period.", + "default": "", + "optional": false + }, + { + "name": "growth_cash_at_beginning_of_period", + "type": "float", + "description": "Growth rate of cash at the beginning of the period.", + "default": "", + "optional": false + }, + { + "name": "growth_operating_cash_flow", + "type": "float", + "description": "Growth rate of operating cash flow.", + "default": "", + "optional": false + }, + { + "name": "growth_capital_expenditure", + "type": "float", + "description": "Growth rate of capital expenditure.", + "default": "", + "optional": false + }, + { + "name": "growth_free_cash_flow", + "type": "float", + "description": "Growth rate of free cash flow.", + "default": "", + "optional": false + } + ], + "fmp": [] + }, + "model": "CashFlowStatementGrowth" + }, + "/equity/fundamental/dividends": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get historical dividend data for a given company.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.dividends(symbol='AAPL', provider='intrinio')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp', 'intrinio', 'yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [], + "intrinio": [ + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": 100, + "optional": true + } + ], + "yfinance": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[HistoricalDividends]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'intrinio', 'yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "ex_dividend_date", + "type": "date", + "description": "The ex-dividend date - the date on which the stock begins trading without rights to the dividend.", + "default": "", + "optional": false + }, + { + "name": "amount", + "type": "float", + "description": "The dividend amount per share.", + "default": "", + "optional": false + } + ], + "fmp": [ + { + "name": "label", + "type": "str", + "description": "Label of the historical dividends.", + "default": "", + "optional": false + }, + { + "name": "adj_dividend", + "type": "float", + "description": "Adjusted dividend of the historical dividends.", + "default": "", + "optional": false + }, + { + "name": "record_date", + "type": "date", + "description": "Record date of the historical dividends.", + "default": null, + "optional": true + }, + { + "name": "payment_date", + "type": "date", + "description": "Payment date of the historical dividends.", + "default": null, + "optional": true + }, + { + "name": "declaration_date", + "type": "date", + "description": "Declaration date of the historical dividends.", + "default": null, + "optional": true + } + ], + "intrinio": [ + { + "name": "factor", + "type": "float", + "description": "factor by which to multiply stock prices before this date, in order to calculate historically-adjusted stock prices.", + "default": null, + "optional": true + }, + { + "name": "currency", + "type": "str", + "description": "The currency in which the dividend is paid.", + "default": null, + "optional": true + }, + { + "name": "split_ratio", + "type": "float", + "description": "The ratio of the stock split, if a stock split occurred.", + "default": null, + "optional": true + } + ], + "yfinance": [] + }, + "model": "HistoricalDividends" + }, + "/equity/fundamental/historical_eps": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get historical earnings per share data for a given company.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.historical_eps(symbol='AAPL', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [ + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": null, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[HistoricalEps]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": null, + "optional": true + }, + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "announce_time", + "type": "str", + "description": "Timing of the earnings announcement.", + "default": null, + "optional": true + }, + { + "name": "eps_actual", + "type": "float", + "description": "Actual EPS from the earnings date.", + "default": null, + "optional": true + }, + { + "name": "eps_estimated", + "type": "float", + "description": "Estimated EPS for the earnings date.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "revenue_estimated", + "type": "float", + "description": "Estimated consensus revenue for the reporting period.", + "default": null, + "optional": true + }, + { + "name": "revenue_actual", + "type": "float", + "description": "The actual reported revenue.", + "default": null, + "optional": true + }, + { + "name": "reporting_time", + "type": "str", + "description": "The reporting time - e.g. after market close.", + "default": null, + "optional": true + }, + { + "name": "updated_at", + "type": "date", + "description": "The date when the data was last updated.", + "default": null, + "optional": true + }, + { + "name": "period_ending", + "type": "date", + "description": "The fiscal period end date.", + "default": null, + "optional": true + } + ] + }, + "model": "HistoricalEps" + }, + "/equity/fundamental/employee_count": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get historical employee count data for a given company.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.employee_count(symbol='AAPL', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[HistoricalEmployees]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "cik", + "type": "int", + "description": "Central Index Key (CIK) for the requested entity.", + "default": "", + "optional": false + }, + { + "name": "acceptance_time", + "type": "datetime", + "description": "Time of acceptance of the company employee.", + "default": "", + "optional": false + }, + { + "name": "period_of_report", + "type": "date", + "description": "Date of reporting of the company employee.", + "default": "", + "optional": false + }, + { + "name": "company_name", + "type": "str", + "description": "Registered name of the company to retrieve the historical employees of.", + "default": "", + "optional": false + }, + { + "name": "form_type", + "type": "str", + "description": "Form type of the company employee.", + "default": "", + "optional": false + }, + { + "name": "filing_date", + "type": "date", + "description": "Filing date of the company employee", + "default": "", + "optional": false + }, + { + "name": "employee_count", + "type": "int", + "description": "Count of employees of the company.", + "default": "", + "optional": false + }, + { + "name": "source", + "type": "str", + "description": "Source URL which retrieves this data for the company.", + "default": "", + "optional": false + } + ], + "fmp": [] + }, + "model": "HistoricalEmployees" + }, + "/equity/fundamental/search_attributes": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Search Intrinio data tags to search in latest or historical attributes.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.search_attributes(query='ebitda', provider='intrinio')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "query", + "type": "str", + "description": "Query to search for.", + "default": "", + "optional": false + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": 1000, + "optional": true + }, + { + "name": "provider", + "type": "Literal['intrinio']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'intrinio' if there is no default.", + "default": "intrinio", + "optional": true + } + ], + "intrinio": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[SearchAttributes]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['intrinio']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "id", + "type": "str", + "description": "ID of the financial attribute.", + "default": "", + "optional": false + }, + { + "name": "name", + "type": "str", + "description": "Name of the financial attribute.", + "default": "", + "optional": false + }, + { + "name": "tag", + "type": "str", + "description": "Tag of the financial attribute.", + "default": "", + "optional": false + }, + { + "name": "statement_code", + "type": "str", + "description": "Code of the financial statement.", + "default": "", + "optional": false + }, + { + "name": "statement_type", + "type": "str", + "description": "Type of the financial statement.", + "default": null, + "optional": true + }, + { + "name": "parent_name", + "type": "str", + "description": "Parent's name of the financial attribute.", + "default": null, + "optional": true + }, + { + "name": "sequence", + "type": "int", + "description": "Sequence of the financial statement.", + "default": null, + "optional": true + }, + { + "name": "factor", + "type": "str", + "description": "Unit of the financial attribute.", + "default": null, + "optional": true + }, + { + "name": "transaction", + "type": "str", + "description": "Transaction type (credit/debit) of the financial attribute.", + "default": null, + "optional": true + }, + { + "name": "type", + "type": "str", + "description": "Type of the financial attribute.", + "default": null, + "optional": true + }, + { + "name": "unit", + "type": "str", + "description": "Unit of the financial attribute.", + "default": null, + "optional": true + } + ], + "intrinio": [] + }, + "model": "SearchAttributes" + }, + "/equity/fundamental/latest_attributes": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the latest value of a data tag from Intrinio.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.latest_attributes(symbol='AAPL', tag='ceo', provider='intrinio')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Multiple items allowed for provider(s): intrinio.", + "default": "", + "optional": false + }, + { + "name": "tag", + "type": "Union[str, List[str]]", + "description": "Intrinio data tag ID or code. Multiple items allowed for provider(s): intrinio.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['intrinio']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'intrinio' if there is no default.", + "default": "intrinio", + "optional": true + } + ], + "intrinio": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[LatestAttributes]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['intrinio']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "tag", + "type": "str", + "description": "Tag name for the fetched data.", + "default": null, + "optional": true + }, + { + "name": "value", + "type": "Union[str, float]", + "description": "The value of the data.", + "default": null, + "optional": true + } + ], + "intrinio": [] + }, + "model": "LatestAttributes" + }, + "/equity/fundamental/historical_attributes": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the historical values of a data tag from Intrinio.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.historical_attributes(symbol='AAPL', tag='ebitda', provider='intrinio')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Multiple items allowed for provider(s): intrinio.", + "default": "", + "optional": false + }, + { + "name": "tag", + "type": "Union[str, List[str]]", + "description": "Intrinio data tag ID or code. Multiple items allowed for provider(s): intrinio.", + "default": "", + "optional": false + }, + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "frequency", + "type": "Literal['daily', 'weekly', 'monthly', 'quarterly', 'yearly']", + "description": "The frequency of the data.", + "default": "yearly", + "optional": true + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": 1000, + "optional": true + }, + { + "name": "tag_type", + "type": "str", + "description": "Filter by type, when applicable.", + "default": null, + "optional": true + }, + { + "name": "sort", + "type": "Literal['asc', 'desc']", + "description": "Sort order.", + "default": "desc", + "optional": true + }, + { + "name": "provider", + "type": "Literal['intrinio']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'intrinio' if there is no default.", + "default": "intrinio", + "optional": true + } + ], + "intrinio": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[HistoricalAttributes]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['intrinio']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "tag", + "type": "str", + "description": "Tag name for the fetched data.", + "default": null, + "optional": true + }, + { + "name": "value", + "type": "float", + "description": "The value of the data.", + "default": null, + "optional": true + } + ], + "intrinio": [] + }, + "model": "HistoricalAttributes" + }, + "/equity/fundamental/income": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the income statement for a given company.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.income(symbol='AAPL', provider='fmp')\nobb.equity.fundamental.income(symbol='AAPL', period='annual', limit=5, provider='intrinio')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "period", + "type": "str", + "description": "Time period of the data to return.", + "default": "annual", + "optional": true + }, + { + "name": "limit", + "type": "Annotated[int, Ge(ge=0)]", + "description": "The number of data entries to return.", + "default": 5, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp', 'intrinio', 'polygon', 'yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [], + "intrinio": [ + { + "name": "fiscal_year", + "type": "int", + "description": "The specific fiscal year. Reports do not go beyond 2008.", + "default": null, + "optional": true + } + ], + "polygon": [ + { + "name": "filing_date", + "type": "date", + "description": "Filing date of the financial statement.", + "default": null, + "optional": true + }, + { + "name": "filing_date_lt", + "type": "date", + "description": "Filing date less than the given date.", + "default": null, + "optional": true + }, + { + "name": "filing_date_lte", + "type": "date", + "description": "Filing date less than or equal to the given date.", + "default": null, + "optional": true + }, + { + "name": "filing_date_gt", + "type": "date", + "description": "Filing date greater than the given date.", + "default": null, + "optional": true + }, + { + "name": "filing_date_gte", + "type": "date", + "description": "Filing date greater than or equal to the given date.", + "default": null, + "optional": true + }, + { + "name": "period_of_report_date", + "type": "date", + "description": "Period of report date of the financial statement.", + "default": null, + "optional": true + }, + { + "name": "period_of_report_date_lt", + "type": "date", + "description": "Period of report date less than the given date.", + "default": null, + "optional": true + }, + { + "name": "period_of_report_date_lte", + "type": "date", + "description": "Period of report date less than or equal to the given date.", + "default": null, + "optional": true + }, + { + "name": "period_of_report_date_gt", + "type": "date", + "description": "Period of report date greater than the given date.", + "default": null, + "optional": true + }, + { + "name": "period_of_report_date_gte", + "type": "date", + "description": "Period of report date greater than or equal to the given date.", + "default": null, + "optional": true + }, + { + "name": "include_sources", + "type": "bool", + "description": "Whether to include the sources of the financial statement.", + "default": null, + "optional": true + }, + { + "name": "order", + "type": "Literal['asc', 'desc']", + "description": "Order of the financial statement.", + "default": null, + "optional": true + }, + { + "name": "sort", + "type": "Literal['filing_date', 'period_of_report_date']", + "description": "Sort of the financial statement.", + "default": null, + "optional": true + } + ], + "yfinance": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[IncomeStatement]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'intrinio', 'polygon', 'yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "period_ending", + "type": "date", + "description": "The end date of the reporting period.", + "default": "", + "optional": false + }, + { + "name": "fiscal_period", + "type": "str", + "description": "The fiscal period of the report.", + "default": null, + "optional": true + }, + { + "name": "fiscal_year", + "type": "int", + "description": "The fiscal year of the fiscal period.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "filing_date", + "type": "date", + "description": "The date when the filing was made.", + "default": null, + "optional": true + }, + { + "name": "accepted_date", + "type": "datetime", + "description": "The date and time when the filing was accepted.", + "default": null, + "optional": true + }, + { + "name": "reported_currency", + "type": "str", + "description": "The currency in which the balance sheet was reported.", + "default": null, + "optional": true + }, + { + "name": "revenue", + "type": "float", + "description": "Total revenue.", + "default": null, + "optional": true + }, + { + "name": "cost_of_revenue", + "type": "float", + "description": "Cost of revenue.", + "default": null, + "optional": true + }, + { + "name": "gross_profit", + "type": "float", + "description": "Gross profit.", + "default": null, + "optional": true + }, + { + "name": "gross_profit_margin", + "type": "float", + "description": "Gross profit margin.", + "default": null, + "optional": true + }, + { + "name": "general_and_admin_expense", + "type": "float", + "description": "General and administrative expenses.", + "default": null, + "optional": true + }, + { + "name": "research_and_development_expense", + "type": "float", + "description": "Research and development expenses.", + "default": null, + "optional": true + }, + { + "name": "selling_and_marketing_expense", + "type": "float", + "description": "Selling and marketing expenses.", + "default": null, + "optional": true + }, + { + "name": "selling_general_and_admin_expense", + "type": "float", + "description": "Selling, general and administrative expenses.", + "default": null, + "optional": true + }, + { + "name": "other_expenses", + "type": "float", + "description": "Other expenses.", + "default": null, + "optional": true + }, + { + "name": "total_operating_expenses", + "type": "float", + "description": "Total operating expenses.", + "default": null, + "optional": true + }, + { + "name": "cost_and_expenses", + "type": "float", + "description": "Cost and expenses.", + "default": null, + "optional": true + }, + { + "name": "interest_income", + "type": "float", + "description": "Interest income.", + "default": null, + "optional": true + }, + { + "name": "total_interest_expense", + "type": "float", + "description": "Total interest expenses.", + "default": null, + "optional": true + }, + { + "name": "depreciation_and_amortization", + "type": "float", + "description": "Depreciation and amortization.", + "default": null, + "optional": true + }, + { + "name": "ebitda", + "type": "float", + "description": "EBITDA.", + "default": null, + "optional": true + }, + { + "name": "ebitda_margin", + "type": "float", + "description": "EBITDA margin.", + "default": null, + "optional": true + }, + { + "name": "total_operating_income", + "type": "float", + "description": "Total operating income.", + "default": null, + "optional": true + }, + { + "name": "operating_income_margin", + "type": "float", + "description": "Operating income margin.", + "default": null, + "optional": true + }, + { + "name": "total_other_income_expenses", + "type": "float", + "description": "Total other income and expenses.", + "default": null, + "optional": true + }, + { + "name": "total_pre_tax_income", + "type": "float", + "description": "Total pre-tax income.", + "default": null, + "optional": true + }, + { + "name": "pre_tax_income_margin", + "type": "float", + "description": "Pre-tax income margin.", + "default": null, + "optional": true + }, + { + "name": "income_tax_expense", + "type": "float", + "description": "Income tax expense.", + "default": null, + "optional": true + }, + { + "name": "consolidated_net_income", + "type": "float", + "description": "Consolidated net income.", + "default": null, + "optional": true + }, + { + "name": "net_income_margin", + "type": "float", + "description": "Net income margin.", + "default": null, + "optional": true + }, + { + "name": "basic_earnings_per_share", + "type": "float", + "description": "Basic earnings per share.", + "default": null, + "optional": true + }, + { + "name": "diluted_earnings_per_share", + "type": "float", + "description": "Diluted earnings per share.", + "default": null, + "optional": true + }, + { + "name": "weighted_average_basic_shares_outstanding", + "type": "float", + "description": "Weighted average basic shares outstanding.", + "default": null, + "optional": true + }, + { + "name": "weighted_average_diluted_shares_outstanding", + "type": "float", + "description": "Weighted average diluted shares outstanding.", + "default": null, + "optional": true + }, + { + "name": "link", + "type": "str", + "description": "Link to the filing.", + "default": null, + "optional": true + }, + { + "name": "final_link", + "type": "str", + "description": "Link to the filing document.", + "default": null, + "optional": true + } + ], + "intrinio": [ + { + "name": "reported_currency", + "type": "str", + "description": "The currency in which the balance sheet is reported.", + "default": null, + "optional": true + }, + { + "name": "revenue", + "type": "float", + "description": "Total revenue", + "default": null, + "optional": true + }, + { + "name": "operating_revenue", + "type": "float", + "description": "Total operating revenue", + "default": null, + "optional": true + }, + { + "name": "cost_of_revenue", + "type": "float", + "description": "Total cost of revenue", + "default": null, + "optional": true + }, + { + "name": "operating_cost_of_revenue", + "type": "float", + "description": "Total operating cost of revenue", + "default": null, + "optional": true + }, + { + "name": "gross_profit", + "type": "float", + "description": "Total gross profit", + "default": null, + "optional": true + }, + { + "name": "gross_profit_margin", + "type": "float", + "description": "Gross margin ratio.", + "default": null, + "optional": true + }, + { + "name": "provision_for_credit_losses", + "type": "float", + "description": "Provision for credit losses", + "default": null, + "optional": true + }, + { + "name": "research_and_development_expense", + "type": "float", + "description": "Research and development expense", + "default": null, + "optional": true + }, + { + "name": "selling_general_and_admin_expense", + "type": "float", + "description": "Selling, general, and admin expense", + "default": null, + "optional": true + }, + { + "name": "salaries_and_employee_benefits", + "type": "float", + "description": "Salaries and employee benefits", + "default": null, + "optional": true + }, + { + "name": "marketing_expense", + "type": "float", + "description": "Marketing expense", + "default": null, + "optional": true + }, + { + "name": "net_occupancy_and_equipment_expense", + "type": "float", + "description": "Net occupancy and equipment expense", + "default": null, + "optional": true + }, + { + "name": "other_operating_expenses", + "type": "float", + "description": "Other operating expenses", + "default": null, + "optional": true + }, + { + "name": "depreciation_expense", + "type": "float", + "description": "Depreciation expense", + "default": null, + "optional": true + }, + { + "name": "amortization_expense", + "type": "float", + "description": "Amortization expense", + "default": null, + "optional": true + }, + { + "name": "amortization_of_deferred_policy_acquisition_costs", + "type": "float", + "description": "Amortization of deferred policy acquisition costs", + "default": null, + "optional": true + }, + { + "name": "exploration_expense", + "type": "float", + "description": "Exploration expense", + "default": null, + "optional": true + }, + { + "name": "depletion_expense", + "type": "float", + "description": "Depletion expense", + "default": null, + "optional": true + }, + { + "name": "total_operating_expenses", + "type": "float", + "description": "Total operating expenses", + "default": null, + "optional": true + }, + { + "name": "total_operating_income", + "type": "float", + "description": "Total operating income", + "default": null, + "optional": true + }, + { + "name": "deposits_and_money_market_investments_interest_income", + "type": "float", + "description": "Deposits and money market investments interest income", + "default": null, + "optional": true + }, + { + "name": "federal_funds_sold_and_securities_borrowed_interest_income", + "type": "float", + "description": "Federal funds sold and securities borrowed interest income", + "default": null, + "optional": true + }, + { + "name": "investment_securities_interest_income", + "type": "float", + "description": "Investment securities interest income", + "default": null, + "optional": true + }, + { + "name": "loans_and_leases_interest_income", + "type": "float", + "description": "Loans and leases interest income", + "default": null, + "optional": true + }, + { + "name": "trading_account_interest_income", + "type": "float", + "description": "Trading account interest income", + "default": null, + "optional": true + }, + { + "name": "other_interest_income", + "type": "float", + "description": "Other interest income", + "default": null, + "optional": true + }, + { + "name": "total_non_interest_income", + "type": "float", + "description": "Total non-interest income", + "default": null, + "optional": true + }, + { + "name": "interest_and_investment_income", + "type": "float", + "description": "Interest and investment income", + "default": null, + "optional": true + }, + { + "name": "short_term_borrowings_interest_expense", + "type": "float", + "description": "Short-term borrowings interest expense", + "default": null, + "optional": true + }, + { + "name": "long_term_debt_interest_expense", + "type": "float", + "description": "Long-term debt interest expense", + "default": null, + "optional": true + }, + { + "name": "capitalized_lease_obligations_interest_expense", + "type": "float", + "description": "Capitalized lease obligations interest expense", + "default": null, + "optional": true + }, + { + "name": "deposits_interest_expense", + "type": "float", + "description": "Deposits interest expense", + "default": null, + "optional": true + }, + { + "name": "federal_funds_purchased_and_securities_sold_interest_expense", + "type": "float", + "description": "Federal funds purchased and securities sold interest expense", + "default": null, + "optional": true + }, + { + "name": "other_interest_expense", + "type": "float", + "description": "Other interest expense", + "default": null, + "optional": true + }, + { + "name": "total_interest_expense", + "type": "float", + "description": "Total interest expense", + "default": null, + "optional": true + }, + { + "name": "net_interest_income", + "type": "float", + "description": "Net interest income", + "default": null, + "optional": true + }, + { + "name": "other_non_interest_income", + "type": "float", + "description": "Other non-interest income", + "default": null, + "optional": true + }, + { + "name": "investment_banking_income", + "type": "float", + "description": "Investment banking income", + "default": null, + "optional": true + }, + { + "name": "trust_fees_by_commissions", + "type": "float", + "description": "Trust fees by commissions", + "default": null, + "optional": true + }, + { + "name": "premiums_earned", + "type": "float", + "description": "Premiums earned", + "default": null, + "optional": true + }, + { + "name": "insurance_policy_acquisition_costs", + "type": "float", + "description": "Insurance policy acquisition costs", + "default": null, + "optional": true + }, + { + "name": "current_and_future_benefits", + "type": "float", + "description": "Current and future benefits", + "default": null, + "optional": true + }, + { + "name": "property_and_liability_insurance_claims", + "type": "float", + "description": "Property and liability insurance claims", + "default": null, + "optional": true + }, + { + "name": "total_non_interest_expense", + "type": "float", + "description": "Total non-interest expense", + "default": null, + "optional": true + }, + { + "name": "net_realized_and_unrealized_capital_gains_on_investments", + "type": "float", + "description": "Net realized and unrealized capital gains on investments", + "default": null, + "optional": true + }, + { + "name": "other_gains", + "type": "float", + "description": "Other gains", + "default": null, + "optional": true + }, + { + "name": "non_operating_income", + "type": "float", + "description": "Non-operating income", + "default": null, + "optional": true + }, + { + "name": "other_income", + "type": "float", + "description": "Other income", + "default": null, + "optional": true + }, + { + "name": "other_revenue", + "type": "float", + "description": "Other revenue", + "default": null, + "optional": true + }, + { + "name": "extraordinary_income", + "type": "float", + "description": "Extraordinary income", + "default": null, + "optional": true + }, + { + "name": "total_other_income", + "type": "float", + "description": "Total other income", + "default": null, + "optional": true + }, + { + "name": "ebitda", + "type": "float", + "description": "Earnings Before Interest, Taxes, Depreciation and Amortization.", + "default": null, + "optional": true + }, + { + "name": "ebitda_margin", + "type": "float", + "description": "Margin on Earnings Before Interest, Taxes, Depreciation and Amortization.", + "default": null, + "optional": true + }, + { + "name": "total_pre_tax_income", + "type": "float", + "description": "Total pre-tax income", + "default": null, + "optional": true + }, + { + "name": "ebit", + "type": "float", + "description": "Earnings Before Interest and Taxes.", + "default": null, + "optional": true + }, + { + "name": "pre_tax_income_margin", + "type": "float", + "description": "Pre-Tax Income Margin.", + "default": null, + "optional": true + }, + { + "name": "income_tax_expense", + "type": "float", + "description": "Income tax expense", + "default": null, + "optional": true + }, + { + "name": "impairment_charge", + "type": "float", + "description": "Impairment charge", + "default": null, + "optional": true + }, + { + "name": "restructuring_charge", + "type": "float", + "description": "Restructuring charge", + "default": null, + "optional": true + }, + { + "name": "service_charges_on_deposit_accounts", + "type": "float", + "description": "Service charges on deposit accounts", + "default": null, + "optional": true + }, + { + "name": "other_service_charges", + "type": "float", + "description": "Other service charges", + "default": null, + "optional": true + }, + { + "name": "other_special_charges", + "type": "float", + "description": "Other special charges", + "default": null, + "optional": true + }, + { + "name": "other_cost_of_revenue", + "type": "float", + "description": "Other cost of revenue", + "default": null, + "optional": true + }, + { + "name": "net_income_continuing_operations", + "type": "float", + "description": "Net income (continuing operations)", + "default": null, + "optional": true + }, + { + "name": "net_income_discontinued_operations", + "type": "float", + "description": "Net income (discontinued operations)", + "default": null, + "optional": true + }, + { + "name": "consolidated_net_income", + "type": "float", + "description": "Consolidated net income", + "default": null, + "optional": true + }, + { + "name": "other_adjustments_to_consolidated_net_income", + "type": "float", + "description": "Other adjustments to consolidated net income", + "default": null, + "optional": true + }, + { + "name": "other_adjustment_to_net_income_attributable_to_common_shareholders", + "type": "float", + "description": "Other adjustment to net income attributable to common shareholders", + "default": null, + "optional": true + }, + { + "name": "net_income_attributable_to_noncontrolling_interest", + "type": "float", + "description": "Net income attributable to noncontrolling interest", + "default": null, + "optional": true + }, + { + "name": "net_income_attributable_to_common_shareholders", + "type": "float", + "description": "Net income attributable to common shareholders", + "default": null, + "optional": true + }, + { + "name": "basic_earnings_per_share", + "type": "float", + "description": "Basic earnings per share", + "default": null, + "optional": true + }, + { + "name": "diluted_earnings_per_share", + "type": "float", + "description": "Diluted earnings per share", + "default": null, + "optional": true + }, + { + "name": "basic_and_diluted_earnings_per_share", + "type": "float", + "description": "Basic and diluted earnings per share", + "default": null, + "optional": true + }, + { + "name": "cash_dividends_to_common_per_share", + "type": "float", + "description": "Cash dividends to common per share", + "default": null, + "optional": true + }, + { + "name": "preferred_stock_dividends_declared", + "type": "float", + "description": "Preferred stock dividends declared", + "default": null, + "optional": true + }, + { + "name": "weighted_average_basic_shares_outstanding", + "type": "float", + "description": "Weighted average basic shares outstanding", + "default": null, + "optional": true + }, + { + "name": "weighted_average_diluted_shares_outstanding", + "type": "float", + "description": "Weighted average diluted shares outstanding", + "default": null, + "optional": true + }, + { + "name": "weighted_average_basic_and_diluted_shares_outstanding", + "type": "float", + "description": "Weighted average basic and diluted shares outstanding", + "default": null, + "optional": true + } + ], + "polygon": [ + { + "name": "revenue", + "type": "float", + "description": "Total Revenue", + "default": null, + "optional": true + }, + { + "name": "cost_of_revenue_goods", + "type": "float", + "description": "Cost of Revenue - Goods", + "default": null, + "optional": true + }, + { + "name": "cost_of_revenue_services", + "type": "float", + "description": "Cost of Revenue - Services", + "default": null, + "optional": true + }, + { + "name": "cost_of_revenue", + "type": "float", + "description": "Cost of Revenue", + "default": null, + "optional": true + }, + { + "name": "gross_profit", + "type": "float", + "description": "Gross Profit", + "default": null, + "optional": true + }, + { + "name": "provisions_for_loan_lease_and_other_losses", + "type": "float", + "description": "Provisions for loan lease and other losses", + "default": null, + "optional": true + }, + { + "name": "depreciation_and_amortization", + "type": "float", + "description": "Depreciation and Amortization", + "default": null, + "optional": true + }, + { + "name": "income_tax_expense_benefit_current", + "type": "float", + "description": "Income tax expense benefit current", + "default": null, + "optional": true + }, + { + "name": "deferred_tax_benefit", + "type": "float", + "description": "Deferred tax benefit", + "default": null, + "optional": true + }, + { + "name": "benefits_costs_expenses", + "type": "float", + "description": "Benefits, costs and expenses", + "default": null, + "optional": true + }, + { + "name": "selling_general_and_administrative_expense", + "type": "float", + "description": "Selling, general and administrative expense", + "default": null, + "optional": true + }, + { + "name": "research_and_development", + "type": "float", + "description": "Research and development", + "default": null, + "optional": true + }, + { + "name": "costs_and_expenses", + "type": "float", + "description": "Costs and expenses", + "default": null, + "optional": true + }, + { + "name": "other_operating_expenses", + "type": "float", + "description": "Other Operating Expenses", + "default": null, + "optional": true + }, + { + "name": "operating_expenses", + "type": "float", + "description": "Operating expenses", + "default": null, + "optional": true + }, + { + "name": "operating_income", + "type": "float", + "description": "Operating Income/Loss", + "default": null, + "optional": true + }, + { + "name": "non_operating_income", + "type": "float", + "description": "Non Operating Income/Loss", + "default": null, + "optional": true + }, + { + "name": "interest_and_dividend_income", + "type": "float", + "description": "Interest and Dividend Income", + "default": null, + "optional": true + }, + { + "name": "total_interest_expense", + "type": "float", + "description": "Interest Expense", + "default": null, + "optional": true + }, + { + "name": "interest_and_debt_expense", + "type": "float", + "description": "Interest and Debt Expense", + "default": null, + "optional": true + }, + { + "name": "net_interest_income", + "type": "float", + "description": "Interest Income Net", + "default": null, + "optional": true + }, + { + "name": "interest_income_after_provision_for_losses", + "type": "float", + "description": "Interest Income After Provision for Losses", + "default": null, + "optional": true + }, + { + "name": "non_interest_expense", + "type": "float", + "description": "Non-Interest Expense", + "default": null, + "optional": true + }, + { + "name": "non_interest_income", + "type": "float", + "description": "Non-Interest Income", + "default": null, + "optional": true + }, + { + "name": "income_from_discontinued_operations_net_of_tax_on_disposal", + "type": "float", + "description": "Income From Discontinued Operations Net of Tax on Disposal", + "default": null, + "optional": true + }, + { + "name": "income_from_discontinued_operations_net_of_tax", + "type": "float", + "description": "Income From Discontinued Operations Net of Tax", + "default": null, + "optional": true + }, + { + "name": "income_before_equity_method_investments", + "type": "float", + "description": "Income Before Equity Method Investments", + "default": null, + "optional": true + }, + { + "name": "income_from_equity_method_investments", + "type": "float", + "description": "Income From Equity Method Investments", + "default": null, + "optional": true + }, + { + "name": "total_pre_tax_income", + "type": "float", + "description": "Income Before Tax", + "default": null, + "optional": true + }, + { + "name": "income_tax_expense", + "type": "float", + "description": "Income Tax Expense", + "default": null, + "optional": true + }, + { + "name": "income_after_tax", + "type": "float", + "description": "Income After Tax", + "default": null, + "optional": true + }, + { + "name": "consolidated_net_income", + "type": "float", + "description": "Net Income/Loss", + "default": null, + "optional": true + }, + { + "name": "net_income_attributable_noncontrolling_interest", + "type": "float", + "description": "Net income (loss) attributable to noncontrolling interest", + "default": null, + "optional": true + }, + { + "name": "net_income_attributable_to_parent", + "type": "float", + "description": "Net income (loss) attributable to parent", + "default": null, + "optional": true + }, + { + "name": "net_income_attributable_to_common_shareholders", + "type": "float", + "description": "Net Income/Loss Available To Common Stockholders Basic", + "default": null, + "optional": true + }, + { + "name": "participating_securities_earnings", + "type": "float", + "description": "Participating Securities Distributed And Undistributed Earnings Loss Basic", + "default": null, + "optional": true + }, + { + "name": "undistributed_earnings_allocated_to_participating_securities", + "type": "float", + "description": "Undistributed Earnings Allocated To Participating Securities", + "default": null, + "optional": true + }, + { + "name": "common_stock_dividends", + "type": "float", + "description": "Common Stock Dividends", + "default": null, + "optional": true + }, + { + "name": "preferred_stock_dividends_and_other_adjustments", + "type": "float", + "description": "Preferred stock dividends and other adjustments", + "default": null, + "optional": true + }, + { + "name": "basic_earnings_per_share", + "type": "float", + "description": "Earnings Per Share", + "default": null, + "optional": true + }, + { + "name": "diluted_earnings_per_share", + "type": "float", + "description": "Diluted Earnings Per Share", + "default": null, + "optional": true + }, + { + "name": "weighted_average_basic_shares_outstanding", + "type": "float", + "description": "Basic Average Shares", + "default": null, + "optional": true + }, + { + "name": "weighted_average_diluted_shares_outstanding", + "type": "float", + "description": "Diluted Average Shares", + "default": null, + "optional": true + } + ], + "yfinance": [] + }, + "model": "IncomeStatement" + }, + "/equity/fundamental/income_growth": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the growth of a company's income statement items over time.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.income_growth(symbol='AAPL', provider='fmp')\nobb.equity.fundamental.income_growth(symbol='AAPL', limit=10, period='annual', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": 10, + "optional": true + }, + { + "name": "period", + "type": "Literal['annual', 'quarter']", + "description": "Time period of the data to return.", + "default": "annual", + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[IncomeStatementGrowth]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": null, + "optional": true + }, + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "period", + "type": "str", + "description": "Period the statement is returned for.", + "default": "", + "optional": false + }, + { + "name": "growth_revenue", + "type": "float", + "description": "Growth rate of total revenue.", + "default": "", + "optional": false + }, + { + "name": "growth_cost_of_revenue", + "type": "float", + "description": "Growth rate of cost of goods sold.", + "default": "", + "optional": false + }, + { + "name": "growth_gross_profit", + "type": "float", + "description": "Growth rate of gross profit.", + "default": "", + "optional": false + }, + { + "name": "growth_gross_profit_ratio", + "type": "float", + "description": "Growth rate of gross profit as a percentage of revenue.", + "default": "", + "optional": false + }, + { + "name": "growth_research_and_development_expenses", + "type": "float", + "description": "Growth rate of expenses on research and development.", + "default": "", + "optional": false + }, + { + "name": "growth_general_and_administrative_expenses", + "type": "float", + "description": "Growth rate of general and administrative expenses.", + "default": "", + "optional": false + }, + { + "name": "growth_selling_and_marketing_expenses", + "type": "float", + "description": "Growth rate of expenses on selling and marketing activities.", + "default": "", + "optional": false + }, + { + "name": "growth_other_expenses", + "type": "float", + "description": "Growth rate of other operating expenses.", + "default": "", + "optional": false + }, + { + "name": "growth_operating_expenses", + "type": "float", + "description": "Growth rate of total operating expenses.", + "default": "", + "optional": false + }, + { + "name": "growth_cost_and_expenses", + "type": "float", + "description": "Growth rate of total costs and expenses.", + "default": "", + "optional": false + }, + { + "name": "growth_interest_expense", + "type": "float", + "description": "Growth rate of interest expenses.", + "default": "", + "optional": false + }, + { + "name": "growth_depreciation_and_amortization", + "type": "float", + "description": "Growth rate of depreciation and amortization expenses.", + "default": "", + "optional": false + }, + { + "name": "growth_ebitda", + "type": "float", + "description": "Growth rate of Earnings Before Interest, Taxes, Depreciation, and Amortization.", + "default": "", + "optional": false + }, + { + "name": "growth_ebitda_ratio", + "type": "float", + "description": "Growth rate of EBITDA as a percentage of revenue.", + "default": "", + "optional": false + }, + { + "name": "growth_operating_income", + "type": "float", + "description": "Growth rate of operating income.", + "default": "", + "optional": false + }, + { + "name": "growth_operating_income_ratio", + "type": "float", + "description": "Growth rate of operating income as a percentage of revenue.", + "default": "", + "optional": false + }, + { + "name": "growth_total_other_income_expenses_net", + "type": "float", + "description": "Growth rate of net total other income and expenses.", + "default": "", + "optional": false + }, + { + "name": "growth_income_before_tax", + "type": "float", + "description": "Growth rate of income before taxes.", + "default": "", + "optional": false + }, + { + "name": "growth_income_before_tax_ratio", + "type": "float", + "description": "Growth rate of income before taxes as a percentage of revenue.", + "default": "", + "optional": false + }, + { + "name": "growth_income_tax_expense", + "type": "float", + "description": "Growth rate of income tax expenses.", + "default": "", + "optional": false + }, + { + "name": "growth_net_income", + "type": "float", + "description": "Growth rate of net income.", + "default": "", + "optional": false + }, + { + "name": "growth_net_income_ratio", + "type": "float", + "description": "Growth rate of net income as a percentage of revenue.", + "default": "", + "optional": false + }, + { + "name": "growth_eps", + "type": "float", + "description": "Growth rate of Earnings Per Share (EPS).", + "default": "", + "optional": false + }, + { + "name": "growth_eps_diluted", + "type": "float", + "description": "Growth rate of diluted Earnings Per Share (EPS).", + "default": "", + "optional": false + }, + { + "name": "growth_weighted_average_shs_out", + "type": "float", + "description": "Growth rate of weighted average shares outstanding.", + "default": "", + "optional": false + }, + { + "name": "growth_weighted_average_shs_out_dil", + "type": "float", + "description": "Growth rate of diluted weighted average shares outstanding.", + "default": "", + "optional": false + } + ], + "fmp": [] + }, + "model": "IncomeStatementGrowth" + }, + "/equity/fundamental/metrics": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get fundamental metrics for a given company.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.metrics(symbol='AAPL', provider='fmp')\nobb.equity.fundamental.metrics(symbol='AAPL', period='annual', limit=100, provider='intrinio')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio, yfinance.", + "default": "", + "optional": false + }, + { + "name": "period", + "type": "Literal['annual', 'quarter']", + "description": "Time period of the data to return.", + "default": "annual", + "optional": true + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": 100, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp', 'intrinio', 'yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [ + { + "name": "with_ttm", + "type": "bool", + "description": "Include trailing twelve months (TTM) data.", + "default": false, + "optional": true + } + ], + "intrinio": [], + "yfinance": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[KeyMetrics]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'intrinio', 'yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": null, + "optional": true + }, + { + "name": "market_cap", + "type": "float", + "description": "Market capitalization", + "default": null, + "optional": true + }, + { + "name": "pe_ratio", + "type": "float", + "description": "Price-to-earnings ratio (P/E ratio)", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "period", + "type": "str", + "description": "Period of the data.", + "default": "", + "optional": false + }, + { + "name": "calendar_year", + "type": "int", + "description": "Calendar year.", + "default": null, + "optional": true + }, + { + "name": "revenue_per_share", + "type": "float", + "description": "Revenue per share", + "default": null, + "optional": true + }, + { + "name": "net_income_per_share", + "type": "float", + "description": "Net income per share", + "default": null, + "optional": true + }, + { + "name": "operating_cash_flow_per_share", + "type": "float", + "description": "Operating cash flow per share", + "default": null, + "optional": true + }, + { + "name": "free_cash_flow_per_share", + "type": "float", + "description": "Free cash flow per share", + "default": null, + "optional": true + }, + { + "name": "cash_per_share", + "type": "float", + "description": "Cash per share", + "default": null, + "optional": true + }, + { + "name": "book_value_per_share", + "type": "float", + "description": "Book value per share", + "default": null, + "optional": true + }, + { + "name": "tangible_book_value_per_share", + "type": "float", + "description": "Tangible book value per share", + "default": null, + "optional": true + }, + { + "name": "shareholders_equity_per_share", + "type": "float", + "description": "Shareholders equity per share", + "default": null, + "optional": true + }, + { + "name": "interest_debt_per_share", + "type": "float", + "description": "Interest debt per share", + "default": null, + "optional": true + }, + { + "name": "enterprise_value", + "type": "float", + "description": "Enterprise value", + "default": null, + "optional": true + }, + { + "name": "price_to_sales_ratio", + "type": "float", + "description": "Price-to-sales ratio", + "default": null, + "optional": true + }, + { + "name": "pocf_ratio", + "type": "float", + "description": "Price-to-operating cash flow ratio", + "default": null, + "optional": true + }, + { + "name": "pfcf_ratio", + "type": "float", + "description": "Price-to-free cash flow ratio", + "default": null, + "optional": true + }, + { + "name": "pb_ratio", + "type": "float", + "description": "Price-to-book ratio", + "default": null, + "optional": true + }, + { + "name": "ptb_ratio", + "type": "float", + "description": "Price-to-tangible book ratio", + "default": null, + "optional": true + }, + { + "name": "ev_to_sales", + "type": "float", + "description": "Enterprise value-to-sales ratio", + "default": null, + "optional": true + }, + { + "name": "enterprise_value_over_ebitda", + "type": "float", + "description": "Enterprise value-to-EBITDA ratio", + "default": null, + "optional": true + }, + { + "name": "ev_to_operating_cash_flow", + "type": "float", + "description": "Enterprise value-to-operating cash flow ratio", + "default": null, + "optional": true + }, + { + "name": "ev_to_free_cash_flow", + "type": "float", + "description": "Enterprise value-to-free cash flow ratio", + "default": null, + "optional": true + }, + { + "name": "earnings_yield", + "type": "float", + "description": "Earnings yield", + "default": null, + "optional": true + }, + { + "name": "free_cash_flow_yield", + "type": "float", + "description": "Free cash flow yield", + "default": null, + "optional": true + }, + { + "name": "debt_to_equity", + "type": "float", + "description": "Debt-to-equity ratio", + "default": null, + "optional": true + }, + { + "name": "debt_to_assets", + "type": "float", + "description": "Debt-to-assets ratio", + "default": null, + "optional": true + }, + { + "name": "net_debt_to_ebitda", + "type": "float", + "description": "Net debt-to-EBITDA ratio", + "default": null, + "optional": true + }, + { + "name": "current_ratio", + "type": "float", + "description": "Current ratio", + "default": null, + "optional": true + }, + { + "name": "interest_coverage", + "type": "float", + "description": "Interest coverage", + "default": null, + "optional": true + }, + { + "name": "income_quality", + "type": "float", + "description": "Income quality", + "default": null, + "optional": true + }, + { + "name": "dividend_yield", + "type": "float", + "description": "Dividend yield, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "payout_ratio", + "type": "float", + "description": "Payout ratio", + "default": null, + "optional": true + }, + { + "name": "sales_general_and_administrative_to_revenue", + "type": "float", + "description": "Sales general and administrative expenses-to-revenue ratio", + "default": null, + "optional": true + }, + { + "name": "research_and_development_to_revenue", + "type": "float", + "description": "Research and development expenses-to-revenue ratio", + "default": null, + "optional": true + }, + { + "name": "intangibles_to_total_assets", + "type": "float", + "description": "Intangibles-to-total assets ratio", + "default": null, + "optional": true + }, + { + "name": "capex_to_operating_cash_flow", + "type": "float", + "description": "Capital expenditures-to-operating cash flow ratio", + "default": null, + "optional": true + }, + { + "name": "capex_to_revenue", + "type": "float", + "description": "Capital expenditures-to-revenue ratio", + "default": null, + "optional": true + }, + { + "name": "capex_to_depreciation", + "type": "float", + "description": "Capital expenditures-to-depreciation ratio", + "default": null, + "optional": true + }, + { + "name": "stock_based_compensation_to_revenue", + "type": "float", + "description": "Stock-based compensation-to-revenue ratio", + "default": null, + "optional": true + }, + { + "name": "graham_number", + "type": "float", + "description": "Graham number", + "default": null, + "optional": true + }, + { + "name": "roic", + "type": "float", + "description": "Return on invested capital", + "default": null, + "optional": true + }, + { + "name": "return_on_tangible_assets", + "type": "float", + "description": "Return on tangible assets", + "default": null, + "optional": true + }, + { + "name": "graham_net_net", + "type": "float", + "description": "Graham net-net working capital", + "default": null, + "optional": true + }, + { + "name": "working_capital", + "type": "float", + "description": "Working capital", + "default": null, + "optional": true + }, + { + "name": "tangible_asset_value", + "type": "float", + "description": "Tangible asset value", + "default": null, + "optional": true + }, + { + "name": "net_current_asset_value", + "type": "float", + "description": "Net current asset value", + "default": null, + "optional": true + }, + { + "name": "invested_capital", + "type": "float", + "description": "Invested capital", + "default": null, + "optional": true + }, + { + "name": "average_receivables", + "type": "float", + "description": "Average receivables", + "default": null, + "optional": true + }, + { + "name": "average_payables", + "type": "float", + "description": "Average payables", + "default": null, + "optional": true + }, + { + "name": "average_inventory", + "type": "float", + "description": "Average inventory", + "default": null, + "optional": true + }, + { + "name": "days_sales_outstanding", + "type": "float", + "description": "Days sales outstanding", + "default": null, + "optional": true + }, + { + "name": "days_payables_outstanding", + "type": "float", + "description": "Days payables outstanding", + "default": null, + "optional": true + }, + { + "name": "days_of_inventory_on_hand", + "type": "float", + "description": "Days of inventory on hand", + "default": null, + "optional": true + }, + { + "name": "receivables_turnover", + "type": "float", + "description": "Receivables turnover", + "default": null, + "optional": true + }, + { + "name": "payables_turnover", + "type": "float", + "description": "Payables turnover", + "default": null, + "optional": true + }, + { + "name": "inventory_turnover", + "type": "float", + "description": "Inventory turnover", + "default": null, + "optional": true + }, + { + "name": "roe", + "type": "float", + "description": "Return on equity", + "default": null, + "optional": true + }, + { + "name": "capex_per_share", + "type": "float", + "description": "Capital expenditures per share", + "default": null, + "optional": true + } + ], + "intrinio": [ + { + "name": "price_to_book", + "type": "float", + "description": "Price to book ratio.", + "default": null, + "optional": true + }, + { + "name": "price_to_tangible_book", + "type": "float", + "description": "Price to tangible book ratio.", + "default": null, + "optional": true + }, + { + "name": "price_to_revenue", + "type": "float", + "description": "Price to revenue ratio.", + "default": null, + "optional": true + }, + { + "name": "quick_ratio", + "type": "float", + "description": "Quick ratio.", + "default": null, + "optional": true + }, + { + "name": "gross_margin", + "type": "float", + "description": "Gross margin, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "ebit_margin", + "type": "float", + "description": "EBIT margin, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "profit_margin", + "type": "float", + "description": "Profit margin, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "eps", + "type": "float", + "description": "Basic earnings per share.", + "default": null, + "optional": true + }, + { + "name": "eps_growth", + "type": "float", + "description": "EPS growth, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "revenue_growth", + "type": "float", + "description": "Revenue growth, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "ebitda_growth", + "type": "float", + "description": "EBITDA growth, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "ebit_growth", + "type": "float", + "description": "EBIT growth, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "net_income_growth", + "type": "float", + "description": "Net income growth, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "free_cash_flow_to_firm_growth", + "type": "float", + "description": "Free cash flow to firm growth, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "invested_capital_growth", + "type": "float", + "description": "Invested capital growth, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "return_on_assets", + "type": "float", + "description": "Return on assets, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "return_on_equity", + "type": "float", + "description": "Return on equity, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "return_on_invested_capital", + "type": "float", + "description": "Return on invested capital, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "ebitda", + "type": "int", + "description": "Earnings before interest, taxes, depreciation, and amortization.", + "default": null, + "optional": true + }, + { + "name": "ebit", + "type": "int", + "description": "Earnings before interest and taxes.", + "default": null, + "optional": true + }, + { + "name": "long_term_debt", + "type": "int", + "description": "Long-term debt.", + "default": null, + "optional": true + }, + { + "name": "total_debt", + "type": "int", + "description": "Total debt.", + "default": null, + "optional": true + }, + { + "name": "total_capital", + "type": "int", + "description": "The sum of long-term debt and total shareholder equity.", + "default": null, + "optional": true + }, + { + "name": "enterprise_value", + "type": "int", + "description": "Enterprise value.", + "default": null, + "optional": true + }, + { + "name": "free_cash_flow_to_firm", + "type": "int", + "description": "Free cash flow to firm.", + "default": null, + "optional": true + }, + { + "name": "altman_z_score", + "type": "float", + "description": "Altman Z-score.", + "default": null, + "optional": true + }, + { + "name": "beta", + "type": "float", + "description": "Beta relative to the broad market (rolling three-year).", + "default": null, + "optional": true + }, + { + "name": "dividend_yield", + "type": "float", + "description": "Dividend yield, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "earnings_yield", + "type": "float", + "description": "Earnings yield, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "last_price", + "type": "float", + "description": "Last price of the stock.", + "default": null, + "optional": true + }, + { + "name": "year_high", + "type": "float", + "description": "52 week high", + "default": null, + "optional": true + }, + { + "name": "year_low", + "type": "float", + "description": "52 week low", + "default": null, + "optional": true + }, + { + "name": "volume_avg", + "type": "int", + "description": "Average daily volume.", + "default": null, + "optional": true + }, + { + "name": "short_interest", + "type": "int", + "description": "Number of shares reported as sold short.", + "default": null, + "optional": true + }, + { + "name": "shares_outstanding", + "type": "int", + "description": "Weighted average shares outstanding (TTM).", + "default": null, + "optional": true + }, + { + "name": "days_to_cover", + "type": "float", + "description": "Days to cover short interest, based on average daily volume.", + "default": null, + "optional": true + } + ], + "yfinance": [ + { + "name": "forward_pe", + "type": "float", + "description": "Forward price-to-earnings ratio.", + "default": null, + "optional": true + }, + { + "name": "peg_ratio", + "type": "float", + "description": "PEG ratio (5-year expected).", + "default": null, + "optional": true + }, + { + "name": "peg_ratio_ttm", + "type": "float", + "description": "PEG ratio (TTM).", + "default": null, + "optional": true + }, + { + "name": "eps_ttm", + "type": "float", + "description": "Earnings per share (TTM).", + "default": null, + "optional": true + }, + { + "name": "eps_forward", + "type": "float", + "description": "Forward earnings per share.", + "default": null, + "optional": true + }, + { + "name": "enterprise_to_ebitda", + "type": "float", + "description": "Enterprise value to EBITDA ratio.", + "default": null, + "optional": true + }, + { + "name": "earnings_growth", + "type": "float", + "description": "Earnings growth (Year Over Year), as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "earnings_growth_quarterly", + "type": "float", + "description": "Quarterly earnings growth (Year Over Year), as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "revenue_per_share", + "type": "float", + "description": "Revenue per share (TTM).", + "default": null, + "optional": true + }, + { + "name": "revenue_growth", + "type": "float", + "description": "Revenue growth (Year Over Year), as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "enterprise_to_revenue", + "type": "float", + "description": "Enterprise value to revenue ratio.", + "default": null, + "optional": true + }, + { + "name": "cash_per_share", + "type": "float", + "description": "Cash per share.", + "default": null, + "optional": true + }, + { + "name": "quick_ratio", + "type": "float", + "description": "Quick ratio.", + "default": null, + "optional": true + }, + { + "name": "current_ratio", + "type": "float", + "description": "Current ratio.", + "default": null, + "optional": true + }, + { + "name": "debt_to_equity", + "type": "float", + "description": "Debt-to-equity ratio.", + "default": null, + "optional": true + }, + { + "name": "gross_margin", + "type": "float", + "description": "Gross margin, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "operating_margin", + "type": "float", + "description": "Operating margin, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "ebitda_margin", + "type": "float", + "description": "EBITDA margin, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "profit_margin", + "type": "float", + "description": "Profit margin, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "return_on_assets", + "type": "float", + "description": "Return on assets, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "return_on_equity", + "type": "float", + "description": "Return on equity, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "dividend_yield", + "type": "float", + "description": "Dividend yield, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "dividend_yield_5y_avg", + "type": "float", + "description": "5-year average dividend yield, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "payout_ratio", + "type": "float", + "description": "Payout ratio.", + "default": null, + "optional": true + }, + { + "name": "book_value", + "type": "float", + "description": "Book value per share.", + "default": null, + "optional": true + }, + { + "name": "price_to_book", + "type": "float", + "description": "Price-to-book ratio.", + "default": null, + "optional": true + }, + { + "name": "enterprise_value", + "type": "int", + "description": "Enterprise value.", + "default": null, + "optional": true + }, + { + "name": "overall_risk", + "type": "float", + "description": "Overall risk score.", + "default": null, + "optional": true + }, + { + "name": "audit_risk", + "type": "float", + "description": "Audit risk score.", + "default": null, + "optional": true + }, + { + "name": "board_risk", + "type": "float", + "description": "Board risk score.", + "default": null, + "optional": true + }, + { + "name": "compensation_risk", + "type": "float", + "description": "Compensation risk score.", + "default": null, + "optional": true + }, + { + "name": "shareholder_rights_risk", + "type": "float", + "description": "Shareholder rights risk score.", + "default": null, + "optional": true + }, + { + "name": "beta", + "type": "float", + "description": "Beta relative to the broad market (5-year monthly).", + "default": null, + "optional": true + }, + { + "name": "price_return_1y", + "type": "float", + "description": "One-year price return, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "currency", + "type": "str", + "description": "Currency in which the data is presented.", + "default": null, + "optional": true + } + ] + }, + "model": "KeyMetrics" + }, + "/equity/fundamental/management": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get executive management team data for a given company.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.management(symbol='AAPL', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['fmp', 'yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [], + "yfinance": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[KeyExecutives]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "title", + "type": "str", + "description": "Designation of the key executive.", + "default": "", + "optional": false + }, + { + "name": "name", + "type": "str", + "description": "Name of the key executive.", + "default": "", + "optional": false + }, + { + "name": "pay", + "type": "int", + "description": "Pay of the key executive.", + "default": null, + "optional": true + }, + { + "name": "currency_pay", + "type": "str", + "description": "Currency of the pay.", + "default": null, + "optional": true + }, + { + "name": "gender", + "type": "str", + "description": "Gender of the key executive.", + "default": null, + "optional": true + }, + { + "name": "year_born", + "type": "int", + "description": "Birth year of the key executive.", + "default": null, + "optional": true + }, + { + "name": "title_since", + "type": "int", + "description": "Date the tile was held since.", + "default": null, + "optional": true + } + ], + "fmp": [], + "yfinance": [ + { + "name": "exercised_value", + "type": "int", + "description": "Value of shares exercised.", + "default": null, + "optional": true + }, + { + "name": "unexercised_value", + "type": "int", + "description": "Value of shares not exercised.", + "default": null, + "optional": true + } + ] + }, + "model": "KeyExecutives" + }, + "/equity/fundamental/management_compensation": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get executive management team compensation for a given company over time.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.management_compensation(symbol='AAPL', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [ + { + "name": "year", + "type": "int", + "description": "Year of the compensation.", + "default": null, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[ExecutiveCompensation]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "cik", + "type": "str", + "description": "Central Index Key (CIK) for the requested entity.", + "default": null, + "optional": true + }, + { + "name": "company_name", + "type": "str", + "description": "The name of the company.", + "default": null, + "optional": true + }, + { + "name": "industry", + "type": "str", + "description": "The industry of the company.", + "default": null, + "optional": true + }, + { + "name": "year", + "type": "int", + "description": "Year of the compensation.", + "default": null, + "optional": true + }, + { + "name": "name_and_position", + "type": "str", + "description": "Name and position.", + "default": null, + "optional": true + }, + { + "name": "salary", + "type": "Annotated[float, Ge(ge=0)]", + "description": "Salary.", + "default": null, + "optional": true + }, + { + "name": "bonus", + "type": "Annotated[float, Ge(ge=0)]", + "description": "Bonus payments.", + "default": null, + "optional": true + }, + { + "name": "stock_award", + "type": "Annotated[float, Ge(ge=0)]", + "description": "Stock awards.", + "default": null, + "optional": true + }, + { + "name": "incentive_plan_compensation", + "type": "Annotated[float, Ge(ge=0)]", + "description": "Incentive plan compensation.", + "default": null, + "optional": true + }, + { + "name": "all_other_compensation", + "type": "Annotated[float, Ge(ge=0)]", + "description": "All other compensation.", + "default": null, + "optional": true + }, + { + "name": "total", + "type": "Annotated[float, Ge(ge=0)]", + "description": "Total compensation.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "filing_date", + "type": "date", + "description": "Date of the filing.", + "default": null, + "optional": true + }, + { + "name": "accepted_date", + "type": "datetime", + "description": "Date the filing was accepted.", + "default": null, + "optional": true + }, + { + "name": "url", + "type": "str", + "description": "URL to the filing data.", + "default": null, + "optional": true + } + ] + }, + "model": "ExecutiveCompensation" + }, + "/equity/fundamental/overview": { + "deprecated": { + "flag": true, + "message": "This endpoint is deprecated; use `/equity/profile` instead. Deprecated in OpenBB Platform V4.1 to be removed in V4.3." + }, + "description": "Get company general business and stock data for a given company.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.overview(symbol='AAPL', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[CompanyOverview]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "price", + "type": "float", + "description": "Price of the company.", + "default": null, + "optional": true + }, + { + "name": "beta", + "type": "float", + "description": "Beta of the company.", + "default": null, + "optional": true + }, + { + "name": "vol_avg", + "type": "int", + "description": "Volume average of the company.", + "default": null, + "optional": true + }, + { + "name": "mkt_cap", + "type": "int", + "description": "Market capitalization of the company.", + "default": null, + "optional": true + }, + { + "name": "last_div", + "type": "float", + "description": "Last dividend of the company.", + "default": null, + "optional": true + }, + { + "name": "range", + "type": "str", + "description": "Range of the company.", + "default": null, + "optional": true + }, + { + "name": "changes", + "type": "float", + "description": "Changes of the company.", + "default": null, + "optional": true + }, + { + "name": "company_name", + "type": "str", + "description": "Company name of the company.", + "default": null, + "optional": true + }, + { + "name": "currency", + "type": "str", + "description": "Currency of the company.", + "default": null, + "optional": true + }, + { + "name": "cik", + "type": "str", + "description": "Central Index Key (CIK) for the requested entity.", + "default": null, + "optional": true + }, + { + "name": "isin", + "type": "str", + "description": "ISIN of the company.", + "default": null, + "optional": true + }, + { + "name": "cusip", + "type": "str", + "description": "CUSIP of the company.", + "default": null, + "optional": true + }, + { + "name": "exchange", + "type": "str", + "description": "Exchange of the company.", + "default": null, + "optional": true + }, + { + "name": "exchange_short_name", + "type": "str", + "description": "Exchange short name of the company.", + "default": null, + "optional": true + }, + { + "name": "industry", + "type": "str", + "description": "Industry of the company.", + "default": null, + "optional": true + }, + { + "name": "website", + "type": "str", + "description": "Website of the company.", + "default": null, + "optional": true + }, + { + "name": "description", + "type": "str", + "description": "Description of the company.", + "default": null, + "optional": true + }, + { + "name": "ceo", + "type": "str", + "description": "CEO of the company.", + "default": null, + "optional": true + }, + { + "name": "sector", + "type": "str", + "description": "Sector of the company.", + "default": null, + "optional": true + }, + { + "name": "country", + "type": "str", + "description": "Country of the company.", + "default": null, + "optional": true + }, + { + "name": "full_time_employees", + "type": "str", + "description": "Full time employees of the company.", + "default": null, + "optional": true + }, + { + "name": "phone", + "type": "str", + "description": "Phone of the company.", + "default": null, + "optional": true + }, + { + "name": "address", + "type": "str", + "description": "Address of the company.", + "default": null, + "optional": true + }, + { + "name": "city", + "type": "str", + "description": "City of the company.", + "default": null, + "optional": true + }, + { + "name": "state", + "type": "str", + "description": "State of the company.", + "default": null, + "optional": true + }, + { + "name": "zip", + "type": "str", + "description": "Zip of the company.", + "default": null, + "optional": true + }, + { + "name": "dcf_diff", + "type": "float", + "description": "Discounted cash flow difference of the company.", + "default": null, + "optional": true + }, + { + "name": "dcf", + "type": "float", + "description": "Discounted cash flow of the company.", + "default": null, + "optional": true + }, + { + "name": "image", + "type": "str", + "description": "Image of the company.", + "default": null, + "optional": true + }, + { + "name": "ipo_date", + "type": "date", + "description": "IPO date of the company.", + "default": null, + "optional": true + }, + { + "name": "default_image", + "type": "bool", + "description": "If the image is the default image.", + "default": "", + "optional": false + }, + { + "name": "is_etf", + "type": "bool", + "description": "If the company is an ETF.", + "default": "", + "optional": false + }, + { + "name": "is_actively_trading", + "type": "bool", + "description": "If the company is actively trading.", + "default": "", + "optional": false + }, + { + "name": "is_adr", + "type": "bool", + "description": "If the company is an ADR.", + "default": "", + "optional": false + }, + { + "name": "is_fund", + "type": "bool", + "description": "If the company is a fund.", + "default": "", + "optional": false + } + ], + "fmp": [] + }, + "model": "CompanyOverview" + }, + "/equity/fundamental/ratios": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get an extensive set of financial and accounting ratios for a given company over time.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.ratios(symbol='AAPL', provider='fmp')\nobb.equity.fundamental.ratios(symbol='AAPL', period='annual', limit=12, provider='intrinio')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "period", + "type": "str", + "description": "Time period of the data to return.", + "default": "annual", + "optional": true + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": 12, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp', 'intrinio']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [], + "intrinio": [ + { + "name": "fiscal_year", + "type": "int", + "description": "The specific fiscal year. Reports do not go beyond 2008.", + "default": null, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[FinancialRatios]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'intrinio']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "period_ending", + "type": "str", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "fiscal_period", + "type": "str", + "description": "Period of the financial ratios.", + "default": "", + "optional": false + }, + { + "name": "fiscal_year", + "type": "int", + "description": "Fiscal year.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "current_ratio", + "type": "float", + "description": "Current ratio.", + "default": null, + "optional": true + }, + { + "name": "quick_ratio", + "type": "float", + "description": "Quick ratio.", + "default": null, + "optional": true + }, + { + "name": "cash_ratio", + "type": "float", + "description": "Cash ratio.", + "default": null, + "optional": true + }, + { + "name": "days_of_sales_outstanding", + "type": "float", + "description": "Days of sales outstanding.", + "default": null, + "optional": true + }, + { + "name": "days_of_inventory_outstanding", + "type": "float", + "description": "Days of inventory outstanding.", + "default": null, + "optional": true + }, + { + "name": "operating_cycle", + "type": "float", + "description": "Operating cycle.", + "default": null, + "optional": true + }, + { + "name": "days_of_payables_outstanding", + "type": "float", + "description": "Days of payables outstanding.", + "default": null, + "optional": true + }, + { + "name": "cash_conversion_cycle", + "type": "float", + "description": "Cash conversion cycle.", + "default": null, + "optional": true + }, + { + "name": "gross_profit_margin", + "type": "float", + "description": "Gross profit margin.", + "default": null, + "optional": true + }, + { + "name": "operating_profit_margin", + "type": "float", + "description": "Operating profit margin.", + "default": null, + "optional": true + }, + { + "name": "pretax_profit_margin", + "type": "float", + "description": "Pretax profit margin.", + "default": null, + "optional": true + }, + { + "name": "net_profit_margin", + "type": "float", + "description": "Net profit margin.", + "default": null, + "optional": true + }, + { + "name": "effective_tax_rate", + "type": "float", + "description": "Effective tax rate.", + "default": null, + "optional": true + }, + { + "name": "return_on_assets", + "type": "float", + "description": "Return on assets.", + "default": null, + "optional": true + }, + { + "name": "return_on_equity", + "type": "float", + "description": "Return on equity.", + "default": null, + "optional": true + }, + { + "name": "return_on_capital_employed", + "type": "float", + "description": "Return on capital employed.", + "default": null, + "optional": true + }, + { + "name": "net_income_per_ebt", + "type": "float", + "description": "Net income per EBT.", + "default": null, + "optional": true + }, + { + "name": "ebt_per_ebit", + "type": "float", + "description": "EBT per EBIT.", + "default": null, + "optional": true + }, + { + "name": "ebit_per_revenue", + "type": "float", + "description": "EBIT per revenue.", + "default": null, + "optional": true + }, + { + "name": "debt_ratio", + "type": "float", + "description": "Debt ratio.", + "default": null, + "optional": true + }, + { + "name": "debt_equity_ratio", + "type": "float", + "description": "Debt equity ratio.", + "default": null, + "optional": true + }, + { + "name": "long_term_debt_to_capitalization", + "type": "float", + "description": "Long term debt to capitalization.", + "default": null, + "optional": true + }, + { + "name": "total_debt_to_capitalization", + "type": "float", + "description": "Total debt to capitalization.", + "default": null, + "optional": true + }, + { + "name": "interest_coverage", + "type": "float", + "description": "Interest coverage.", + "default": null, + "optional": true + }, + { + "name": "cash_flow_to_debt_ratio", + "type": "float", + "description": "Cash flow to debt ratio.", + "default": null, + "optional": true + }, + { + "name": "company_equity_multiplier", + "type": "float", + "description": "Company equity multiplier.", + "default": null, + "optional": true + }, + { + "name": "receivables_turnover", + "type": "float", + "description": "Receivables turnover.", + "default": null, + "optional": true + }, + { + "name": "payables_turnover", + "type": "float", + "description": "Payables turnover.", + "default": null, + "optional": true + }, + { + "name": "inventory_turnover", + "type": "float", + "description": "Inventory turnover.", + "default": null, + "optional": true + }, + { + "name": "fixed_asset_turnover", + "type": "float", + "description": "Fixed asset turnover.", + "default": null, + "optional": true + }, + { + "name": "asset_turnover", + "type": "float", + "description": "Asset turnover.", + "default": null, + "optional": true + }, + { + "name": "operating_cash_flow_per_share", + "type": "float", + "description": "Operating cash flow per share.", + "default": null, + "optional": true + }, + { + "name": "free_cash_flow_per_share", + "type": "float", + "description": "Free cash flow per share.", + "default": null, + "optional": true + }, + { + "name": "cash_per_share", + "type": "float", + "description": "Cash per share.", + "default": null, + "optional": true + }, + { + "name": "payout_ratio", + "type": "float", + "description": "Payout ratio.", + "default": null, + "optional": true + }, + { + "name": "operating_cash_flow_sales_ratio", + "type": "float", + "description": "Operating cash flow sales ratio.", + "default": null, + "optional": true + }, + { + "name": "free_cash_flow_operating_cash_flow_ratio", + "type": "float", + "description": "Free cash flow operating cash flow ratio.", + "default": null, + "optional": true + }, + { + "name": "cash_flow_coverage_ratios", + "type": "float", + "description": "Cash flow coverage ratios.", + "default": null, + "optional": true + }, + { + "name": "short_term_coverage_ratios", + "type": "float", + "description": "Short term coverage ratios.", + "default": null, + "optional": true + }, + { + "name": "capital_expenditure_coverage_ratio", + "type": "float", + "description": "Capital expenditure coverage ratio.", + "default": null, + "optional": true + }, + { + "name": "dividend_paid_and_capex_coverage_ratio", + "type": "float", + "description": "Dividend paid and capex coverage ratio.", + "default": null, + "optional": true + }, + { + "name": "dividend_payout_ratio", + "type": "float", + "description": "Dividend payout ratio.", + "default": null, + "optional": true + }, + { + "name": "price_book_value_ratio", + "type": "float", + "description": "Price book value ratio.", + "default": null, + "optional": true + }, + { + "name": "price_to_book_ratio", + "type": "float", + "description": "Price to book ratio.", + "default": null, + "optional": true + }, + { + "name": "price_to_sales_ratio", + "type": "float", + "description": "Price to sales ratio.", + "default": null, + "optional": true + }, + { + "name": "price_earnings_ratio", + "type": "float", + "description": "Price earnings ratio.", + "default": null, + "optional": true + }, + { + "name": "price_to_free_cash_flows_ratio", + "type": "float", + "description": "Price to free cash flows ratio.", + "default": null, + "optional": true + }, + { + "name": "price_to_operating_cash_flows_ratio", + "type": "float", + "description": "Price to operating cash flows ratio.", + "default": null, + "optional": true + }, + { + "name": "price_cash_flow_ratio", + "type": "float", + "description": "Price cash flow ratio.", + "default": null, + "optional": true + }, + { + "name": "price_earnings_to_growth_ratio", + "type": "float", + "description": "Price earnings to growth ratio.", + "default": null, + "optional": true + }, + { + "name": "price_sales_ratio", + "type": "float", + "description": "Price sales ratio.", + "default": null, + "optional": true + }, + { + "name": "dividend_yield", + "type": "float", + "description": "Dividend yield.", + "default": null, + "optional": true + }, + { + "name": "dividend_yield_percentage", + "type": "float", + "description": "Dividend yield percentage.", + "default": null, + "optional": true + }, + { + "name": "dividend_per_share", + "type": "float", + "description": "Dividend per share.", + "default": null, + "optional": true + }, + { + "name": "enterprise_value_multiple", + "type": "float", + "description": "Enterprise value multiple.", + "default": null, + "optional": true + }, + { + "name": "price_fair_value", + "type": "float", + "description": "Price fair value.", + "default": null, + "optional": true + } + ], + "intrinio": [] + }, + "model": "FinancialRatios" + }, + "/equity/fundamental/revenue_per_geography": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the revenue geographic breakdown for a given company over time.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.revenue_per_geography(symbol='AAPL', provider='fmp')\nobb.equity.fundamental.revenue_per_geography(symbol='AAPL', period='annual', structure='flat', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "period", + "type": "Literal['quarter', 'annual']", + "description": "Time period of the data to return.", + "default": "annual", + "optional": true + }, + { + "name": "structure", + "type": "Literal['hierarchical', 'flat']", + "description": "Structure of the returned data.", + "default": "flat", + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[RevenueGeographic]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "period_ending", + "type": "date", + "description": "The end date of the reporting period.", + "default": "", + "optional": false + }, + { + "name": "fiscal_period", + "type": "str", + "description": "The fiscal period of the reporting period.", + "default": null, + "optional": true + }, + { + "name": "fiscal_year", + "type": "int", + "description": "The fiscal year of the reporting period.", + "default": null, + "optional": true + }, + { + "name": "filing_date", + "type": "date", + "description": "The filing date of the report.", + "default": null, + "optional": true + }, + { + "name": "geographic_segment", + "type": "int", + "description": "Dictionary of the revenue by geographic segment.", + "default": "", + "optional": false + } + ], + "fmp": [] + }, + "model": "RevenueGeographic" + }, + "/equity/fundamental/revenue_per_segment": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the revenue breakdown by business segment for a given company over time.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.revenue_per_segment(symbol='AAPL', provider='fmp')\nobb.equity.fundamental.revenue_per_segment(symbol='AAPL', period='annual', structure='flat', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "period", + "type": "Literal['quarter', 'annual']", + "description": "Time period of the data to return.", + "default": "annual", + "optional": true + }, + { + "name": "structure", + "type": "Literal['hierarchical', 'flat']", + "description": "Structure of the returned data.", + "default": "flat", + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[RevenueBusinessLine]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "period_ending", + "type": "date", + "description": "The end date of the reporting period.", + "default": "", + "optional": false + }, + { + "name": "fiscal_period", + "type": "str", + "description": "The fiscal period of the reporting period.", + "default": null, + "optional": true + }, + { + "name": "fiscal_year", + "type": "int", + "description": "The fiscal year of the reporting period.", + "default": null, + "optional": true + }, + { + "name": "filing_date", + "type": "date", + "description": "The filing date of the report.", + "default": null, + "optional": true + }, + { + "name": "business_line", + "type": "int", + "description": "Dictionary containing the revenue of the business line.", + "default": "", + "optional": false + } + ], + "fmp": [] + }, + "model": "RevenueBusinessLine" + }, + "/equity/fundamental/filings": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the URLs to SEC filings reported to EDGAR database, such as 10-K, 10-Q, 8-K, and more. SEC\nfilings include Form 10-K, Form 10-Q, Form 8-K, the proxy statement, Forms 3, 4, and 5, Schedule 13, Form 114,\nForeign Investment Disclosures and others. The annual 10-K report is required to be\nfiled annually and includes the company's financial statements, management discussion and analysis,\nand audited financial statements.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.filings(provider='fmp')\nobb.equity.fundamental.filings(limit=100, provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": null, + "optional": true + }, + { + "name": "form_type", + "type": "str", + "description": "Filter by form type. Check the data provider for available types.", + "default": null, + "optional": true + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": 100, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp', 'intrinio', 'sec']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [], + "intrinio": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "thea_enabled", + "type": "bool", + "description": "Return filings that have been read by Intrinio's Thea NLP.", + "default": null, + "optional": true + } + ], + "sec": [ + { + "name": "cik", + "type": "Union[int, str]", + "description": "Lookup filings by Central Index Key (CIK) instead of by symbol.", + "default": null, + "optional": true + }, + { + "name": "type", + "type": "Literal['1', '1-A', '1-A POS', '1-A-W', '1-E', '1-E AD', '1-K', '1-SA', '1-U', '1-Z', '1-Z-W', '10-12B', '10-12G', '10-D', '10-K', '10-KT', '10-Q', '10-QT', '11-K', '11-KT', '13F-HR', '13F-NT', '13FCONP', '144', '15-12B', '15-12G', '15-15D', '15F-12B', '15F-12G', '15F-15D', '18-12B', '18-K', '19B-4E', '2-A', '2-AF', '2-E', '20-F', '20FR12B', '20FR12G', '24F-2NT', '25', '25-NSE', '253G1', '253G2', '253G3', '253G4', '3', '305B2', '34-12H', '4', '40-17F1', '40-17F2', '40-17G', '40-17GCS', '40-202A', '40-203A', '40-206A', '40-24B2', '40-33', '40-6B', '40-8B25', '40-8F-2', '40-APP', '40-F', '40-OIP', '40FR12B', '40FR12G', '424A', '424B1', '424B2', '424B3', '424B4', '424B5', '424B7', '424B8', '424H', '425', '485APOS', '485BPOS', '485BXT', '486APOS', '486BPOS', '486BXT', '487', '497', '497AD', '497H2', '497J', '497K', '497VPI', '497VPU', '5', '6-K', '6B NTC', '6B ORDR', '8-A12B', '8-A12G', '8-K', '8-K12B', '8-K12G3', '8-K15D5', '8-M', '8F-2 NTC', '8F-2 ORDR', '9-M', 'ABS-15G', 'ABS-EE', 'ADN-MTL', 'ADV-E', 'ADV-H-C', 'ADV-H-T', 'ADV-NR', 'ANNLRPT', 'APP NTC', 'APP ORDR', 'APP WD', 'APP WDG', 'ARS', 'ATS-N', 'ATS-N-C', 'ATS-N/UA', 'AW', 'AW WD', 'C', 'C-AR', 'C-AR-W', 'C-TR', 'C-TR-W', 'C-U', 'C-U-W', 'C-W', 'CB', 'CERT', 'CERTARCA', 'CERTBATS', 'CERTCBO', 'CERTNAS', 'CERTNYS', 'CERTPAC', 'CFPORTAL', 'CFPORTAL-W', 'CORRESP', 'CT ORDER', 'D', 'DEF 14A', 'DEF 14C', 'DEFA14A', 'DEFA14C', 'DEFC14A', 'DEFC14C', 'DEFM14A', 'DEFM14C', 'DEFN14A', 'DEFR14A', 'DEFR14C', 'DEL AM', 'DFAN14A', 'DFRN14A', 'DOS', 'DOSLTR', 'DRS', 'DRSLTR', 'DSTRBRPT', 'EFFECT', 'F-1', 'F-10', 'F-10EF', 'F-10POS', 'F-1MEF', 'F-3', 'F-3ASR', 'F-3D', 'F-3DPOS', 'F-3MEF', 'F-4', 'F-4 POS', 'F-4MEF', 'F-6', 'F-6 POS', 'F-6EF', 'F-7', 'F-7 POS', 'F-8', 'F-8 POS', 'F-80', 'F-80POS', 'F-9', 'F-9 POS', 'F-N', 'F-X', 'FOCUSN', 'FWP', 'G-405', 'G-405N', 'G-FIN', 'G-FINW', 'IRANNOTICE', 'MA', 'MA-A', 'MA-I', 'MA-W', 'MSD', 'MSDCO', 'MSDW', 'N-1', 'N-14', 'N-14 8C', 'N-14MEF', 'N-18F1', 'N-1A', 'N-2', 'N-2 POSASR', 'N-23C-2', 'N-23C3A', 'N-23C3B', 'N-23C3C', 'N-2ASR', 'N-2MEF', 'N-30B-2', 'N-30D', 'N-4', 'N-5', 'N-54A', 'N-54C', 'N-6', 'N-6F', 'N-8A', 'N-8B-2', 'N-8F', 'N-8F NTC', 'N-8F ORDR', 'N-CEN', 'N-CR', 'N-CSR', 'N-CSRS', 'N-MFP', 'N-MFP1', 'N-MFP2', 'N-PX', 'N-Q', 'N-VP', 'N-VPFS', 'NO ACT', 'NPORT-EX', 'NPORT-NP', 'NPORT-P', 'NRSRO-CE', 'NRSRO-UPD', 'NSAR-A', 'NSAR-AT', 'NSAR-B', 'NSAR-BT', 'NSAR-U', 'NT 10-D', 'NT 10-K', 'NT 10-Q', 'NT 11-K', 'NT 20-F', 'NT N-CEN', 'NT N-MFP', 'NT N-MFP1', 'NT N-MFP2', 'NT NPORT-EX', 'NT NPORT-P', 'NT-NCEN', 'NT-NCSR', 'NT-NSAR', 'NTFNCEN', 'NTFNCSR', 'NTFNSAR', 'NTN 10D', 'NTN 10K', 'NTN 10Q', 'NTN 20F', 'OIP NTC', 'OIP ORDR', 'POS 8C', 'POS AM', 'POS AMI', 'POS EX', 'POS462B', 'POS462C', 'POSASR', 'PRE 14A', 'PRE 14C', 'PREC14A', 'PREC14C', 'PREM14A', 'PREM14C', 'PREN14A', 'PRER14A', 'PRER14C', 'PRRN14A', 'PX14A6G', 'PX14A6N', 'QRTLYRPT', 'QUALIF', 'REG-NR', 'REVOKED', 'RW', 'RW WD', 'S-1', 'S-11', 'S-11MEF', 'S-1MEF', 'S-20', 'S-3', 'S-3ASR', 'S-3D', 'S-3DPOS', 'S-3MEF', 'S-4', 'S-4 POS', 'S-4EF', 'S-4MEF', 'S-6', 'S-8', 'S-8 POS', 'S-B', 'S-BMEF', 'SBSE', 'SBSE-A', 'SBSE-BD', 'SBSE-C', 'SBSE-W', 'SC 13D', 'SC 13E1', 'SC 13E3', 'SC 13G', 'SC 14D9', 'SC 14F1', 'SC 14N', 'SC TO-C', 'SC TO-I', 'SC TO-T', 'SC13E4F', 'SC14D1F', 'SC14D9C', 'SC14D9F', 'SD', 'SDR', 'SE', 'SEC ACTION', 'SEC STAFF ACTION', 'SEC STAFF LETTER', 'SF-1', 'SF-3', 'SL', 'SP 15D2', 'STOP ORDER', 'SUPPL', 'T-3', 'TA-1', 'TA-2', 'TA-W', 'TACO', 'TH', 'TTW', 'UNDER', 'UPLOAD', 'WDL-REQ', 'X-17A-5']", + "description": "Type of the SEC filing form.", + "default": null, + "optional": true + }, + { + "name": "use_cache", + "type": "bool", + "description": "Whether or not to use cache. If True, cache will store for one day.", + "default": true, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[CompanyFilings]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'intrinio', 'sec']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "filing_date", + "type": "date", + "description": "The date of the filing.", + "default": "", + "optional": false + }, + { + "name": "accepted_date", + "type": "datetime", + "description": "Accepted date of the filing.", + "default": null, + "optional": true + }, + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": null, + "optional": true + }, + { + "name": "cik", + "type": "str", + "description": "Central Index Key (CIK) for the requested entity.", + "default": null, + "optional": true + }, + { + "name": "report_type", + "type": "str", + "description": "Type of filing.", + "default": null, + "optional": true + }, + { + "name": "filing_url", + "type": "str", + "description": "URL to the filing page.", + "default": null, + "optional": true + }, + { + "name": "report_url", + "type": "str", + "description": "URL to the actual report.", + "default": "", + "optional": false + } + ], + "fmp": [], + "intrinio": [ + { + "name": "id", + "type": "str", + "description": "Intrinio ID of the filing.", + "default": "", + "optional": false + }, + { + "name": "period_end_date", + "type": "date", + "description": "Ending date of the fiscal period for the filing.", + "default": null, + "optional": true + }, + { + "name": "sec_unique_id", + "type": "str", + "description": "SEC unique ID of the filing.", + "default": "", + "optional": false + }, + { + "name": "instance_url", + "type": "str", + "description": "URL for the XBRL filing for the report.", + "default": null, + "optional": true + }, + { + "name": "industry_group", + "type": "str", + "description": "Industry group of the company.", + "default": "", + "optional": false + }, + { + "name": "industry_category", + "type": "str", + "description": "Industry category of the company.", + "default": "", + "optional": false + } + ], + "sec": [ + { + "name": "report_date", + "type": "date", + "description": "The date of the filing.", + "default": null, + "optional": true + }, + { + "name": "act", + "type": "Union[int, str]", + "description": "The SEC Act number.", + "default": null, + "optional": true + }, + { + "name": "items", + "type": "Union[str, float]", + "description": "The SEC Item numbers.", + "default": null, + "optional": true + }, + { + "name": "primary_doc_description", + "type": "str", + "description": "The description of the primary document.", + "default": null, + "optional": true + }, + { + "name": "primary_doc", + "type": "str", + "description": "The filename of the primary document.", + "default": null, + "optional": true + }, + { + "name": "accession_number", + "type": "Union[int, str]", + "description": "The accession number.", + "default": null, + "optional": true + }, + { + "name": "file_number", + "type": "Union[int, str]", + "description": "The file number.", + "default": null, + "optional": true + }, + { + "name": "film_number", + "type": "Union[int, str]", + "description": "The film number.", + "default": null, + "optional": true + }, + { + "name": "is_inline_xbrl", + "type": "Union[int, str]", + "description": "Whether the filing is an inline XBRL filing.", + "default": null, + "optional": true + }, + { + "name": "is_xbrl", + "type": "Union[int, str]", + "description": "Whether the filing is an XBRL filing.", + "default": null, + "optional": true + }, + { + "name": "size", + "type": "Union[int, str]", + "description": "The size of the filing.", + "default": null, + "optional": true + }, + { + "name": "complete_submission_url", + "type": "str", + "description": "The URL to the complete filing submission.", + "default": null, + "optional": true + }, + { + "name": "filing_detail_url", + "type": "str", + "description": "The URL to the filing details.", + "default": null, + "optional": true + } + ] + }, + "model": "CompanyFilings" + }, + "/equity/fundamental/historical_splits": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get historical stock splits for a given company.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.historical_splits(symbol='AAPL', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[HistoricalSplits]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "numerator", + "type": "float", + "description": "Numerator of the split.", + "default": null, + "optional": true + }, + { + "name": "denominator", + "type": "float", + "description": "Denominator of the split.", + "default": null, + "optional": true + }, + { + "name": "split_ratio", + "type": "str", + "description": "Split ratio.", + "default": null, + "optional": true + } + ], + "fmp": [] + }, + "model": "HistoricalSplits" + }, + "/equity/fundamental/transcript": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get earnings call transcripts for a given company.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.transcript(symbol='AAPL', year=2020, provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "year", + "type": "int", + "description": "Year of the earnings call transcript.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EarningsCallTranscript]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "quarter", + "type": "int", + "description": "Quarter of the earnings call transcript.", + "default": "", + "optional": false + }, + { + "name": "year", + "type": "int", + "description": "Year of the earnings call transcript.", + "default": "", + "optional": false + }, + { + "name": "date", + "type": "datetime", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "content", + "type": "str", + "description": "Content of the earnings call transcript.", + "default": "", + "optional": false + } + ], + "fmp": [] + }, + "model": "EarningsCallTranscript" + }, + "/equity/fundamental/trailing_dividend_yield": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the 1 year trailing dividend yield for a given company over time.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.fundamental.trailing_dividend_yield(symbol='AAPL', provider='tiingo')\nobb.equity.fundamental.trailing_dividend_yield(symbol='AAPL', limit=252, provider='tiingo')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return. Default is 252, the number of trading days in a year.", + "default": 252, + "optional": true + }, + { + "name": "provider", + "type": "Literal['tiingo']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'tiingo' if there is no default.", + "default": "tiingo", + "optional": true + } + ], + "tiingo": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[TrailingDividendYield]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['tiingo']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "trailing_dividend_yield", + "type": "float", + "description": "Trailing dividend yield.", + "default": "", + "optional": false + } + ], + "tiingo": [] + }, + "model": "TrailingDividendYield" + }, + "/equity/ownership/major_holders": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get data about major holders for a given company over time.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.ownership.major_holders(symbol='AAPL', provider='fmp')\nobb.equity.ownership.major_holders(symbol='AAPL', page=0, provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "date", + "type": "Union[date, str]", + "description": "A specific date to get data for.", + "default": null, + "optional": true + }, + { + "name": "page", + "type": "int", + "description": "Page number of the data to fetch.", + "default": 0, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EquityOwnership]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "cik", + "type": "int", + "description": "Central Index Key (CIK) for the requested entity.", + "default": "", + "optional": false + }, + { + "name": "filing_date", + "type": "date", + "description": "Filing date of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "investor_name", + "type": "str", + "description": "Investor name of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "security_name", + "type": "str", + "description": "Security name of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "type_of_security", + "type": "str", + "description": "Type of security of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "security_cusip", + "type": "str", + "description": "Security cusip of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "shares_type", + "type": "str", + "description": "Shares type of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "put_call_share", + "type": "str", + "description": "Put call share of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "investment_discretion", + "type": "str", + "description": "Investment discretion of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "industry_title", + "type": "str", + "description": "Industry title of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "weight", + "type": "float", + "description": "Weight of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "last_weight", + "type": "float", + "description": "Last weight of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "change_in_weight", + "type": "float", + "description": "Change in weight of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "change_in_weight_percentage", + "type": "float", + "description": "Change in weight percentage of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "market_value", + "type": "int", + "description": "Market value of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "last_market_value", + "type": "int", + "description": "Last market value of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "change_in_market_value", + "type": "int", + "description": "Change in market value of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "change_in_market_value_percentage", + "type": "float", + "description": "Change in market value percentage of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "shares_number", + "type": "int", + "description": "Shares number of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "last_shares_number", + "type": "int", + "description": "Last shares number of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "change_in_shares_number", + "type": "float", + "description": "Change in shares number of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "change_in_shares_number_percentage", + "type": "float", + "description": "Change in shares number percentage of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "quarter_end_price", + "type": "float", + "description": "Quarter end price of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "avg_price_paid", + "type": "float", + "description": "Average price paid of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "is_new", + "type": "bool", + "description": "Is the stock ownership new.", + "default": "", + "optional": false + }, + { + "name": "is_sold_out", + "type": "bool", + "description": "Is the stock ownership sold out.", + "default": "", + "optional": false + }, + { + "name": "ownership", + "type": "float", + "description": "How much is the ownership.", + "default": "", + "optional": false + }, + { + "name": "last_ownership", + "type": "float", + "description": "Last ownership amount.", + "default": "", + "optional": false + }, + { + "name": "change_in_ownership", + "type": "float", + "description": "Change in ownership amount.", + "default": "", + "optional": false + }, + { + "name": "change_in_ownership_percentage", + "type": "float", + "description": "Change in ownership percentage.", + "default": "", + "optional": false + }, + { + "name": "holding_period", + "type": "int", + "description": "Holding period of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "first_added", + "type": "date", + "description": "First added date of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "performance", + "type": "float", + "description": "Performance of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "performance_percentage", + "type": "float", + "description": "Performance percentage of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "last_performance", + "type": "float", + "description": "Last performance of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "change_in_performance", + "type": "float", + "description": "Change in performance of the stock ownership.", + "default": "", + "optional": false + }, + { + "name": "is_counted_for_performance", + "type": "bool", + "description": "Is the stock ownership counted for performance.", + "default": "", + "optional": false + } + ], + "fmp": [] + }, + "model": "EquityOwnership" + }, + "/equity/ownership/institutional": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get data about institutional ownership for a given company over time.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.ownership.institutional(symbol='AAPL', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [ + { + "name": "include_current_quarter", + "type": "bool", + "description": "Include current quarter data.", + "default": false, + "optional": true + }, + { + "name": "date", + "type": "Union[date, str]", + "description": "A specific date to get data for.", + "default": null, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[InstitutionalOwnership]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "cik", + "type": "str", + "description": "Central Index Key (CIK) for the requested entity.", + "default": null, + "optional": true + }, + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + } + ], + "fmp": [ + { + "name": "investors_holding", + "type": "int", + "description": "Number of investors holding the stock.", + "default": "", + "optional": false + }, + { + "name": "last_investors_holding", + "type": "int", + "description": "Number of investors holding the stock in the last quarter.", + "default": "", + "optional": false + }, + { + "name": "investors_holding_change", + "type": "int", + "description": "Change in the number of investors holding the stock.", + "default": "", + "optional": false + }, + { + "name": "number_of_13f_shares", + "type": "int", + "description": "Number of 13F shares.", + "default": null, + "optional": true + }, + { + "name": "last_number_of_13f_shares", + "type": "int", + "description": "Number of 13F shares in the last quarter.", + "default": null, + "optional": true + }, + { + "name": "number_of_13f_shares_change", + "type": "int", + "description": "Change in the number of 13F shares.", + "default": null, + "optional": true + }, + { + "name": "total_invested", + "type": "float", + "description": "Total amount invested.", + "default": "", + "optional": false + }, + { + "name": "last_total_invested", + "type": "float", + "description": "Total amount invested in the last quarter.", + "default": "", + "optional": false + }, + { + "name": "total_invested_change", + "type": "float", + "description": "Change in the total amount invested.", + "default": "", + "optional": false + }, + { + "name": "ownership_percent", + "type": "float", + "description": "Ownership percent.", + "default": "", + "optional": false + }, + { + "name": "last_ownership_percent", + "type": "float", + "description": "Ownership percent in the last quarter.", + "default": "", + "optional": false + }, + { + "name": "ownership_percent_change", + "type": "float", + "description": "Change in the ownership percent.", + "default": "", + "optional": false + }, + { + "name": "new_positions", + "type": "int", + "description": "Number of new positions.", + "default": "", + "optional": false + }, + { + "name": "last_new_positions", + "type": "int", + "description": "Number of new positions in the last quarter.", + "default": "", + "optional": false + }, + { + "name": "new_positions_change", + "type": "int", + "description": "Change in the number of new positions.", + "default": "", + "optional": false + }, + { + "name": "increased_positions", + "type": "int", + "description": "Number of increased positions.", + "default": "", + "optional": false + }, + { + "name": "last_increased_positions", + "type": "int", + "description": "Number of increased positions in the last quarter.", + "default": "", + "optional": false + }, + { + "name": "increased_positions_change", + "type": "int", + "description": "Change in the number of increased positions.", + "default": "", + "optional": false + }, + { + "name": "closed_positions", + "type": "int", + "description": "Number of closed positions.", + "default": "", + "optional": false + }, + { + "name": "last_closed_positions", + "type": "int", + "description": "Number of closed positions in the last quarter.", + "default": "", + "optional": false + }, + { + "name": "closed_positions_change", + "type": "int", + "description": "Change in the number of closed positions.", + "default": "", + "optional": false + }, + { + "name": "reduced_positions", + "type": "int", + "description": "Number of reduced positions.", + "default": "", + "optional": false + }, + { + "name": "last_reduced_positions", + "type": "int", + "description": "Number of reduced positions in the last quarter.", + "default": "", + "optional": false + }, + { + "name": "reduced_positions_change", + "type": "int", + "description": "Change in the number of reduced positions.", + "default": "", + "optional": false + }, + { + "name": "total_calls", + "type": "int", + "description": "Total number of call options contracts traded for Apple Inc. on the specified date.", + "default": "", + "optional": false + }, + { + "name": "last_total_calls", + "type": "int", + "description": "Total number of call options contracts traded for Apple Inc. on the previous reporting date.", + "default": "", + "optional": false + }, + { + "name": "total_calls_change", + "type": "int", + "description": "Change in the total number of call options contracts traded between the current and previous reporting dates.", + "default": "", + "optional": false + }, + { + "name": "total_puts", + "type": "int", + "description": "Total number of put options contracts traded for Apple Inc. on the specified date.", + "default": "", + "optional": false + }, + { + "name": "last_total_puts", + "type": "int", + "description": "Total number of put options contracts traded for Apple Inc. on the previous reporting date.", + "default": "", + "optional": false + }, + { + "name": "total_puts_change", + "type": "int", + "description": "Change in the total number of put options contracts traded between the current and previous reporting dates.", + "default": "", + "optional": false + }, + { + "name": "put_call_ratio", + "type": "float", + "description": "Put-call ratio, which is the ratio of the total number of put options to call options traded on the specified date.", + "default": "", + "optional": false + }, + { + "name": "last_put_call_ratio", + "type": "float", + "description": "Put-call ratio on the previous reporting date.", + "default": "", + "optional": false + }, + { + "name": "put_call_ratio_change", + "type": "float", + "description": "Change in the put-call ratio between the current and previous reporting dates.", + "default": "", + "optional": false + } + ] + }, + "model": "InstitutionalOwnership" + }, + "/equity/ownership/insider_trading": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get data about trading by a company's management team and board of directors.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.ownership.insider_trading(symbol='AAPL', provider='fmp')\nobb.equity.ownership.insider_trading(symbol='AAPL', limit=500, provider='intrinio')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": 500, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp', 'intrinio']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [ + { + "name": "transaction_type", + "type": "Literal[None, 'award', 'conversion', 'return', 'expire_short', 'in_kind', 'gift', 'expire_long', 'discretionary', 'other', 'small', 'exempt', 'otm', 'purchase', 'sale', 'tender', 'will', 'itm', 'trust']", + "description": "Type of the transaction.", + "default": null, + "optional": true + } + ], + "intrinio": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": "", + "optional": false + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": "", + "optional": false + }, + { + "name": "ownership_type", + "type": "Literal['D', 'I']", + "description": "Type of ownership.", + "default": null, + "optional": true + }, + { + "name": "sort_by", + "type": "Literal['filing_date', 'updated_on']", + "description": "Field to sort by.", + "default": "updated_on", + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[InsiderTrading]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'intrinio']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": null, + "optional": true + }, + { + "name": "company_cik", + "type": "Union[int, str]", + "description": "CIK number of the company.", + "default": null, + "optional": true + }, + { + "name": "filing_date", + "type": "Union[date, datetime]", + "description": "Filing date of the trade.", + "default": null, + "optional": true + }, + { + "name": "transaction_date", + "type": "date", + "description": "Date of the transaction.", + "default": null, + "optional": true + }, + { + "name": "owner_cik", + "type": "Union[int, str]", + "description": "Reporting individual's CIK.", + "default": null, + "optional": true + }, + { + "name": "owner_name", + "type": "str", + "description": "Name of the reporting individual.", + "default": null, + "optional": true + }, + { + "name": "owner_title", + "type": "str", + "description": "The title held by the reporting individual.", + "default": null, + "optional": true + }, + { + "name": "transaction_type", + "type": "str", + "description": "Type of transaction being reported.", + "default": null, + "optional": true + }, + { + "name": "acquisition_or_disposition", + "type": "str", + "description": "Acquisition or disposition of the shares.", + "default": null, + "optional": true + }, + { + "name": "security_type", + "type": "str", + "description": "The type of security transacted.", + "default": null, + "optional": true + }, + { + "name": "securities_owned", + "type": "float", + "description": "Number of securities owned by the reporting individual.", + "default": null, + "optional": true + }, + { + "name": "securities_transacted", + "type": "float", + "description": "Number of securities transacted by the reporting individual.", + "default": null, + "optional": true + }, + { + "name": "transaction_price", + "type": "float", + "description": "The price of the transaction.", + "default": null, + "optional": true + }, + { + "name": "filing_url", + "type": "str", + "description": "Link to the filing.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "form_type", + "type": "str", + "description": "Form type of the insider trading.", + "default": "", + "optional": false + } + ], + "intrinio": [ + { + "name": "company_name", + "type": "str", + "description": "Name of the company.", + "default": "", + "optional": false + }, + { + "name": "conversion_exercise_price", + "type": "float", + "description": "Conversion/Exercise price of the shares.", + "default": null, + "optional": true + }, + { + "name": "deemed_execution_date", + "type": "date", + "description": "Deemed execution date of the trade.", + "default": null, + "optional": true + }, + { + "name": "exercise_date", + "type": "date", + "description": "Exercise date of the trade.", + "default": null, + "optional": true + }, + { + "name": "expiration_date", + "type": "date", + "description": "Expiration date of the derivative.", + "default": null, + "optional": true + }, + { + "name": "underlying_security_title", + "type": "str", + "description": "Name of the underlying non-derivative security related to this derivative transaction.", + "default": null, + "optional": true + }, + { + "name": "underlying_shares", + "type": "Union[float, int]", + "description": "Number of underlying shares related to this derivative transaction.", + "default": null, + "optional": true + }, + { + "name": "nature_of_ownership", + "type": "str", + "description": "Nature of ownership of the insider trading.", + "default": null, + "optional": true + }, + { + "name": "director", + "type": "bool", + "description": "Whether the owner is a director.", + "default": null, + "optional": true + }, + { + "name": "officer", + "type": "bool", + "description": "Whether the owner is an officer.", + "default": null, + "optional": true + }, + { + "name": "ten_percent_owner", + "type": "bool", + "description": "Whether the owner is a 10% owner.", + "default": null, + "optional": true + }, + { + "name": "other_relation", + "type": "bool", + "description": "Whether the owner is having another relation.", + "default": null, + "optional": true + }, + { + "name": "derivative_transaction", + "type": "bool", + "description": "Whether the owner is having a derivative transaction.", + "default": null, + "optional": true + }, + { + "name": "report_line_number", + "type": "int", + "description": "Report line number of the insider trading.", + "default": null, + "optional": true + } + ] + }, + "model": "InsiderTrading" + }, + "/equity/ownership/share_statistics": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get data about share float for a given company.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.ownership.share_statistics(symbol='AAPL', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Multiple items allowed for provider(s): yfinance.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['fmp', 'intrinio', 'yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [], + "intrinio": [], + "yfinance": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[ShareStatistics]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'intrinio', 'yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": null, + "optional": true + }, + { + "name": "free_float", + "type": "float", + "description": "Percentage of unrestricted shares of a publicly-traded company.", + "default": null, + "optional": true + }, + { + "name": "float_shares", + "type": "float", + "description": "Number of shares available for trading by the general public.", + "default": null, + "optional": true + }, + { + "name": "outstanding_shares", + "type": "float", + "description": "Total number of shares of a publicly-traded company.", + "default": null, + "optional": true + }, + { + "name": "source", + "type": "str", + "description": "Source of the received data.", + "default": null, + "optional": true + } + ], + "fmp": [], + "intrinio": [ + { + "name": "adjusted_outstanding_shares", + "type": "float", + "description": "Total number of shares of a publicly-traded company, adjusted for splits.", + "default": null, + "optional": true + }, + { + "name": "public_float", + "type": "float", + "description": "Aggregate market value of the shares of a publicly-traded company.", + "default": null, + "optional": true + } + ], + "yfinance": [ + { + "name": "implied_shares_outstanding", + "type": "int", + "description": "Implied Shares Outstanding of common equity, assuming the conversion of all convertible subsidiary equity into common.", + "default": null, + "optional": true + }, + { + "name": "short_interest", + "type": "int", + "description": "Number of shares that are reported short.", + "default": null, + "optional": true + }, + { + "name": "short_percent_of_float", + "type": "float", + "description": "Percentage of shares that are reported short, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "days_to_cover", + "type": "float", + "description": "Number of days to repurchase the shares as a ratio of average daily volume", + "default": null, + "optional": true + }, + { + "name": "short_interest_prev_month", + "type": "int", + "description": "Number of shares that were reported short in the previous month.", + "default": null, + "optional": true + }, + { + "name": "short_interest_prev_date", + "type": "date", + "description": "Date of the previous month's report.", + "default": null, + "optional": true + }, + { + "name": "insider_ownership", + "type": "float", + "description": "Percentage of shares held by insiders, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "institution_ownership", + "type": "float", + "description": "Percentage of shares held by institutions, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "institution_float_ownership", + "type": "float", + "description": "Percentage of float held by institutions, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "institutions_count", + "type": "int", + "description": "Number of institutions holding shares.", + "default": null, + "optional": true + } + ] + }, + "model": "ShareStatistics" + }, + "/equity/ownership/form_13f": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the form 13F.\n\nThe Securities and Exchange Commission's (SEC) Form 13F is a quarterly report\nthat is required to be filed by all institutional investment managers with at least\n$100 million in assets under management.\nManagers are required to file Form 13F within 45 days after the last day of the calendar quarter.\nMost funds wait until the end of this period in order to conceal\ntheir investment strategy from competitors and the public.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.ownership.form_13f(symbol='NVDA', provider='sec')\n# Enter a date (calendar quarter ending) for a specific report.\nobb.equity.ownership.form_13f(symbol='BRK-A', date='2016-09-30', provider='sec')\n# Example finding Michael Burry's filings.\ncik = obb.regulators.sec.institutions_search(\"Scion Asset Management\").results[0].cik\n# Use the `limit` parameter to return N number of reports from the most recent.\nobb.equity.ownership.form_13f(cik, limit=2).to_df()\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for. A CIK or Symbol can be used.", + "default": "", + "optional": false + }, + { + "name": "date", + "type": "Union[date, str]", + "description": "A specific date to get data for. The date represents the end of the reporting period. All form 13F-HR filings are based on the calendar year and are reported quarterly. If a date is not supplied, the most recent filing is returned. Submissions beginning 2013-06-30 are supported.", + "default": null, + "optional": true + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return. The number of previous filings to return. The date parameter takes priority over this parameter.", + "default": 1, + "optional": true + }, + { + "name": "provider", + "type": "Literal['sec']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'sec' if there is no default.", + "default": "sec", + "optional": true + } + ], + "sec": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[Form13FHR]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['sec']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "period_ending", + "type": "date", + "description": "The end-of-quarter date of the filing.", + "default": "", + "optional": false + }, + { + "name": "issuer", + "type": "str", + "description": "The name of the issuer.", + "default": "", + "optional": false + }, + { + "name": "cusip", + "type": "str", + "description": "The CUSIP of the security.", + "default": "", + "optional": false + }, + { + "name": "asset_class", + "type": "str", + "description": "The title of the asset class for the security.", + "default": "", + "optional": false + }, + { + "name": "security_type", + "type": "Literal['SH', 'PRN']", + "description": "The total number of shares of the class of security or the principal amount of such class. 'SH' for shares. 'PRN' for principal amount. Convertible debt securities are reported as 'PRN'.", + "default": null, + "optional": true + }, + { + "name": "option_type", + "type": "Literal['call', 'put']", + "description": "Defined when the holdings being reported are put or call options. Only long positions are reported.", + "default": null, + "optional": true + }, + { + "name": "voting_authority_sole", + "type": "int", + "description": "The number of shares for which the Manager exercises sole voting authority (none).", + "default": null, + "optional": true + }, + { + "name": "voting_authority_shared", + "type": "int", + "description": "The number of shares for which the Manager exercises a defined shared voting authority (none).", + "default": null, + "optional": true + }, + { + "name": "voting_authority_other", + "type": "int", + "description": "The number of shares for which the Manager exercises other shared voting authority (none).", + "default": null, + "optional": true + }, + { + "name": "principal_amount", + "type": "int", + "description": "The total number of shares of the class of security or the principal amount of such class. Only long positions are reported", + "default": "", + "optional": false + }, + { + "name": "value", + "type": "int", + "description": "The fair market value of the holding of the particular class of security. The value reported for options is the fair market value of the underlying security with respect to the number of shares controlled. Values are rounded to the nearest US dollar and use the closing price of the last trading day of the calendar year or quarter.", + "default": "", + "optional": false + } + ], + "sec": [ + { + "name": "weight", + "type": "float", + "description": "The weight of the security relative to the market value of all securities in the filing , as a normalized percent.", + "default": "", + "optional": false + } + ] + }, + "model": "Form13FHR" + }, + "/equity/price/quote": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the latest quote for a given stock. Quote includes price, volume, and other data.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.price.quote(symbol='AAPL', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio, yfinance.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['fmp', 'intrinio', 'yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [], + "intrinio": [ + { + "name": "source", + "type": "Literal['iex', 'bats', 'bats_delayed', 'utp_delayed', 'cta_a_delayed', 'cta_b_delayed', 'intrinio_mx', 'intrinio_mx_plus', 'delayed_sip']", + "description": "Source of the data.", + "default": "iex", + "optional": true + } + ], + "yfinance": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EquityQuote]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'intrinio', 'yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "asset_type", + "type": "str", + "description": "Type of asset - i.e, stock, ETF, etc.", + "default": null, + "optional": true + }, + { + "name": "name", + "type": "str", + "description": "Name of the company or asset.", + "default": null, + "optional": true + }, + { + "name": "exchange", + "type": "str", + "description": "The name or symbol of the venue where the data is from.", + "default": null, + "optional": true + }, + { + "name": "bid", + "type": "float", + "description": "Price of the top bid order.", + "default": null, + "optional": true + }, + { + "name": "bid_size", + "type": "int", + "description": "This represents the number of round lot orders at the given price. The normal round lot size is 100 shares. A size of 2 means there are 200 shares available at the given price.", + "default": null, + "optional": true + }, + { + "name": "bid_exchange", + "type": "str", + "description": "The specific trading venue where the purchase order was placed.", + "default": null, + "optional": true + }, + { + "name": "ask", + "type": "float", + "description": "Price of the top ask order.", + "default": null, + "optional": true + }, + { + "name": "ask_size", + "type": "int", + "description": "This represents the number of round lot orders at the given price. The normal round lot size is 100 shares. A size of 2 means there are 200 shares available at the given price.", + "default": null, + "optional": true + }, + { + "name": "ask_exchange", + "type": "str", + "description": "The specific trading venue where the sale order was placed.", + "default": null, + "optional": true + }, + { + "name": "quote_conditions", + "type": "Union[str, int, List[str], List[int]]", + "description": "Conditions or condition codes applicable to the quote.", + "default": null, + "optional": true + }, + { + "name": "quote_indicators", + "type": "Union[str, int, List[str], List[int]]", + "description": "Indicators or indicator codes applicable to the participant quote related to the price bands for the issue, or the affect the quote has on the NBBO.", + "default": null, + "optional": true + }, + { + "name": "sales_conditions", + "type": "Union[str, int, List[str], List[int]]", + "description": "Conditions or condition codes applicable to the sale.", + "default": null, + "optional": true + }, + { + "name": "sequence_number", + "type": "int", + "description": "The sequence number represents the sequence in which message events happened. These are increasing and unique per ticker symbol, but will not always be sequential (e.g., 1, 2, 6, 9, 10, 11).", + "default": null, + "optional": true + }, + { + "name": "market_center", + "type": "str", + "description": "The ID of the UTP participant that originated the message.", + "default": null, + "optional": true + }, + { + "name": "participant_timestamp", + "type": "datetime", + "description": "Timestamp for when the quote was generated by the exchange.", + "default": null, + "optional": true + }, + { + "name": "trf_timestamp", + "type": "datetime", + "description": "Timestamp for when the TRF (Trade Reporting Facility) received the message.", + "default": null, + "optional": true + }, + { + "name": "sip_timestamp", + "type": "datetime", + "description": "Timestamp for when the SIP (Security Information Processor) received the message from the exchange.", + "default": null, + "optional": true + }, + { + "name": "last_price", + "type": "float", + "description": "Price of the last trade.", + "default": null, + "optional": true + }, + { + "name": "last_tick", + "type": "str", + "description": "Whether the last sale was an up or down tick.", + "default": null, + "optional": true + }, + { + "name": "last_size", + "type": "int", + "description": "Size of the last trade.", + "default": null, + "optional": true + }, + { + "name": "last_timestamp", + "type": "datetime", + "description": "Date and Time when the last price was recorded.", + "default": null, + "optional": true + }, + { + "name": "open", + "type": "float", + "description": "The open price.", + "default": null, + "optional": true + }, + { + "name": "high", + "type": "float", + "description": "The high price.", + "default": null, + "optional": true + }, + { + "name": "low", + "type": "float", + "description": "The low price.", + "default": null, + "optional": true + }, + { + "name": "close", + "type": "float", + "description": "The close price.", + "default": null, + "optional": true + }, + { + "name": "volume", + "type": "Union[float, int]", + "description": "The trading volume.", + "default": null, + "optional": true + }, + { + "name": "exchange_volume", + "type": "Union[float, int]", + "description": "Volume of shares exchanged during the trading day on the specific exchange.", + "default": null, + "optional": true + }, + { + "name": "prev_close", + "type": "float", + "description": "The previous close price.", + "default": null, + "optional": true + }, + { + "name": "change", + "type": "float", + "description": "Change in price from previous close.", + "default": null, + "optional": true + }, + { + "name": "change_percent", + "type": "float", + "description": "Change in price as a normalized percentage.", + "default": null, + "optional": true + }, + { + "name": "year_high", + "type": "float", + "description": "The one year high (52W High).", + "default": null, + "optional": true + }, + { + "name": "year_low", + "type": "float", + "description": "The one year low (52W Low).", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "price_avg50", + "type": "float", + "description": "50 day moving average price.", + "default": null, + "optional": true + }, + { + "name": "price_avg200", + "type": "float", + "description": "200 day moving average price.", + "default": null, + "optional": true + }, + { + "name": "avg_volume", + "type": "int", + "description": "Average volume over the last 10 trading days.", + "default": null, + "optional": true + }, + { + "name": "market_cap", + "type": "float", + "description": "Market cap of the company.", + "default": null, + "optional": true + }, + { + "name": "shares_outstanding", + "type": "int", + "description": "Number of shares outstanding.", + "default": null, + "optional": true + }, + { + "name": "eps", + "type": "float", + "description": "Earnings per share.", + "default": null, + "optional": true + }, + { + "name": "pe", + "type": "float", + "description": "Price earnings ratio.", + "default": null, + "optional": true + }, + { + "name": "earnings_announcement", + "type": "datetime", + "description": "Upcoming earnings announcement date.", + "default": null, + "optional": true + } + ], + "intrinio": [ + { + "name": "is_darkpool", + "type": "bool", + "description": "Whether or not the current trade is from a darkpool.", + "default": null, + "optional": true + }, + { + "name": "source", + "type": "str", + "description": "Source of the Intrinio data.", + "default": null, + "optional": true + }, + { + "name": "updated_on", + "type": "datetime", + "description": "Date and Time when the data was last updated.", + "default": "", + "optional": false + }, + { + "name": "security", + "type": "IntrinioSecurity", + "description": "Security details related to the quote.", + "default": null, + "optional": true + } + ], + "yfinance": [ + { + "name": "ma_50d", + "type": "float", + "description": "50-day moving average price.", + "default": null, + "optional": true + }, + { + "name": "ma_200d", + "type": "float", + "description": "200-day moving average price.", + "default": null, + "optional": true + }, + { + "name": "volume_average", + "type": "float", + "description": "Average daily trading volume.", + "default": null, + "optional": true + }, + { + "name": "volume_average_10d", + "type": "float", + "description": "Average daily trading volume in the last 10 days.", + "default": null, + "optional": true + }, + { + "name": "currency", + "type": "str", + "description": "Currency of the price.", + "default": null, + "optional": true + } + ] + }, + "model": "EquityQuote" + }, + "/equity/price/nbbo": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the National Best Bid and Offer for a given stock.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.price.nbbo(symbol='AAPL', provider='polygon')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['polygon']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'polygon' if there is no default.", + "default": "polygon", + "optional": true + } + ], + "polygon": [ + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return. Up to ten million records will be returned. Pagination occurs in groups of 50,000. Remaining limit values will always return 50,000 more records unless it is the last page. High volume tickers will require multiple max requests for a single day's NBBO records. Expect stocks, like SPY, to approach 1GB in size, per day, as a raw CSV. Splitting large requests into chunks is recommended for full-day requests of high-volume symbols.", + "default": 50000, + "optional": true + }, + { + "name": "date", + "type": "Union[date, str]", + "description": "A specific date to get data for. Use bracketed the timestamp parameters to specify exact time ranges.", + "default": null, + "optional": true + }, + { + "name": "timestamp_lt", + "type": "Union[datetime, str]", + "description": "Query by datetime, less than. Either a date with the format 'YYYY-MM-DD' or a TZ-aware timestamp string, 'YYYY-MM-DDTH:M:S.000000000-04:00'. Include all nanoseconds and the 'T' between the day and hour.", + "default": null, + "optional": true + }, + { + "name": "timestamp_gt", + "type": "Union[datetime, str]", + "description": "Query by datetime, greater than. Either a date with the format 'YYYY-MM-DD' or a TZ-aware timestamp string, 'YYYY-MM-DDTH:M:S.000000000-04:00'. Include all nanoseconds and the 'T' between the day and hour.", + "default": null, + "optional": true + }, + { + "name": "timestamp_lte", + "type": "Union[datetime, str]", + "description": "Query by datetime, less than or equal to. Either a date with the format 'YYYY-MM-DD' or a TZ-aware timestamp string, 'YYYY-MM-DDTH:M:S.000000000-04:00'. Include all nanoseconds and the 'T' between the day and hour.", + "default": null, + "optional": true + }, + { + "name": "timestamp_gte", + "type": "Union[datetime, str]", + "description": "Query by datetime, greater than or equal to. Either a date with the format 'YYYY-MM-DD' or a TZ-aware timestamp string, 'YYYY-MM-DDTH:M:S.000000000-04:00'. Include all nanoseconds and the 'T' between the day and hour.", + "default": null, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EquityNBBO]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['polygon']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "ask_exchange", + "type": "str", + "description": "The exchange ID for the ask.", + "default": "", + "optional": false + }, + { + "name": "ask", + "type": "float", + "description": "The last ask price.", + "default": "", + "optional": false + }, + { + "name": "ask_size", + "type": "int", + "description": "The ask size. This represents the number of round lot orders at the given ask price. The normal round lot size is 100 shares. An ask size of 2 means there are 200 shares available to purchase at the given ask price.", + "default": "", + "optional": false + }, + { + "name": "bid_size", + "type": "int", + "description": "The bid size in round lots.", + "default": "", + "optional": false + }, + { + "name": "bid", + "type": "float", + "description": "The last bid price.", + "default": "", + "optional": false + }, + { + "name": "bid_exchange", + "type": "str", + "description": "The exchange ID for the bid.", + "default": "", + "optional": false + } + ], + "polygon": [ + { + "name": "tape", + "type": "str", + "description": "The exchange tape.", + "default": null, + "optional": true + }, + { + "name": "conditions", + "type": "Union[str, List[int], List[str]]", + "description": "A list of condition codes.", + "default": null, + "optional": true + }, + { + "name": "indicators", + "type": "List[int]", + "description": "A list of indicator codes.", + "default": null, + "optional": true + }, + { + "name": "sequence_num", + "type": "int", + "description": "The sequence number represents the sequence in which message events happened. These are increasing and unique per ticker symbol, but will not always be sequential (e.g., 1, 2, 6, 9, 10, 11)", + "default": null, + "optional": true + }, + { + "name": "participant_timestamp", + "type": "datetime", + "description": "The nanosecond accuracy Participant/Exchange Unix Timestamp. This is the timestamp of when the quote was actually generated at the exchange.", + "default": null, + "optional": true + }, + { + "name": "sip_timestamp", + "type": "datetime", + "description": "The nanosecond accuracy SIP Unix Timestamp. This is the timestamp of when the SIP received this quote from the exchange which produced it.", + "default": null, + "optional": true + }, + { + "name": "trf_timestamp", + "type": "datetime", + "description": "The nanosecond accuracy TRF (Trade Reporting Facility) Unix Timestamp. This is the timestamp of when the trade reporting facility received this quote.", + "default": null, + "optional": true + } + ] + }, + "model": "EquityNBBO" + }, + "/equity/price/historical": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get historical price data for a given stock. This includes open, high, low, close, and volume.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.price.historical(symbol='AAPL', provider='fmp')\nobb.equity.price.historical(symbol='AAPL', interval='1d', provider='intrinio')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, polygon, tiingo, yfinance.", + "default": "", + "optional": false + }, + { + "name": "interval", + "type": "str", + "description": "Time interval of the data to return.", + "default": "1d", + "optional": true + }, + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp', 'intrinio', 'polygon', 'tiingo', 'yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [], + "intrinio": [ + { + "name": "start_time", + "type": "datetime.time", + "description": "Return intervals starting at the specified time on the `start_date` formatted as 'HH:MM:SS'.", + "default": null, + "optional": true + }, + { + "name": "end_time", + "type": "datetime.time", + "description": "Return intervals stopping at the specified time on the `end_date` formatted as 'HH:MM:SS'.", + "default": null, + "optional": true + }, + { + "name": "timezone", + "type": "str", + "description": "Timezone of the data, in the IANA format (Continent/City).", + "default": "America/New_York", + "optional": true + }, + { + "name": "source", + "type": "Literal['realtime', 'delayed', 'nasdaq_basic']", + "description": "The source of the data.", + "default": "realtime", + "optional": true + } + ], + "polygon": [ + { + "name": "adjustment", + "type": "Literal['splits_only', 'unadjusted']", + "description": "The adjustment factor to apply. Default is splits only.", + "default": "splits_only", + "optional": true + }, + { + "name": "extended_hours", + "type": "bool", + "description": "Include Pre and Post market data.", + "default": false, + "optional": true + }, + { + "name": "sort", + "type": "Literal['asc', 'desc']", + "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date.", + "default": "asc", + "optional": true + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": 49999, + "optional": true + } + ], + "tiingo": [], + "yfinance": [ + { + "name": "extended_hours", + "type": "bool", + "description": "Include Pre and Post market data.", + "default": false, + "optional": true + }, + { + "name": "include_actions", + "type": "bool", + "description": "Include dividends and stock splits in results.", + "default": true, + "optional": true + }, + { + "name": "adjustment", + "type": "Literal['splits_only', 'splits_and_dividends']", + "description": "The adjustment factor to apply. Default is splits only.", + "default": "splits_only", + "optional": true + }, + { + "name": "adjusted", + "type": "bool", + "description": "This field is deprecated (4.1.5) and will be removed in a future version. Use 'adjustment' set as 'splits_and_dividends' instead.", + "default": false, + "optional": true + }, + { + "name": "prepost", + "type": "bool", + "description": "This field is deprecated (4.1.5) and will be removed in a future version. Use 'extended_hours' as True instead.", + "default": false, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EquityHistorical]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'intrinio', 'polygon', 'tiingo', 'yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "Union[date, datetime]", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "open", + "type": "float", + "description": "The open price.", + "default": "", + "optional": false + }, + { + "name": "high", + "type": "float", + "description": "The high price.", + "default": "", + "optional": false + }, + { + "name": "low", + "type": "float", + "description": "The low price.", + "default": "", + "optional": false + }, + { + "name": "close", + "type": "float", + "description": "The close price.", + "default": "", + "optional": false + }, + { + "name": "volume", + "type": "Union[float, int]", + "description": "The trading volume.", + "default": null, + "optional": true + }, + { + "name": "vwap", + "type": "float", + "description": "Volume Weighted Average Price over the period.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "adj_close", + "type": "float", + "description": "The adjusted close price.", + "default": null, + "optional": true + }, + { + "name": "unadjusted_volume", + "type": "float", + "description": "Unadjusted volume of the symbol.", + "default": null, + "optional": true + }, + { + "name": "change", + "type": "float", + "description": "Change in the price from the previous close.", + "default": null, + "optional": true + }, + { + "name": "change_percent", + "type": "float", + "description": "Change in the price from the previous close, as a normalized percent.", + "default": null, + "optional": true + } + ], + "intrinio": [ + { + "name": "average", + "type": "float", + "description": "Average trade price of an individual equity during the interval.", + "default": null, + "optional": true + }, + { + "name": "change", + "type": "float", + "description": "Change in the price of the symbol from the previous day.", + "default": null, + "optional": true + }, + { + "name": "change_percent", + "type": "float", + "description": "Percent change in the price of the symbol from the previous day.", + "default": null, + "optional": true + }, + { + "name": "adj_open", + "type": "float", + "description": "The adjusted open price.", + "default": null, + "optional": true + }, + { + "name": "adj_high", + "type": "float", + "description": "The adjusted high price.", + "default": null, + "optional": true + }, + { + "name": "adj_low", + "type": "float", + "description": "The adjusted low price.", + "default": null, + "optional": true + }, + { + "name": "adj_close", + "type": "float", + "description": "The adjusted close price.", + "default": null, + "optional": true + }, + { + "name": "adj_volume", + "type": "float", + "description": "The adjusted volume.", + "default": null, + "optional": true + }, + { + "name": "fifty_two_week_high", + "type": "float", + "description": "52 week high price for the symbol.", + "default": null, + "optional": true + }, + { + "name": "fifty_two_week_low", + "type": "float", + "description": "52 week low price for the symbol.", + "default": null, + "optional": true + }, + { + "name": "factor", + "type": "float", + "description": "factor by which to multiply equity prices before this date, in order to calculate historically-adjusted equity prices.", + "default": null, + "optional": true + }, + { + "name": "split_ratio", + "type": "float", + "description": "Ratio of the equity split, if a split occurred.", + "default": null, + "optional": true + }, + { + "name": "dividend", + "type": "float", + "description": "Dividend amount, if a dividend was paid.", + "default": null, + "optional": true + }, + { + "name": "close_time", + "type": "datetime", + "description": "The timestamp that represents the end of the interval span.", + "default": null, + "optional": true + }, + { + "name": "interval", + "type": "str", + "description": "The data time frequency.", + "default": null, + "optional": true + }, + { + "name": "intra_period", + "type": "bool", + "description": "If true, the equity price represents an unfinished period (be it day, week, quarter, month, or year), meaning that the close price is the latest price available, not the official close price for the period", + "default": null, + "optional": true + } + ], + "polygon": [ + { + "name": "transactions", + "type": "Annotated[int, Gt(gt=0)]", + "description": "Number of transactions for the symbol in the time period.", + "default": null, + "optional": true + } + ], + "tiingo": [ + { + "name": "adj_open", + "type": "float", + "description": "The adjusted open price.", + "default": null, + "optional": true + }, + { + "name": "adj_high", + "type": "float", + "description": "The adjusted high price.", + "default": null, + "optional": true + }, + { + "name": "adj_low", + "type": "float", + "description": "The adjusted low price.", + "default": null, + "optional": true + }, + { + "name": "adj_close", + "type": "float", + "description": "The adjusted close price.", + "default": null, + "optional": true + }, + { + "name": "adj_volume", + "type": "float", + "description": "The adjusted volume.", + "default": null, + "optional": true + }, + { + "name": "split_ratio", + "type": "float", + "description": "Ratio of the equity split, if a split occurred.", + "default": null, + "optional": true + }, + { + "name": "dividend", + "type": "float", + "description": "Dividend amount, if a dividend was paid.", + "default": null, + "optional": true + } + ], + "yfinance": [ + { + "name": "split_ratio", + "type": "float", + "description": "Ratio of the equity split, if a split occurred.", + "default": null, + "optional": true + }, + { + "name": "dividend", + "type": "float", + "description": "Dividend amount (split-adjusted), if a dividend was paid.", + "default": null, + "optional": true + } + ] + }, + "model": "EquityHistorical" + }, + "/equity/price/performance": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get price performance data for a given stock. This includes price changes for different time periods.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.price.performance(symbol='AAPL', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[PricePerformance]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": null, + "optional": true + }, + { + "name": "one_day", + "type": "float", + "description": "One-day return.", + "default": null, + "optional": true + }, + { + "name": "wtd", + "type": "float", + "description": "Week to date return.", + "default": null, + "optional": true + }, + { + "name": "one_week", + "type": "float", + "description": "One-week return.", + "default": null, + "optional": true + }, + { + "name": "mtd", + "type": "float", + "description": "Month to date return.", + "default": null, + "optional": true + }, + { + "name": "one_month", + "type": "float", + "description": "One-month return.", + "default": null, + "optional": true + }, + { + "name": "qtd", + "type": "float", + "description": "Quarter to date return.", + "default": null, + "optional": true + }, + { + "name": "three_month", + "type": "float", + "description": "Three-month return.", + "default": null, + "optional": true + }, + { + "name": "six_month", + "type": "float", + "description": "Six-month return.", + "default": null, + "optional": true + }, + { + "name": "ytd", + "type": "float", + "description": "Year to date return.", + "default": null, + "optional": true + }, + { + "name": "one_year", + "type": "float", + "description": "One-year return.", + "default": null, + "optional": true + }, + { + "name": "two_year", + "type": "float", + "description": "Two-year return.", + "default": null, + "optional": true + }, + { + "name": "three_year", + "type": "float", + "description": "Three-year return.", + "default": null, + "optional": true + }, + { + "name": "four_year", + "type": "float", + "description": "Four-year", + "default": null, + "optional": true + }, + { + "name": "five_year", + "type": "float", + "description": "Five-year return.", + "default": null, + "optional": true + }, + { + "name": "ten_year", + "type": "float", + "description": "Ten-year return.", + "default": null, + "optional": true + }, + { + "name": "max", + "type": "float", + "description": "Return from the beginning of the time series.", + "default": null, + "optional": true + } + ], + "fmp": [] + }, + "model": "PricePerformance" + }, + "/equity/shorts/fails_to_deliver": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get reported Fail-to-deliver (FTD) data.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.shorts.fails_to_deliver(symbol='AAPL', provider='sec')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['sec']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'sec' if there is no default.", + "default": "sec", + "optional": true + } + ], + "sec": [ + { + "name": "limit", + "type": "int", + "description": "Limit the number of reports to parse, from most recent. Approximately 24 reports per year, going back to 2009.", + "default": 24, + "optional": true + }, + { + "name": "skip_reports", + "type": "int", + "description": "Skip N number of reports from current. A value of 1 will skip the most recent report.", + "default": 0, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EquityFTD]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['sec']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "settlement_date", + "type": "date", + "description": "The settlement date of the fail.", + "default": null, + "optional": true + }, + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": null, + "optional": true + }, + { + "name": "cusip", + "type": "str", + "description": "CUSIP of the Security.", + "default": null, + "optional": true + }, + { + "name": "quantity", + "type": "int", + "description": "The number of fails on that settlement date.", + "default": null, + "optional": true + }, + { + "name": "price", + "type": "float", + "description": "The price at the previous closing price from the settlement date.", + "default": null, + "optional": true + }, + { + "name": "description", + "type": "str", + "description": "The description of the Security.", + "default": null, + "optional": true + } + ], + "sec": [] + }, + "model": "EquityFTD" + }, + "/equity/search": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Search for stock symbol, CIK, LEI, or company name.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.search(provider='intrinio')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "query", + "type": "str", + "description": "Search query.", + "default": "", + "optional": true + }, + { + "name": "is_symbol", + "type": "bool", + "description": "Whether to search by ticker symbol.", + "default": false, + "optional": true + }, + { + "name": "use_cache", + "type": "bool", + "description": "Whether to use the cache or not.", + "default": true, + "optional": true + }, + { + "name": "provider", + "type": "Literal['intrinio', 'sec']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'intrinio' if there is no default.", + "default": "intrinio", + "optional": true + } + ], + "intrinio": [ + { + "name": "active", + "type": "bool", + "description": "When true, return companies that are actively traded (having stock prices within the past 14 days). When false, return companies that are not actively traded or never have been traded.", + "default": true, + "optional": true + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": 10000, + "optional": true + } + ], + "sec": [ + { + "name": "is_fund", + "type": "bool", + "description": "Whether to direct the search to the list of mutual funds and ETFs.", + "default": false, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EquitySearch]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['intrinio', 'sec']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": null, + "optional": true + }, + { + "name": "name", + "type": "str", + "description": "Name of the company.", + "default": "", + "optional": false + } + ], + "intrinio": [ + { + "name": "cik", + "type": "str", + "description": "", + "default": "", + "optional": false + }, + { + "name": "lei", + "type": "str", + "description": "The Legal Entity Identifier (LEI) of the company.", + "default": "", + "optional": false + }, + { + "name": "intrinio_id", + "type": "str", + "description": "The Intrinio ID of the company.", + "default": "", + "optional": false + } + ], + "sec": [ + { + "name": "cik", + "type": "str", + "description": "Central Index Key", + "default": "", + "optional": false + } + ] + }, + "model": "EquitySearch" + }, + "/equity/screener": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Screen for companies meeting various criteria.\n\nThese criteria include market cap, price, beta, volume, and dividend yield.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.screener(provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [ + { + "name": "mktcap_min", + "type": "int", + "description": "Filter by market cap greater than this value.", + "default": null, + "optional": true + }, + { + "name": "mktcap_max", + "type": "int", + "description": "Filter by market cap less than this value.", + "default": null, + "optional": true + }, + { + "name": "price_min", + "type": "float", + "description": "Filter by price greater than this value.", + "default": null, + "optional": true + }, + { + "name": "price_max", + "type": "float", + "description": "Filter by price less than this value.", + "default": null, + "optional": true + }, + { + "name": "beta_min", + "type": "float", + "description": "Filter by a beta greater than this value.", + "default": null, + "optional": true + }, + { + "name": "beta_max", + "type": "float", + "description": "Filter by a beta less than this value.", + "default": null, + "optional": true + }, + { + "name": "volume_min", + "type": "int", + "description": "Filter by volume greater than this value.", + "default": null, + "optional": true + }, + { + "name": "volume_max", + "type": "int", + "description": "Filter by volume less than this value.", + "default": null, + "optional": true + }, + { + "name": "dividend_min", + "type": "float", + "description": "Filter by dividend amount greater than this value.", + "default": null, + "optional": true + }, + { + "name": "dividend_max", + "type": "float", + "description": "Filter by dividend amount less than this value.", + "default": null, + "optional": true + }, + { + "name": "is_etf", + "type": "bool", + "description": "If true, returns only ETFs.", + "default": false, + "optional": true + }, + { + "name": "is_active", + "type": "bool", + "description": "If false, returns only inactive tickers.", + "default": true, + "optional": true + }, + { + "name": "sector", + "type": "Literal['Consumer Cyclical', 'Energy', 'Technology', 'Industrials', 'Financial Services', 'Basic Materials', 'Communication Services', 'Consumer Defensive', 'Healthcare', 'Real Estate', 'Utilities', 'Industrial Goods', 'Financial', 'Services', 'Conglomerates']", + "description": "Filter by sector.", + "default": null, + "optional": true + }, + { + "name": "industry", + "type": "str", + "description": "Filter by industry.", + "default": null, + "optional": true + }, + { + "name": "country", + "type": "str", + "description": "Filter by country, as a two-letter country code.", + "default": null, + "optional": true + }, + { + "name": "exchange", + "type": "Literal['amex', 'ams', 'ase', 'asx', 'ath', 'bme', 'bru', 'bud', 'bue', 'cai', 'cnq', 'cph', 'dfm', 'doh', 'etf', 'euronext', 'hel', 'hkse', 'ice', 'iob', 'ist', 'jkt', 'jnb', 'jpx', 'kls', 'koe', 'ksc', 'kuw', 'lse', 'mex', 'mutual_fund', 'nasdaq', 'neo', 'nse', 'nyse', 'nze', 'osl', 'otc', 'pnk', 'pra', 'ris', 'sao', 'sau', 'set', 'sgo', 'shh', 'shz', 'six', 'sto', 'tai', 'tlv', 'tsx', 'two', 'vie', 'wse', 'xetra']", + "description": "Filter by exchange.", + "default": null, + "optional": true + }, + { + "name": "limit", + "type": "int", + "description": "Limit the number of results to return.", + "default": 50000, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EquityScreener]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "name", + "type": "str", + "description": "Name of the company.", + "default": "", + "optional": false + } + ], + "fmp": [ + { + "name": "market_cap", + "type": "int", + "description": "The market cap of ticker.", + "default": null, + "optional": true + }, + { + "name": "sector", + "type": "str", + "description": "The sector the ticker belongs to.", + "default": null, + "optional": true + }, + { + "name": "industry", + "type": "str", + "description": "The industry ticker belongs to.", + "default": null, + "optional": true + }, + { + "name": "beta", + "type": "float", + "description": "The beta of the ETF.", + "default": null, + "optional": true + }, + { + "name": "price", + "type": "float", + "description": "The current price.", + "default": null, + "optional": true + }, + { + "name": "last_annual_dividend", + "type": "float", + "description": "The last annual amount dividend paid.", + "default": null, + "optional": true + }, + { + "name": "volume", + "type": "int", + "description": "The current trading volume.", + "default": null, + "optional": true + }, + { + "name": "exchange", + "type": "str", + "description": "The exchange code the asset trades on.", + "default": null, + "optional": true + }, + { + "name": "exchange_name", + "type": "str", + "description": "The full name of the primary exchange.", + "default": null, + "optional": true + }, + { + "name": "country", + "type": "str", + "description": "The two-letter country abbreviation where the head office is located.", + "default": null, + "optional": true + }, + { + "name": "is_etf", + "type": "Literal[True, False]", + "description": "Whether the ticker is an ETF.", + "default": null, + "optional": true + }, + { + "name": "actively_trading", + "type": "Literal[True, False]", + "description": "Whether the ETF is actively trading.", + "default": null, + "optional": true + } + ] + }, + "model": "EquityScreener" + }, + "/equity/profile": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get general information about a company. This includes company name, industry, sector and price data.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.profile(symbol='AAPL', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio, yfinance.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['fmp', 'intrinio', 'yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [], + "intrinio": [], + "yfinance": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EquityInfo]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'intrinio', 'yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "name", + "type": "str", + "description": "Common name of the company.", + "default": null, + "optional": true + }, + { + "name": "cik", + "type": "str", + "description": "Central Index Key (CIK) for the requested entity.", + "default": null, + "optional": true + }, + { + "name": "cusip", + "type": "str", + "description": "CUSIP identifier for the company.", + "default": null, + "optional": true + }, + { + "name": "isin", + "type": "str", + "description": "International Securities Identification Number.", + "default": null, + "optional": true + }, + { + "name": "lei", + "type": "str", + "description": "Legal Entity Identifier assigned to the company.", + "default": null, + "optional": true + }, + { + "name": "legal_name", + "type": "str", + "description": "Official legal name of the company.", + "default": null, + "optional": true + }, + { + "name": "stock_exchange", + "type": "str", + "description": "Stock exchange where the company is traded.", + "default": null, + "optional": true + }, + { + "name": "sic", + "type": "int", + "description": "Standard Industrial Classification code for the company.", + "default": null, + "optional": true + }, + { + "name": "short_description", + "type": "str", + "description": "Short description of the company.", + "default": null, + "optional": true + }, + { + "name": "long_description", + "type": "str", + "description": "Long description of the company.", + "default": null, + "optional": true + }, + { + "name": "ceo", + "type": "str", + "description": "Chief Executive Officer of the company.", + "default": null, + "optional": true + }, + { + "name": "company_url", + "type": "str", + "description": "URL of the company's website.", + "default": null, + "optional": true + }, + { + "name": "business_address", + "type": "str", + "description": "Address of the company's headquarters.", + "default": null, + "optional": true + }, + { + "name": "mailing_address", + "type": "str", + "description": "Mailing address of the company.", + "default": null, + "optional": true + }, + { + "name": "business_phone_no", + "type": "str", + "description": "Phone number of the company's headquarters.", + "default": null, + "optional": true + }, + { + "name": "hq_address1", + "type": "str", + "description": "Address of the company's headquarters.", + "default": null, + "optional": true + }, + { + "name": "hq_address2", + "type": "str", + "description": "Address of the company's headquarters.", + "default": null, + "optional": true + }, + { + "name": "hq_address_city", + "type": "str", + "description": "City of the company's headquarters.", + "default": null, + "optional": true + }, + { + "name": "hq_address_postal_code", + "type": "str", + "description": "Zip code of the company's headquarters.", + "default": null, + "optional": true + }, + { + "name": "hq_state", + "type": "str", + "description": "State of the company's headquarters.", + "default": null, + "optional": true + }, + { + "name": "hq_country", + "type": "str", + "description": "Country of the company's headquarters.", + "default": null, + "optional": true + }, + { + "name": "inc_state", + "type": "str", + "description": "State in which the company is incorporated.", + "default": null, + "optional": true + }, + { + "name": "inc_country", + "type": "str", + "description": "Country in which the company is incorporated.", + "default": null, + "optional": true + }, + { + "name": "employees", + "type": "int", + "description": "Number of employees working for the company.", + "default": null, + "optional": true + }, + { + "name": "entity_legal_form", + "type": "str", + "description": "Legal form of the company.", + "default": null, + "optional": true + }, + { + "name": "entity_status", + "type": "str", + "description": "Status of the company.", + "default": null, + "optional": true + }, + { + "name": "latest_filing_date", + "type": "date", + "description": "Date of the company's latest filing.", + "default": null, + "optional": true + }, + { + "name": "irs_number", + "type": "str", + "description": "IRS number assigned to the company.", + "default": null, + "optional": true + }, + { + "name": "sector", + "type": "str", + "description": "Sector in which the company operates.", + "default": null, + "optional": true + }, + { + "name": "industry_category", + "type": "str", + "description": "Category of industry in which the company operates.", + "default": null, + "optional": true + }, + { + "name": "industry_group", + "type": "str", + "description": "Group of industry in which the company operates.", + "default": null, + "optional": true + }, + { + "name": "template", + "type": "str", + "description": "Template used to standardize the company's financial statements.", + "default": null, + "optional": true + }, + { + "name": "standardized_active", + "type": "bool", + "description": "Whether the company is active or not.", + "default": null, + "optional": true + }, + { + "name": "first_fundamental_date", + "type": "date", + "description": "Date of the company's first fundamental.", + "default": null, + "optional": true + }, + { + "name": "last_fundamental_date", + "type": "date", + "description": "Date of the company's last fundamental.", + "default": null, + "optional": true + }, + { + "name": "first_stock_price_date", + "type": "date", + "description": "Date of the company's first stock price.", + "default": null, + "optional": true + }, + { + "name": "last_stock_price_date", + "type": "date", + "description": "Date of the company's last stock price.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "is_etf", + "type": "bool", + "description": "If the symbol is an ETF.", + "default": "", + "optional": false + }, + { + "name": "is_actively_trading", + "type": "bool", + "description": "If the company is actively trading.", + "default": "", + "optional": false + }, + { + "name": "is_adr", + "type": "bool", + "description": "If the stock is an ADR.", + "default": "", + "optional": false + }, + { + "name": "is_fund", + "type": "bool", + "description": "If the company is a fund.", + "default": "", + "optional": false + }, + { + "name": "image", + "type": "str", + "description": "Image of the company.", + "default": null, + "optional": true + }, + { + "name": "currency", + "type": "str", + "description": "Currency in which the stock is traded.", + "default": null, + "optional": true + }, + { + "name": "market_cap", + "type": "int", + "description": "Market capitalization of the company.", + "default": null, + "optional": true + }, + { + "name": "last_price", + "type": "float", + "description": "The last traded price.", + "default": null, + "optional": true + }, + { + "name": "year_high", + "type": "float", + "description": "The one-year high of the price.", + "default": null, + "optional": true + }, + { + "name": "year_low", + "type": "float", + "description": "The one-year low of the price.", + "default": null, + "optional": true + }, + { + "name": "volume_avg", + "type": "int", + "description": "Average daily trading volume.", + "default": null, + "optional": true + }, + { + "name": "annualized_dividend_amount", + "type": "float", + "description": "The annualized dividend payment based on the most recent regular dividend payment.", + "default": null, + "optional": true + }, + { + "name": "beta", + "type": "float", + "description": "Beta of the stock relative to the market.", + "default": null, + "optional": true + } + ], + "intrinio": [ + { + "name": "id", + "type": "str", + "description": "Intrinio ID for the company.", + "default": null, + "optional": true + }, + { + "name": "thea_enabled", + "type": "bool", + "description": "Whether the company has been enabled for Thea.", + "default": null, + "optional": true + } + ], + "yfinance": [ + { + "name": "exchange_timezone", + "type": "str", + "description": "The timezone of the exchange.", + "default": null, + "optional": true + }, + { + "name": "issue_type", + "type": "str", + "description": "The issuance type of the asset.", + "default": null, + "optional": true + }, + { + "name": "currency", + "type": "str", + "description": "The currency in which the asset is traded.", + "default": null, + "optional": true + }, + { + "name": "market_cap", + "type": "int", + "description": "The market capitalization of the asset.", + "default": null, + "optional": true + }, + { + "name": "shares_outstanding", + "type": "int", + "description": "The number of listed shares outstanding.", + "default": null, + "optional": true + }, + { + "name": "shares_float", + "type": "int", + "description": "The number of shares in the public float.", + "default": null, + "optional": true + }, + { + "name": "shares_implied_outstanding", + "type": "int", + "description": "Implied shares outstanding of common equityassuming the conversion of all convertible subsidiary equity into common.", + "default": null, + "optional": true + }, + { + "name": "shares_short", + "type": "int", + "description": "The reported number of shares short.", + "default": null, + "optional": true + }, + { + "name": "dividend_yield", + "type": "float", + "description": "The dividend yield of the asset, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "beta", + "type": "float", + "description": "The beta of the asset relative to the broad market.", + "default": null, + "optional": true + } + ] + }, + "model": "EquityInfo" + }, + "/equity/market_snapshots": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get an updated equity market snapshot. This includes price data for thousands of stocks.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.equity.market_snapshots(provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "provider", + "type": "Literal['fmp', 'intrinio', 'polygon']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [ + { + "name": "market", + "type": "Literal['amex', 'ams', 'ase', 'asx', 'ath', 'bme', 'bru', 'bud', 'bue', 'cai', 'cnq', 'cph', 'dfm', 'doh', 'etf', 'euronext', 'hel', 'hkse', 'ice', 'iob', 'ist', 'jkt', 'jnb', 'jpx', 'kls', 'koe', 'ksc', 'kuw', 'lse', 'mex', 'mutual_fund', 'nasdaq', 'neo', 'nse', 'nyse', 'nze', 'osl', 'otc', 'pnk', 'pra', 'ris', 'sao', 'sau', 'set', 'sgo', 'shh', 'shz', 'six', 'sto', 'tai', 'tlv', 'tsx', 'two', 'vie', 'wse', 'xetra']", + "description": "The market to fetch data for.", + "default": "nasdaq", + "optional": true + } + ], + "intrinio": [ + { + "name": "date", + "type": "Union[Union[date, datetime, str], str]", + "description": "The date of the data. Can be a datetime or an ISO datetime string. Historical data appears to go back to mid-June 2022. Example: '2024-03-08T12:15:00+0400'", + "default": null, + "optional": true + } + ], + "polygon": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[MarketSnapshots]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'intrinio', 'polygon']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "open", + "type": "float", + "description": "The open price.", + "default": null, + "optional": true + }, + { + "name": "high", + "type": "float", + "description": "The high price.", + "default": null, + "optional": true + }, + { + "name": "low", + "type": "float", + "description": "The low price.", + "default": null, + "optional": true + }, + { + "name": "close", + "type": "float", + "description": "The close price.", + "default": null, + "optional": true + }, + { + "name": "volume", + "type": "int", + "description": "The trading volume.", + "default": null, + "optional": true + }, + { + "name": "prev_close", + "type": "float", + "description": "The previous close price.", + "default": null, + "optional": true + }, + { + "name": "change", + "type": "float", + "description": "The change in price from the previous close.", + "default": null, + "optional": true + }, + { + "name": "change_percent", + "type": "float", + "description": "The change in price from the previous close, as a normalized percent.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "last_price", + "type": "float", + "description": "The last price of the stock.", + "default": null, + "optional": true + }, + { + "name": "last_price_timestamp", + "type": "Union[date, datetime]", + "description": "The timestamp of the last price.", + "default": null, + "optional": true + }, + { + "name": "ma50", + "type": "float", + "description": "The 50-day moving average.", + "default": null, + "optional": true + }, + { + "name": "ma200", + "type": "float", + "description": "The 200-day moving average.", + "default": null, + "optional": true + }, + { + "name": "year_high", + "type": "float", + "description": "The 52-week high.", + "default": null, + "optional": true + }, + { + "name": "year_low", + "type": "float", + "description": "The 52-week low.", + "default": null, + "optional": true + }, + { + "name": "volume_avg", + "type": "int", + "description": "Average daily trading volume.", + "default": null, + "optional": true + }, + { + "name": "market_cap", + "type": "int", + "description": "Market cap of the stock.", + "default": null, + "optional": true + }, + { + "name": "eps", + "type": "float", + "description": "Earnings per share.", + "default": null, + "optional": true + }, + { + "name": "pe", + "type": "float", + "description": "Price to earnings ratio.", + "default": null, + "optional": true + }, + { + "name": "shares_outstanding", + "type": "int", + "description": "Number of shares outstanding.", + "default": null, + "optional": true + }, + { + "name": "name", + "type": "str", + "description": "The company name associated with the symbol.", + "default": null, + "optional": true + }, + { + "name": "exchange", + "type": "str", + "description": "The exchange of the stock.", + "default": null, + "optional": true + }, + { + "name": "earnings_date", + "type": "Union[date, datetime]", + "description": "The upcoming earnings announcement date.", + "default": null, + "optional": true + } + ], + "intrinio": [ + { + "name": "last_price", + "type": "float", + "description": "The last trade price.", + "default": null, + "optional": true + }, + { + "name": "last_size", + "type": "int", + "description": "The last trade size.", + "default": null, + "optional": true + }, + { + "name": "last_volume", + "type": "int", + "description": "The last trade volume.", + "default": null, + "optional": true + }, + { + "name": "last_trade_timestamp", + "type": "datetime", + "description": "The timestamp of the last trade.", + "default": null, + "optional": true + }, + { + "name": "bid_size", + "type": "int", + "description": "The size of the last bid price. Bid price and size is not always available.", + "default": null, + "optional": true + }, + { + "name": "bid_price", + "type": "float", + "description": "The last bid price. Bid price and size is not always available.", + "default": null, + "optional": true + }, + { + "name": "ask_price", + "type": "float", + "description": "The last ask price. Ask price and size is not always available.", + "default": null, + "optional": true + }, + { + "name": "ask_size", + "type": "int", + "description": "The size of the last ask price. Ask price and size is not always available.", + "default": null, + "optional": true + }, + { + "name": "last_bid_timestamp", + "type": "datetime", + "description": "The timestamp of the last bid price. Bid price and size is not always available.", + "default": null, + "optional": true + }, + { + "name": "last_ask_timestamp", + "type": "datetime", + "description": "The timestamp of the last ask price. Ask price and size is not always available.", + "default": null, + "optional": true + } + ], + "polygon": [ + { + "name": "vwap", + "type": "float", + "description": "The volume weighted average price of the stock on the current trading day.", + "default": null, + "optional": true + }, + { + "name": "prev_open", + "type": "float", + "description": "The previous trading session opening price.", + "default": null, + "optional": true + }, + { + "name": "prev_high", + "type": "float", + "description": "The previous trading session high price.", + "default": null, + "optional": true + }, + { + "name": "prev_low", + "type": "float", + "description": "The previous trading session low price.", + "default": null, + "optional": true + }, + { + "name": "prev_volume", + "type": "float", + "description": "The previous trading session volume.", + "default": null, + "optional": true + }, + { + "name": "prev_vwap", + "type": "float", + "description": "The previous trading session VWAP.", + "default": null, + "optional": true + }, + { + "name": "last_updated", + "type": "datetime", + "description": "The last time the data was updated.", + "default": "", + "optional": false + }, + { + "name": "bid", + "type": "float", + "description": "The current bid price.", + "default": null, + "optional": true + }, + { + "name": "bid_size", + "type": "int", + "description": "The current bid size.", + "default": null, + "optional": true + }, + { + "name": "ask_size", + "type": "int", + "description": "The current ask size.", + "default": null, + "optional": true + }, + { + "name": "ask", + "type": "float", + "description": "The current ask price.", + "default": null, + "optional": true + }, + { + "name": "quote_timestamp", + "type": "datetime", + "description": "The timestamp of the last quote.", + "default": null, + "optional": true + }, + { + "name": "last_trade_price", + "type": "float", + "description": "The last trade price.", + "default": null, + "optional": true + }, + { + "name": "last_trade_size", + "type": "int", + "description": "The last trade size.", + "default": null, + "optional": true + }, + { + "name": "last_trade_conditions", + "type": "List[int]", + "description": "The last trade condition codes.", + "default": null, + "optional": true + }, + { + "name": "last_trade_exchange", + "type": "int", + "description": "The last trade exchange ID code.", + "default": null, + "optional": true + }, + { + "name": "last_trade_timestamp", + "type": "datetime", + "description": "The last trade timestamp.", + "default": null, + "optional": true + } + ] + }, + "model": "MarketSnapshots" + }, + "/etf/search": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Search for ETFs.\n\nAn empty query returns the full list of ETFs from the provider.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\n# An empty query returns the full list of ETFs from the provider.\nobb.etf.search(provider='fmp')\n# The query will return results from text-based fields containing the term.\nobb.etf.search(query='commercial real estate', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "query", + "type": "str", + "description": "Search query.", + "default": "", + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp', 'intrinio']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [ + { + "name": "exchange", + "type": "Literal['AMEX', 'NYSE', 'NASDAQ', 'ETF', 'TSX', 'EURONEXT']", + "description": "The exchange code the ETF trades on.", + "default": null, + "optional": true + }, + { + "name": "is_active", + "type": "Literal[True, False]", + "description": "Whether the ETF is actively trading.", + "default": null, + "optional": true + } + ], + "intrinio": [ + { + "name": "exchange", + "type": "Literal['xnas', 'arcx', 'bats', 'xnys', 'bvmf', 'xshg', 'xshe', 'xhkg', 'xbom', 'xnse', 'xidx', 'tase', 'xkrx', 'xkls', 'xmex', 'xses', 'roco', 'xtai', 'xbkk', 'xist']", + "description": "Target a specific exchange by providing the MIC code.", + "default": null, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EtfSearch]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'intrinio']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.(ETF)", + "default": "", + "optional": false + }, + { + "name": "name", + "type": "str", + "description": "Name of the ETF.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "market_cap", + "type": "float", + "description": "The market cap of the ETF.", + "default": null, + "optional": true + }, + { + "name": "sector", + "type": "str", + "description": "The sector of the ETF.", + "default": null, + "optional": true + }, + { + "name": "industry", + "type": "str", + "description": "The industry of the ETF.", + "default": null, + "optional": true + }, + { + "name": "beta", + "type": "float", + "description": "The beta of the ETF.", + "default": null, + "optional": true + }, + { + "name": "price", + "type": "float", + "description": "The current price of the ETF.", + "default": null, + "optional": true + }, + { + "name": "last_annual_dividend", + "type": "float", + "description": "The last annual dividend paid.", + "default": null, + "optional": true + }, + { + "name": "volume", + "type": "float", + "description": "The current trading volume of the ETF.", + "default": null, + "optional": true + }, + { + "name": "exchange", + "type": "str", + "description": "The exchange code the ETF trades on.", + "default": null, + "optional": true + }, + { + "name": "exchange_name", + "type": "str", + "description": "The full name of the exchange the ETF trades on.", + "default": null, + "optional": true + }, + { + "name": "country", + "type": "str", + "description": "The country the ETF is registered in.", + "default": null, + "optional": true + }, + { + "name": "actively_trading", + "type": "Literal[True, False]", + "description": "Whether the ETF is actively trading.", + "default": null, + "optional": true + } + ], + "intrinio": [ + { + "name": "exchange", + "type": "str", + "description": "The exchange MIC code.", + "default": null, + "optional": true + }, + { + "name": "figi_ticker", + "type": "str", + "description": "The OpenFIGI ticker.", + "default": null, + "optional": true + }, + { + "name": "ric", + "type": "str", + "description": "The Reuters Instrument Code.", + "default": null, + "optional": true + }, + { + "name": "isin", + "type": "str", + "description": "The International Securities Identification Number.", + "default": null, + "optional": true + }, + { + "name": "sedol", + "type": "str", + "description": "The Stock Exchange Daily Official List.", + "default": null, + "optional": true + }, + { + "name": "intrinio_id", + "type": "str", + "description": "The unique Intrinio ID for the security.", + "default": null, + "optional": true + } + ] + }, + "model": "EtfSearch" + }, + "/etf/historical": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "ETF Historical Market Price.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.etf.historical(symbol='SPY', provider='fmp')\nobb.etf.historical(symbol='SPY', provider='yfinance')\n# This function accepts multiple tickers.\nobb.etf.historical(symbol='SPY,IWM,QQQ,DJIA', provider='yfinance')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, polygon, tiingo, yfinance.", + "default": "", + "optional": false + }, + { + "name": "interval", + "type": "str", + "description": "Time interval of the data to return.", + "default": "1d", + "optional": true + }, + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp', 'intrinio', 'polygon', 'tiingo', 'yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [], + "intrinio": [ + { + "name": "start_time", + "type": "datetime.time", + "description": "Return intervals starting at the specified time on the `start_date` formatted as 'HH:MM:SS'.", + "default": null, + "optional": true + }, + { + "name": "end_time", + "type": "datetime.time", + "description": "Return intervals stopping at the specified time on the `end_date` formatted as 'HH:MM:SS'.", + "default": null, + "optional": true + }, + { + "name": "timezone", + "type": "str", + "description": "Timezone of the data, in the IANA format (Continent/City).", + "default": "America/New_York", + "optional": true + }, + { + "name": "source", + "type": "Literal['realtime', 'delayed', 'nasdaq_basic']", + "description": "The source of the data.", + "default": "realtime", + "optional": true + } + ], + "polygon": [ + { + "name": "adjustment", + "type": "Literal['splits_only', 'unadjusted']", + "description": "The adjustment factor to apply. Default is splits only.", + "default": "splits_only", + "optional": true + }, + { + "name": "extended_hours", + "type": "bool", + "description": "Include Pre and Post market data.", + "default": false, + "optional": true + }, + { + "name": "sort", + "type": "Literal['asc', 'desc']", + "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date.", + "default": "asc", + "optional": true + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": 49999, + "optional": true + } + ], + "tiingo": [], + "yfinance": [ + { + "name": "extended_hours", + "type": "bool", + "description": "Include Pre and Post market data.", + "default": false, + "optional": true + }, + { + "name": "include_actions", + "type": "bool", + "description": "Include dividends and stock splits in results.", + "default": true, + "optional": true + }, + { + "name": "adjustment", + "type": "Literal['splits_only', 'splits_and_dividends']", + "description": "The adjustment factor to apply. Default is splits only.", + "default": "splits_only", + "optional": true + }, + { + "name": "adjusted", + "type": "bool", + "description": "This field is deprecated (4.1.5) and will be removed in a future version. Use 'adjustment' set as 'splits_and_dividends' instead.", + "default": false, + "optional": true + }, + { + "name": "prepost", + "type": "bool", + "description": "This field is deprecated (4.1.5) and will be removed in a future version. Use 'extended_hours' as True instead.", + "default": false, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EtfHistorical]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'intrinio', 'polygon', 'tiingo', 'yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "Union[date, datetime]", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "open", + "type": "float", + "description": "The open price.", + "default": "", + "optional": false + }, + { + "name": "high", + "type": "float", + "description": "The high price.", + "default": "", + "optional": false + }, + { + "name": "low", + "type": "float", + "description": "The low price.", + "default": "", + "optional": false + }, + { + "name": "close", + "type": "float", + "description": "The close price.", + "default": "", + "optional": false + }, + { + "name": "volume", + "type": "Union[float, int]", + "description": "The trading volume.", + "default": null, + "optional": true + }, + { + "name": "vwap", + "type": "float", + "description": "Volume Weighted Average Price over the period.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "adj_close", + "type": "float", + "description": "The adjusted close price.", + "default": null, + "optional": true + }, + { + "name": "unadjusted_volume", + "type": "float", + "description": "Unadjusted volume of the symbol.", + "default": null, + "optional": true + }, + { + "name": "change", + "type": "float", + "description": "Change in the price from the previous close.", + "default": null, + "optional": true + }, + { + "name": "change_percent", + "type": "float", + "description": "Change in the price from the previous close, as a normalized percent.", + "default": null, + "optional": true + } + ], + "intrinio": [ + { + "name": "average", + "type": "float", + "description": "Average trade price of an individual equity during the interval.", + "default": null, + "optional": true + }, + { + "name": "change", + "type": "float", + "description": "Change in the price of the symbol from the previous day.", + "default": null, + "optional": true + }, + { + "name": "change_percent", + "type": "float", + "description": "Percent change in the price of the symbol from the previous day.", + "default": null, + "optional": true + }, + { + "name": "adj_open", + "type": "float", + "description": "The adjusted open price.", + "default": null, + "optional": true + }, + { + "name": "adj_high", + "type": "float", + "description": "The adjusted high price.", + "default": null, + "optional": true + }, + { + "name": "adj_low", + "type": "float", + "description": "The adjusted low price.", + "default": null, + "optional": true + }, + { + "name": "adj_close", + "type": "float", + "description": "The adjusted close price.", + "default": null, + "optional": true + }, + { + "name": "adj_volume", + "type": "float", + "description": "The adjusted volume.", + "default": null, + "optional": true + }, + { + "name": "fifty_two_week_high", + "type": "float", + "description": "52 week high price for the symbol.", + "default": null, + "optional": true + }, + { + "name": "fifty_two_week_low", + "type": "float", + "description": "52 week low price for the symbol.", + "default": null, + "optional": true + }, + { + "name": "factor", + "type": "float", + "description": "factor by which to multiply equity prices before this date, in order to calculate historically-adjusted equity prices.", + "default": null, + "optional": true + }, + { + "name": "split_ratio", + "type": "float", + "description": "Ratio of the equity split, if a split occurred.", + "default": null, + "optional": true + }, + { + "name": "dividend", + "type": "float", + "description": "Dividend amount, if a dividend was paid.", + "default": null, + "optional": true + }, + { + "name": "close_time", + "type": "datetime", + "description": "The timestamp that represents the end of the interval span.", + "default": null, + "optional": true + }, + { + "name": "interval", + "type": "str", + "description": "The data time frequency.", + "default": null, + "optional": true + }, + { + "name": "intra_period", + "type": "bool", + "description": "If true, the equity price represents an unfinished period (be it day, week, quarter, month, or year), meaning that the close price is the latest price available, not the official close price for the period", + "default": null, + "optional": true + } + ], + "polygon": [ + { + "name": "transactions", + "type": "Annotated[int, Gt(gt=0)]", + "description": "Number of transactions for the symbol in the time period.", + "default": null, + "optional": true + } + ], + "tiingo": [ + { + "name": "adj_open", + "type": "float", + "description": "The adjusted open price.", + "default": null, + "optional": true + }, + { + "name": "adj_high", + "type": "float", + "description": "The adjusted high price.", + "default": null, + "optional": true + }, + { + "name": "adj_low", + "type": "float", + "description": "The adjusted low price.", + "default": null, + "optional": true + }, + { + "name": "adj_close", + "type": "float", + "description": "The adjusted close price.", + "default": null, + "optional": true + }, + { + "name": "adj_volume", + "type": "float", + "description": "The adjusted volume.", + "default": null, + "optional": true + }, + { + "name": "split_ratio", + "type": "float", + "description": "Ratio of the equity split, if a split occurred.", + "default": null, + "optional": true + }, + { + "name": "dividend", + "type": "float", + "description": "Dividend amount, if a dividend was paid.", + "default": null, + "optional": true + } + ], + "yfinance": [ + { + "name": "split_ratio", + "type": "float", + "description": "Ratio of the equity split, if a split occurred.", + "default": null, + "optional": true + }, + { + "name": "dividend", + "type": "float", + "description": "Dividend amount (split-adjusted), if a dividend was paid.", + "default": null, + "optional": true + } + ] + }, + "model": "EtfHistorical" + }, + "/etf/info": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "ETF Information Overview.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.etf.info(symbol='SPY', provider='fmp')\n# This function accepts multiple tickers.\nobb.etf.info(symbol='SPY,IWM,QQQ,DJIA', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. (ETF) Multiple items allowed for provider(s): fmp, intrinio, yfinance.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['fmp', 'intrinio', 'yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [], + "intrinio": [], + "yfinance": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EtfInfo]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'intrinio', 'yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data. (ETF)", + "default": "", + "optional": false + }, + { + "name": "name", + "type": "str", + "description": "Name of the ETF.", + "default": "", + "optional": false + }, + { + "name": "description", + "type": "str", + "description": "Description of the fund.", + "default": null, + "optional": true + }, + { + "name": "inception_date", + "type": "str", + "description": "Inception date of the ETF.", + "default": "", + "optional": false + } + ], + "fmp": [ + { + "name": "issuer", + "type": "str", + "description": "Company of the ETF.", + "default": null, + "optional": true + }, + { + "name": "cusip", + "type": "str", + "description": "CUSIP of the ETF.", + "default": null, + "optional": true + }, + { + "name": "isin", + "type": "str", + "description": "ISIN of the ETF.", + "default": null, + "optional": true + }, + { + "name": "domicile", + "type": "str", + "description": "Domicile of the ETF.", + "default": null, + "optional": true + }, + { + "name": "asset_class", + "type": "str", + "description": "Asset class of the ETF.", + "default": null, + "optional": true + }, + { + "name": "aum", + "type": "float", + "description": "Assets under management.", + "default": null, + "optional": true + }, + { + "name": "nav", + "type": "float", + "description": "Net asset value of the ETF.", + "default": null, + "optional": true + }, + { + "name": "nav_currency", + "type": "str", + "description": "Currency of the ETF's net asset value.", + "default": null, + "optional": true + }, + { + "name": "expense_ratio", + "type": "float", + "description": "The expense ratio, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "holdings_count", + "type": "int", + "description": "Number of holdings.", + "default": null, + "optional": true + }, + { + "name": "avg_volume", + "type": "float", + "description": "Average daily trading volume.", + "default": null, + "optional": true + }, + { + "name": "website", + "type": "str", + "description": "Website of the issuer.", + "default": null, + "optional": true + } + ], + "intrinio": [ + { + "name": "fund_listing_date", + "type": "date", + "description": "The date on which the Exchange Traded Product (ETP) or share class of the ETP is listed on a specific exchange.", + "default": null, + "optional": true + }, + { + "name": "data_change_date", + "type": "date", + "description": "The last date on which there was a change in a classifications data field for this ETF.", + "default": null, + "optional": true + }, + { + "name": "etn_maturity_date", + "type": "date", + "description": "If the product is an ETN, this field identifies the maturity date for the ETN.", + "default": null, + "optional": true + }, + { + "name": "is_listed", + "type": "bool", + "description": "If true, the ETF is still listed on an exchange.", + "default": null, + "optional": true + }, + { + "name": "close_date", + "type": "date", + "description": "The date on which the ETF was de-listed if it is no longer listed.", + "default": null, + "optional": true + }, + { + "name": "exchange", + "type": "str", + "description": "The exchange Market Identifier Code (MIC).", + "default": null, + "optional": true + }, + { + "name": "isin", + "type": "str", + "description": "International Securities Identification Number (ISIN).", + "default": null, + "optional": true + }, + { + "name": "ric", + "type": "str", + "description": "Reuters Instrument Code (RIC).", + "default": null, + "optional": true + }, + { + "name": "sedol", + "type": "str", + "description": "Stock Exchange Daily Official List (SEDOL).", + "default": null, + "optional": true + }, + { + "name": "figi_symbol", + "type": "str", + "description": "Financial Instrument Global Identifier (FIGI) symbol.", + "default": null, + "optional": true + }, + { + "name": "share_class_figi", + "type": "str", + "description": "Financial Instrument Global Identifier (FIGI).", + "default": null, + "optional": true + }, + { + "name": "firstbridge_id", + "type": "str", + "description": "The FirstBridge unique identifier for the Exchange Traded Fund (ETF).", + "default": null, + "optional": true + }, + { + "name": "firstbridge_parent_id", + "type": "str", + "description": "The FirstBridge unique identifier for the parent Exchange Traded Fund (ETF), if applicable.", + "default": null, + "optional": true + }, + { + "name": "intrinio_id", + "type": "str", + "description": "Intrinio unique identifier for the security.", + "default": null, + "optional": true + }, + { + "name": "intraday_nav_symbol", + "type": "str", + "description": "Intraday Net Asset Value (NAV) symbol.", + "default": null, + "optional": true + }, + { + "name": "primary_symbol", + "type": "str", + "description": "The primary ticker field is used for Exchange Traded Products (ETPs) that have multiple listings and share classes. If an ETP has multiple listings or share classes, the same primary ticker is assigned to all the listings and share classes.", + "default": null, + "optional": true + }, + { + "name": "etp_structure_type", + "type": "str", + "description": "Classifies Exchange Traded Products (ETPs) into very broad categories based on its legal structure.", + "default": null, + "optional": true + }, + { + "name": "legal_structure", + "type": "str", + "description": "Legal structure of the fund.", + "default": null, + "optional": true + }, + { + "name": "issuer", + "type": "str", + "description": "Issuer of the ETF.", + "default": null, + "optional": true + }, + { + "name": "etn_issuing_bank", + "type": "str", + "description": "If the product is an Exchange Traded Note (ETN), this field identifies the issuing bank.", + "default": null, + "optional": true + }, + { + "name": "fund_family", + "type": "str", + "description": "This field identifies the fund family to which the ETF belongs, as categorized by the ETF Sponsor.", + "default": null, + "optional": true + }, + { + "name": "investment_style", + "type": "str", + "description": "Investment style of the ETF.", + "default": null, + "optional": true + }, + { + "name": "derivatives_based", + "type": "str", + "description": "This field is populated if the ETF holds either listed or over-the-counter derivatives in its portfolio.", + "default": null, + "optional": true + }, + { + "name": "income_category", + "type": "str", + "description": "Identifies if an Exchange Traded Fund (ETF) falls into a category that is specifically designed to provide a high yield or income", + "default": null, + "optional": true + }, + { + "name": "asset_class", + "type": "str", + "description": "Captures the underlying nature of the securities in the Exchanged Traded Product (ETP).", + "default": null, + "optional": true + }, + { + "name": "other_asset_types", + "type": "str", + "description": "If 'asset_class' field is classified as 'Other Asset Types' this field captures the specific category of the underlying assets.", + "default": null, + "optional": true + }, + { + "name": "single_category_designation", + "type": "str", + "description": "This categorization is created for those users who want every ETF to be 'forced' into a single bucket, so that the assets for all categories will always sum to the total market.", + "default": null, + "optional": true + }, + { + "name": "beta_type", + "type": "str", + "description": "This field identifies whether an ETF provides 'Traditional' beta exposure or 'Smart' beta exposure. ETFs that are active (i.e. non-indexed), leveraged / inverse or have a proprietary quant model (i.e. that don't provide indexed exposure to a targeted factor) are classified separately.", + "default": null, + "optional": true + }, + { + "name": "beta_details", + "type": "str", + "description": "This field provides further detail within the traditional and smart beta categories.", + "default": null, + "optional": true + }, + { + "name": "market_cap_range", + "type": "str", + "description": "Equity ETFs are classified as falling into categories based on the description of their investment strategy in the prospectus. Examples ('Mega Cap', 'Large Cap', 'Mid Cap', etc.)", + "default": null, + "optional": true + }, + { + "name": "market_cap_weighting_type", + "type": "str", + "description": "For ETFs that take the value 'Market Cap Weighted' in the 'index_weighting_scheme' field, this field provides detail on the market cap weighting type.", + "default": null, + "optional": true + }, + { + "name": "index_weighting_scheme", + "type": "str", + "description": "For ETFs that track an underlying index, this field provides detail on the index weighting type.", + "default": null, + "optional": true + }, + { + "name": "index_linked", + "type": "str", + "description": "This field identifies whether an ETF is index linked or active.", + "default": null, + "optional": true + }, + { + "name": "index_name", + "type": "str", + "description": "This field identifies the name of the underlying index tracked by the ETF, if applicable.", + "default": null, + "optional": true + }, + { + "name": "index_symbol", + "type": "str", + "description": "This field identifies the OpenFIGI ticker for the Index underlying the ETF.", + "default": null, + "optional": true + }, + { + "name": "parent_index", + "type": "str", + "description": "This field identifies the name of the parent index, which represents the broader universe from which the index underlying the ETF is created, if applicable.", + "default": null, + "optional": true + }, + { + "name": "index_family", + "type": "str", + "description": "This field identifies the index family to which the index underlying the ETF belongs. The index family is represented as categorized by the index provider.", + "default": null, + "optional": true + }, + { + "name": "broader_index_family", + "type": "str", + "description": "This field identifies the broader index family to which the index underlying the ETF belongs. The broader index family is represented as categorized by the index provider.", + "default": null, + "optional": true + }, + { + "name": "index_provider", + "type": "str", + "description": "This field identifies the Index provider for the index underlying the ETF, if applicable.", + "default": null, + "optional": true + }, + { + "name": "index_provider_code", + "type": "str", + "description": "This field provides the First Bridge code for each Index provider, corresponding to the index underlying the ETF if applicable.", + "default": null, + "optional": true + }, + { + "name": "replication_structure", + "type": "str", + "description": "The replication structure of the Exchange Traded Product (ETP).", + "default": null, + "optional": true + }, + { + "name": "growth_value_tilt", + "type": "str", + "description": "Classifies equity ETFs as either 'Growth' or Value' based on the stated style tilt in the ETF prospectus. Equity ETFs that do not have a stated style tilt are classified as 'Core / Blend'.", + "default": null, + "optional": true + }, + { + "name": "growth_type", + "type": "str", + "description": "For ETFs that are classified as 'Growth' in 'growth_value_tilt', this field further identifies those where the stocks in the ETF are both selected and weighted based on their growth (style factor) scores.", + "default": null, + "optional": true + }, + { + "name": "value_type", + "type": "str", + "description": "For ETFs that are classified as 'Value' in 'growth_value_tilt', this field further identifies those where the stocks in the ETF are both selected and weighted based on their value (style factor) scores.", + "default": null, + "optional": true + }, + { + "name": "sector", + "type": "str", + "description": "For equity ETFs that aim to provide targeted exposure to a sector or industry, this field identifies the Sector that it provides the exposure to.", + "default": null, + "optional": true + }, + { + "name": "industry", + "type": "str", + "description": "For equity ETFs that aim to provide targeted exposure to an industry, this field identifies the Industry that it provides the exposure to.", + "default": null, + "optional": true + }, + { + "name": "industry_group", + "type": "str", + "description": "For equity ETFs that aim to provide targeted exposure to a sub-industry, this field identifies the sub-Industry that it provides the exposure to.", + "default": null, + "optional": true + }, + { + "name": "cross_sector_theme", + "type": "str", + "description": "For equity ETFs that aim to provide targeted exposure to a specific investment theme that cuts across GICS sectors, this field identifies the specific cross-sector theme. Examples ('Agri-business', 'Natural Resources', 'Green Investing', etc.)", + "default": null, + "optional": true + }, + { + "name": "natural_resources_type", + "type": "str", + "description": "For ETFs that are classified as 'Natural Resources' in the 'cross_sector_theme' field, this field provides further detail on the type of Natural Resources exposure.", + "default": null, + "optional": true + }, + { + "name": "us_or_excludes_us", + "type": "str", + "description": "Takes the value of 'Domestic' for US exposure, 'International' for non-US exposure and 'Global' for exposure that includes all regions including the US.", + "default": null, + "optional": true + }, + { + "name": "developed_emerging", + "type": "str", + "description": "This field identifies the stage of development of the markets that the ETF provides exposure to.", + "default": null, + "optional": true + }, + { + "name": "specialized_region", + "type": "str", + "description": "This field is populated if the ETF provides targeted exposure to a specific type of geography-based grouping that does not fall into a specific country or continent grouping. Examples ('BRIC', 'Chindia', etc.)", + "default": null, + "optional": true + }, + { + "name": "continent", + "type": "str", + "description": "This field is populated if the ETF provides targeted exposure to a specific continent or country within that Continent.", + "default": null, + "optional": true + }, + { + "name": "latin_america_sub_group", + "type": "str", + "description": "For ETFs that are classified as 'Latin America' in the 'continent' field, this field provides further detail on the type of regional exposure.", + "default": null, + "optional": true + }, + { + "name": "europe_sub_group", + "type": "str", + "description": "For ETFs that are classified as 'Europe' in the 'continent' field, this field provides further detail on the type of regional exposure.", + "default": null, + "optional": true + }, + { + "name": "asia_sub_group", + "type": "str", + "description": "For ETFs that are classified as 'Asia' in the 'continent' field, this field provides further detail on the type of regional exposure.", + "default": null, + "optional": true + }, + { + "name": "specific_country", + "type": "str", + "description": "This field is populated if the ETF provides targeted exposure to a specific country.", + "default": null, + "optional": true + }, + { + "name": "china_listing_location", + "type": "str", + "description": "For ETFs that are classified as 'China' in the 'country' field, this field provides further detail on the type of exposure in the underlying securities.", + "default": null, + "optional": true + }, + { + "name": "us_state", + "type": "str", + "description": "Takes the value of a US state if the ETF provides targeted exposure to the municipal bonds or equities of companies.", + "default": null, + "optional": true + }, + { + "name": "real_estate", + "type": "str", + "description": "For ETFs that provide targeted real estate exposure, this field is populated if the ETF provides targeted exposure to a specific segment of the real estate market.", + "default": null, + "optional": true + }, + { + "name": "fundamental_weighting_type", + "type": "str", + "description": "For ETFs that take the value 'Fundamental Weighted' in the 'index_weighting_scheme' field, this field provides detail on the fundamental weighting methodology.", + "default": null, + "optional": true + }, + { + "name": "dividend_weighting_type", + "type": "str", + "description": "For ETFs that take the value 'Dividend Weighted' in the 'index_weighting_scheme' field, this field provides detail on the dividend weighting methodology.", + "default": null, + "optional": true + }, + { + "name": "bond_type", + "type": "str", + "description": "For ETFs where 'asset_class_type' is 'Bonds', this field provides detail on the type of bonds held in the ETF.", + "default": null, + "optional": true + }, + { + "name": "government_bond_types", + "type": "str", + "description": "For bond ETFs that take the value 'Treasury & Government' in 'bond_type', this field provides detail on the exposure.", + "default": null, + "optional": true + }, + { + "name": "municipal_bond_region", + "type": "str", + "description": "For bond ETFs that take the value 'Municipal' in 'bond_type', this field provides additional detail on the geographic exposure.", + "default": null, + "optional": true + }, + { + "name": "municipal_vrdo", + "type": "bool", + "description": "For bond ETFs that take the value 'Municipal' in 'bond_type', this field identifies those ETFs that specifically provide exposure to Variable Rate Demand Obligations.", + "default": null, + "optional": true + }, + { + "name": "mortgage_bond_types", + "type": "str", + "description": "For bond ETFs that take the value 'Mortgage' in 'bond_type', this field provides additional detail on the type of underlying securities.", + "default": null, + "optional": true + }, + { + "name": "bond_tax_status", + "type": "str", + "description": "For all US bond ETFs, this field provides additional detail on the tax treatment of the underlying securities.", + "default": null, + "optional": true + }, + { + "name": "credit_quality", + "type": "str", + "description": "For all bond ETFs, this field helps to identify if the ETF provides targeted exposure to securities of a specific credit quality range.", + "default": null, + "optional": true + }, + { + "name": "average_maturity", + "type": "str", + "description": "For all bond ETFs, this field helps to identify if the ETF provides targeted exposure to securities of a specific maturity range.", + "default": null, + "optional": true + }, + { + "name": "specific_maturity_year", + "type": "int", + "description": "For all bond ETFs that take the value 'Specific Maturity Year' in the 'average_maturity' field, this field specifies the calendar year.", + "default": null, + "optional": true + }, + { + "name": "commodity_types", + "type": "str", + "description": "For ETFs where 'asset_class_type' is 'Commodities', this field provides detail on the type of commodities held in the ETF.", + "default": null, + "optional": true + }, + { + "name": "energy_type", + "type": "str", + "description": "For ETFs where 'commodity_type' is 'Energy', this field provides detail on the type of energy exposure provided by the ETF.", + "default": null, + "optional": true + }, + { + "name": "agricultural_type", + "type": "str", + "description": "For ETFs where 'commodity_type' is 'Agricultural', this field provides detail on the type of agricultural exposure provided by the ETF.", + "default": null, + "optional": true + }, + { + "name": "livestock_type", + "type": "str", + "description": "For ETFs where 'commodity_type' is 'Livestock', this field provides detail on the type of livestock exposure provided by the ETF.", + "default": null, + "optional": true + }, + { + "name": "metal_type", + "type": "str", + "description": "For ETFs where 'commodity_type' is 'Gold & Metals', this field provides detail on the type of exposure provided by the ETF.", + "default": null, + "optional": true + }, + { + "name": "inverse_leveraged", + "type": "str", + "description": "This field is populated if the ETF provides inverse or leveraged exposure.", + "default": null, + "optional": true + }, + { + "name": "target_date_multi_asset_type", + "type": "str", + "description": "For ETFs where 'asset_class_type' is 'Target Date / MultiAsset', this field provides detail on the type of commodities held in the ETF.", + "default": null, + "optional": true + }, + { + "name": "currency_pair", + "type": "str", + "description": "This field is populated if the ETF's strategy involves providing exposure to the movements of a currency or involves hedging currency exposure.", + "default": null, + "optional": true + }, + { + "name": "social_environmental_type", + "type": "str", + "description": "This field is populated if the ETF's strategy involves providing exposure to a specific social or environmental theme.", + "default": null, + "optional": true + }, + { + "name": "clean_energy_type", + "type": "str", + "description": "This field is populated if the ETF has a value of 'Clean Energy' in the 'social_environmental_type' field.", + "default": null, + "optional": true + }, + { + "name": "dividend_type", + "type": "str", + "description": "This field is populated if the ETF has an intended investment objective of holding dividend-oriented stocks as stated in the prospectus.", + "default": null, + "optional": true + }, + { + "name": "regular_dividend_payor_type", + "type": "str", + "description": "This field is populated if the ETF has a value of'Dividend - Regular Payors' in the 'dividend_type' field.", + "default": null, + "optional": true + }, + { + "name": "quant_strategies_type", + "type": "str", + "description": "This field is populated if the ETF has either an index-linked or active strategy that is based on a proprietary quantitative strategy.", + "default": null, + "optional": true + }, + { + "name": "other_quant_models", + "type": "str", + "description": "For ETFs where 'quant_strategies_type' is 'Other Quant Model', this field provides the name of the specific proprietary quant model used as the underlying strategy for the ETF.", + "default": null, + "optional": true + }, + { + "name": "hedge_fund_type", + "type": "str", + "description": "For ETFs where 'other_asset_types' is 'Hedge Fund Replication', this field provides detail on the type of hedge fund replication strategy.", + "default": null, + "optional": true + }, + { + "name": "excludes_financials", + "type": "bool", + "description": "For equity ETFs, identifies those ETFs where the underlying fund holdings will not hold financials stocks, based on the funds intended objective.", + "default": null, + "optional": true + }, + { + "name": "excludes_technology", + "type": "bool", + "description": "For equity ETFs, identifies those ETFs where the underlying fund holdings will not hold technology stocks, based on the funds intended objective.", + "default": null, + "optional": true + }, + { + "name": "holds_only_nyse_stocks", + "type": "bool", + "description": "If true, the ETF is an equity ETF and holds only stocks listed on NYSE.", + "default": null, + "optional": true + }, + { + "name": "holds_only_nasdaq_stocks", + "type": "bool", + "description": "If true, the ETF is an equity ETF and holds only stocks listed on Nasdaq.", + "default": null, + "optional": true + }, + { + "name": "holds_mlp", + "type": "bool", + "description": "If true, the ETF's investment objective explicitly specifies that it holds MLPs as an intended part of its investment strategy.", + "default": null, + "optional": true + }, + { + "name": "holds_preferred_stock", + "type": "bool", + "description": "If true, the ETF's investment objective explicitly specifies that it holds preferred stock as an intended part of its investment strategy.", + "default": null, + "optional": true + }, + { + "name": "holds_closed_end_funds", + "type": "bool", + "description": "If true, the ETF's investment objective explicitly specifies that it holds closed end funds as an intended part of its investment strategy.", + "default": null, + "optional": true + }, + { + "name": "holds_adr", + "type": "bool", + "description": "If true, he ETF's investment objective explicitly specifies that it holds American Depositary Receipts (ADRs) as an intended part of its investment strategy.", + "default": null, + "optional": true + }, + { + "name": "laddered", + "type": "bool", + "description": "For bond ETFs, this field identifies those ETFs that specifically hold bonds in a laddered structure, where the bonds are scheduled to mature in an annual, sequential structure.", + "default": null, + "optional": true + }, + { + "name": "zero_coupon", + "type": "bool", + "description": "For bond ETFs, this field identifies those ETFs that specifically hold zero coupon Treasury Bills.", + "default": null, + "optional": true + }, + { + "name": "floating_rate", + "type": "bool", + "description": "For bond ETFs, this field identifies those ETFs that specifically hold floating rate bonds.", + "default": null, + "optional": true + }, + { + "name": "build_america_bonds", + "type": "bool", + "description": "For municipal bond ETFs, this field identifies those ETFs that specifically hold Build America Bonds.", + "default": null, + "optional": true + }, + { + "name": "dynamic_futures_roll", + "type": "bool", + "description": "If the product holds futures contracts, this field identifies those products where the roll strategy is dynamic (rather than entirely rules based), so as to minimize roll costs.", + "default": null, + "optional": true + }, + { + "name": "currency_hedged", + "type": "bool", + "description": "This field is populated if the ETF's strategy involves hedging currency exposure.", + "default": null, + "optional": true + }, + { + "name": "includes_short_exposure", + "type": "bool", + "description": "This field is populated if the ETF has short exposure in any of its holdings e.g. in a long/short or inverse ETF.", + "default": null, + "optional": true + }, + { + "name": "ucits", + "type": "bool", + "description": "If true, the Exchange Traded Product (ETP) is Undertakings for the Collective Investment in Transferable Securities (UCITS) compliant", + "default": null, + "optional": true + }, + { + "name": "registered_countries", + "type": "str", + "description": "The list of countries where the ETF is legally registered for sale. This may differ from where the ETF is domiciled or traded, particularly in Europe.", + "default": null, + "optional": true + }, + { + "name": "issuer_country", + "type": "str", + "description": "2 letter ISO country code for the country where the issuer is located.", + "default": null, + "optional": true + }, + { + "name": "domicile", + "type": "str", + "description": "2 letter ISO country code for the country where the ETP is domiciled.", + "default": null, + "optional": true + }, + { + "name": "listing_country", + "type": "str", + "description": "2 letter ISO country code for the country of the primary listing.", + "default": null, + "optional": true + }, + { + "name": "listing_region", + "type": "str", + "description": "Geographic region in the country of the primary listing falls.", + "default": null, + "optional": true + }, + { + "name": "bond_currency_denomination", + "type": "str", + "description": "For all bond ETFs, this field provides additional detail on the currency denomination of the underlying securities.", + "default": null, + "optional": true + }, + { + "name": "base_currency", + "type": "str", + "description": "Base currency in which NAV is reported.", + "default": null, + "optional": true + }, + { + "name": "listing_currency", + "type": "str", + "description": "Listing currency of the Exchange Traded Product (ETP) in which it is traded. Reported using the 3-digit ISO currency code.", + "default": null, + "optional": true + }, + { + "name": "number_of_holdings", + "type": "int", + "description": "The number of holdings in the ETF.", + "default": null, + "optional": true + }, + { + "name": "month_end_assets", + "type": "float", + "description": "Net assets in millions of dollars as of the most recent month end.", + "default": null, + "optional": true + }, + { + "name": "net_expense_ratio", + "type": "float", + "description": "Gross expense net of Fee Waivers, as a percentage of net assets as published by the ETF issuer.", + "default": null, + "optional": true + }, + { + "name": "etf_portfolio_turnover", + "type": "float", + "description": "The percentage of positions turned over in the last 12 months.", + "default": null, + "optional": true + } + ], + "yfinance": [ + { + "name": "fund_type", + "type": "str", + "description": "The legal type of fund.", + "default": null, + "optional": true + }, + { + "name": "fund_family", + "type": "str", + "description": "The fund family.", + "default": null, + "optional": true + }, + { + "name": "category", + "type": "str", + "description": "The fund category.", + "default": null, + "optional": true + }, + { + "name": "exchange", + "type": "str", + "description": "The exchange the fund is listed on.", + "default": null, + "optional": true + }, + { + "name": "exchange_timezone", + "type": "str", + "description": "The timezone of the exchange.", + "default": null, + "optional": true + }, + { + "name": "currency", + "type": "str", + "description": "The currency in which the fund is listed.", + "default": null, + "optional": true + }, + { + "name": "nav_price", + "type": "float", + "description": "The net asset value per unit of the fund.", + "default": null, + "optional": true + }, + { + "name": "total_assets", + "type": "int", + "description": "The total value of assets held by the fund.", + "default": null, + "optional": true + }, + { + "name": "trailing_pe", + "type": "float", + "description": "The trailing twelve month P/E ratio of the fund's assets.", + "default": null, + "optional": true + }, + { + "name": "dividend_yield", + "type": "float", + "description": "The dividend yield of the fund, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "dividend_rate_ttm", + "type": "float", + "description": "The trailing twelve month annual dividend rate of the fund, in currency units.", + "default": null, + "optional": true + }, + { + "name": "dividend_yield_ttm", + "type": "float", + "description": "The trailing twelve month annual dividend yield of the fund, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "year_high", + "type": "float", + "description": "The fifty-two week high price.", + "default": null, + "optional": true + }, + { + "name": "year_low", + "type": "float", + "description": "The fifty-two week low price.", + "default": null, + "optional": true + }, + { + "name": "ma_50d", + "type": "float", + "description": "50-day moving average price.", + "default": null, + "optional": true + }, + { + "name": "ma_200d", + "type": "float", + "description": "200-day moving average price.", + "default": null, + "optional": true + }, + { + "name": "return_ytd", + "type": "float", + "description": "The year-to-date return of the fund, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "return_3y_avg", + "type": "float", + "description": "The three year average return of the fund, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "return_5y_avg", + "type": "float", + "description": "The five year average return of the fund, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "beta_3y_avg", + "type": "float", + "description": "The three year average beta of the fund.", + "default": null, + "optional": true + }, + { + "name": "volume_avg", + "type": "float", + "description": "The average daily trading volume of the fund.", + "default": null, + "optional": true + }, + { + "name": "volume_avg_10d", + "type": "float", + "description": "The average daily trading volume of the fund over the past ten days.", + "default": null, + "optional": true + }, + { + "name": "bid", + "type": "float", + "description": "The current bid price.", + "default": null, + "optional": true + }, + { + "name": "bid_size", + "type": "float", + "description": "The current bid size.", + "default": null, + "optional": true + }, + { + "name": "ask", + "type": "float", + "description": "The current ask price.", + "default": null, + "optional": true + }, + { + "name": "ask_size", + "type": "float", + "description": "The current ask size.", + "default": null, + "optional": true + }, + { + "name": "open", + "type": "float", + "description": "The open price of the most recent trading session.", + "default": null, + "optional": true + }, + { + "name": "high", + "type": "float", + "description": "The highest price of the most recent trading session.", + "default": null, + "optional": true + }, + { + "name": "low", + "type": "float", + "description": "The lowest price of the most recent trading session.", + "default": null, + "optional": true + }, + { + "name": "volume", + "type": "int", + "description": "The trading volume of the most recent trading session.", + "default": null, + "optional": true + }, + { + "name": "prev_close", + "type": "float", + "description": "The previous closing price.", + "default": null, + "optional": true + } + ] + }, + "model": "EtfInfo" + }, + "/etf/sectors": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "ETF Sector weighting.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.etf.sectors(symbol='SPY', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for. (ETF)", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EtfSectors]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "sector", + "type": "str", + "description": "Sector of exposure.", + "default": "", + "optional": false + }, + { + "name": "weight", + "type": "float", + "description": "Exposure of the ETF to the sector in normalized percentage points.", + "default": "", + "optional": false + } + ], + "fmp": [] + }, + "model": "EtfSectors" + }, + "/etf/countries": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "ETF Country weighting.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.etf.countries(symbol='VT', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. (ETF) Multiple items allowed for provider(s): fmp.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EtfCountries]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "country", + "type": "str", + "description": "The country of the exposure. Corresponding values are normalized percentage points.", + "default": "", + "optional": false + } + ], + "fmp": [] + }, + "model": "EtfCountries" + }, + "/etf/price_performance": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Price performance as a return, over different periods.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.etf.price_performance(symbol='QQQ', provider='fmp')\nobb.etf.price_performance(symbol='SPY,QQQ,IWM,DJIA', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['fmp', 'intrinio']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [], + "intrinio": [ + { + "name": "return_type", + "type": "Literal['trailing', 'calendar']", + "description": "The type of returns to return, a trailing or calendar window.", + "default": "trailing", + "optional": true + }, + { + "name": "adjustment", + "type": "Literal['splits_only', 'splits_and_dividends']", + "description": "The adjustment factor, 'splits_only' will return pure price performance.", + "default": "splits_and_dividends", + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EtfPricePerformance]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'intrinio']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": null, + "optional": true + }, + { + "name": "one_day", + "type": "float", + "description": "One-day return.", + "default": null, + "optional": true + }, + { + "name": "wtd", + "type": "float", + "description": "Week to date return.", + "default": null, + "optional": true + }, + { + "name": "one_week", + "type": "float", + "description": "One-week return.", + "default": null, + "optional": true + }, + { + "name": "mtd", + "type": "float", + "description": "Month to date return.", + "default": null, + "optional": true + }, + { + "name": "one_month", + "type": "float", + "description": "One-month return.", + "default": null, + "optional": true + }, + { + "name": "qtd", + "type": "float", + "description": "Quarter to date return.", + "default": null, + "optional": true + }, + { + "name": "three_month", + "type": "float", + "description": "Three-month return.", + "default": null, + "optional": true + }, + { + "name": "six_month", + "type": "float", + "description": "Six-month return.", + "default": null, + "optional": true + }, + { + "name": "ytd", + "type": "float", + "description": "Year to date return.", + "default": null, + "optional": true + }, + { + "name": "one_year", + "type": "float", + "description": "One-year return.", + "default": null, + "optional": true + }, + { + "name": "two_year", + "type": "float", + "description": "Two-year return.", + "default": null, + "optional": true + }, + { + "name": "three_year", + "type": "float", + "description": "Three-year return.", + "default": null, + "optional": true + }, + { + "name": "four_year", + "type": "float", + "description": "Four-year", + "default": null, + "optional": true + }, + { + "name": "five_year", + "type": "float", + "description": "Five-year return.", + "default": null, + "optional": true + }, + { + "name": "ten_year", + "type": "float", + "description": "Ten-year return.", + "default": null, + "optional": true + }, + { + "name": "max", + "type": "float", + "description": "Return from the beginning of the time series.", + "default": null, + "optional": true + } + ], + "fmp": [], + "intrinio": [ + { + "name": "max_annualized", + "type": "float", + "description": "Annualized rate of return from inception.", + "default": null, + "optional": true + }, + { + "name": "volatility_one_year", + "type": "float", + "description": "Trailing one-year annualized volatility.", + "default": null, + "optional": true + }, + { + "name": "volatility_three_year", + "type": "float", + "description": "Trailing three-year annualized volatility.", + "default": null, + "optional": true + }, + { + "name": "volatility_five_year", + "type": "float", + "description": "Trailing five-year annualized volatility.", + "default": null, + "optional": true + }, + { + "name": "volume", + "type": "int", + "description": "The trading volume.", + "default": null, + "optional": true + }, + { + "name": "volume_avg_30", + "type": "float", + "description": "The one-month average daily volume.", + "default": null, + "optional": true + }, + { + "name": "volume_avg_90", + "type": "float", + "description": "The three-month average daily volume.", + "default": null, + "optional": true + }, + { + "name": "volume_avg_180", + "type": "float", + "description": "The six-month average daily volume.", + "default": null, + "optional": true + }, + { + "name": "beta", + "type": "float", + "description": "Beta compared to the S&P 500.", + "default": null, + "optional": true + }, + { + "name": "nav", + "type": "float", + "description": "Net asset value per share.", + "default": null, + "optional": true + }, + { + "name": "year_high", + "type": "float", + "description": "The 52-week high price.", + "default": null, + "optional": true + }, + { + "name": "year_low", + "type": "float", + "description": "The 52-week low price.", + "default": null, + "optional": true + }, + { + "name": "market_cap", + "type": "float", + "description": "The market capitalization.", + "default": null, + "optional": true + }, + { + "name": "shares_outstanding", + "type": "int", + "description": "The number of shares outstanding.", + "default": null, + "optional": true + }, + { + "name": "updated", + "type": "date", + "description": "The date of the data.", + "default": null, + "optional": true + } + ] + }, + "model": "EtfPricePerformance" + }, + "/etf/holdings": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the holdings for an individual ETF.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.etf.holdings(symbol='XLK', provider='fmp')\n# Including a date (FMP, SEC) will return the holdings as per NPORT-P filings.\nobb.etf.holdings(symbol='XLK', date=2022-03-31, provider='fmp')\n# The same data can be returned from the SEC directly.\nobb.etf.holdings(symbol='XLK', date=2022-03-31, provider='sec')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for. (ETF)", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['fmp', 'intrinio', 'sec']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [ + { + "name": "date", + "type": "Union[Union[str, date], str]", + "description": "A specific date to get data for. Entering a date will attempt to return the NPORT-P filing for the entered date. This needs to be _exactly_ the date of the filing. Use the holdings_date command/endpoint to find available filing dates for the ETF.", + "default": null, + "optional": true + }, + { + "name": "cik", + "type": "str", + "description": "The CIK of the filing entity. Overrides symbol.", + "default": null, + "optional": true + } + ], + "intrinio": [ + { + "name": "date", + "type": "Union[date, str]", + "description": "A specific date to get data for.", + "default": null, + "optional": true + } + ], + "sec": [ + { + "name": "date", + "type": "Union[Union[str, date], str]", + "description": "A specific date to get data for. The date represents the period ending. The date entered will return the closest filing.", + "default": null, + "optional": true + }, + { + "name": "use_cache", + "type": "bool", + "description": "Whether or not to use cache for the request.", + "default": true, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EtfHoldings]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'intrinio', 'sec']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data. (ETF)", + "default": null, + "optional": true + }, + { + "name": "name", + "type": "str", + "description": "Name of the ETF holding.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "lei", + "type": "str", + "description": "The LEI of the holding.", + "default": null, + "optional": true + }, + { + "name": "title", + "type": "str", + "description": "The title of the holding.", + "default": null, + "optional": true + }, + { + "name": "cusip", + "type": "str", + "description": "The CUSIP of the holding.", + "default": null, + "optional": true + }, + { + "name": "isin", + "type": "str", + "description": "The ISIN of the holding.", + "default": null, + "optional": true + }, + { + "name": "balance", + "type": "int", + "description": "The balance of the holding, in shares or units.", + "default": null, + "optional": true + }, + { + "name": "units", + "type": "Union[str, float]", + "description": "The type of units.", + "default": null, + "optional": true + }, + { + "name": "currency", + "type": "str", + "description": "The currency of the holding.", + "default": null, + "optional": true + }, + { + "name": "value", + "type": "float", + "description": "The value of the holding, in dollars.", + "default": null, + "optional": true + }, + { + "name": "weight", + "type": "float", + "description": "The weight of the holding, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "payoff_profile", + "type": "str", + "description": "The payoff profile of the holding.", + "default": null, + "optional": true + }, + { + "name": "asset_category", + "type": "str", + "description": "The asset category of the holding.", + "default": null, + "optional": true + }, + { + "name": "issuer_category", + "type": "str", + "description": "The issuer category of the holding.", + "default": null, + "optional": true + }, + { + "name": "country", + "type": "str", + "description": "The country of the holding.", + "default": null, + "optional": true + }, + { + "name": "is_restricted", + "type": "str", + "description": "Whether the holding is restricted.", + "default": null, + "optional": true + }, + { + "name": "fair_value_level", + "type": "int", + "description": "The fair value level of the holding.", + "default": null, + "optional": true + }, + { + "name": "is_cash_collateral", + "type": "str", + "description": "Whether the holding is cash collateral.", + "default": null, + "optional": true + }, + { + "name": "is_non_cash_collateral", + "type": "str", + "description": "Whether the holding is non-cash collateral.", + "default": null, + "optional": true + }, + { + "name": "is_loan_by_fund", + "type": "str", + "description": "Whether the holding is loan by fund.", + "default": null, + "optional": true + }, + { + "name": "cik", + "type": "str", + "description": "The CIK of the filing.", + "default": null, + "optional": true + }, + { + "name": "acceptance_datetime", + "type": "str", + "description": "The acceptance datetime of the filing.", + "default": null, + "optional": true + }, + { + "name": "updated", + "type": "Union[date, datetime]", + "description": "The date the data was updated.", + "default": null, + "optional": true + } + ], + "intrinio": [ + { + "name": "security_type", + "type": "str", + "description": "The type of instrument for this holding. Examples(Bond='BOND', Equity='EQUI')", + "default": null, + "optional": true + }, + { + "name": "isin", + "type": "str", + "description": "The International Securities Identification Number.", + "default": null, + "optional": true + }, + { + "name": "ric", + "type": "str", + "description": "The Reuters Instrument Code.", + "default": null, + "optional": true + }, + { + "name": "sedol", + "type": "str", + "description": "The Stock Exchange Daily Official List.", + "default": null, + "optional": true + }, + { + "name": "share_class_figi", + "type": "str", + "description": "The OpenFIGI symbol for the holding.", + "default": null, + "optional": true + }, + { + "name": "country", + "type": "str", + "description": "The country or region of the holding.", + "default": null, + "optional": true + }, + { + "name": "maturity_date", + "type": "date", + "description": "The maturity date for the debt security, if available.", + "default": null, + "optional": true + }, + { + "name": "contract_expiry_date", + "type": "date", + "description": "Expiry date for the futures contract held, if available.", + "default": null, + "optional": true + }, + { + "name": "coupon", + "type": "float", + "description": "The coupon rate of the debt security, if available.", + "default": null, + "optional": true + }, + { + "name": "balance", + "type": "Union[float, int]", + "description": "The number of units of the security held, if available.", + "default": null, + "optional": true + }, + { + "name": "unit", + "type": "str", + "description": "The units of the 'balance' field.", + "default": null, + "optional": true + }, + { + "name": "units_per_share", + "type": "float", + "description": "Number of units of the security held per share outstanding of the ETF, if available.", + "default": null, + "optional": true + }, + { + "name": "face_value", + "type": "float", + "description": "The face value of the debt security, if available.", + "default": null, + "optional": true + }, + { + "name": "derivatives_value", + "type": "float", + "description": "The notional value of derivatives contracts held.", + "default": null, + "optional": true + }, + { + "name": "value", + "type": "float", + "description": "The market value of the holding, on the 'as_of' date.", + "default": null, + "optional": true + }, + { + "name": "weight", + "type": "float", + "description": "The weight of the holding, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "updated", + "type": "date", + "description": "The 'as_of' date for the holding.", + "default": null, + "optional": true + } + ], + "sec": [ + { + "name": "lei", + "type": "str", + "description": "The LEI of the holding.", + "default": null, + "optional": true + }, + { + "name": "cusip", + "type": "str", + "description": "The CUSIP of the holding.", + "default": null, + "optional": true + }, + { + "name": "isin", + "type": "str", + "description": "The ISIN of the holding.", + "default": null, + "optional": true + }, + { + "name": "other_id", + "type": "str", + "description": "Internal identifier for the holding.", + "default": null, + "optional": true + }, + { + "name": "balance", + "type": "float", + "description": "The balance of the holding.", + "default": null, + "optional": true + }, + { + "name": "weight", + "type": "float", + "description": "The weight of the holding in ETF in %.", + "default": null, + "optional": true + }, + { + "name": "value", + "type": "float", + "description": "The value of the holding in USD.", + "default": null, + "optional": true + }, + { + "name": "payoff_profile", + "type": "str", + "description": "The payoff profile of the holding.", + "default": null, + "optional": true + }, + { + "name": "units", + "type": "Union[str, float]", + "description": "The units of the holding.", + "default": null, + "optional": true + }, + { + "name": "currency", + "type": "str", + "description": "The currency of the holding.", + "default": null, + "optional": true + }, + { + "name": "asset_category", + "type": "str", + "description": "The asset category of the holding.", + "default": null, + "optional": true + }, + { + "name": "issuer_category", + "type": "str", + "description": "The issuer category of the holding.", + "default": null, + "optional": true + }, + { + "name": "country", + "type": "str", + "description": "The country of the holding.", + "default": null, + "optional": true + }, + { + "name": "is_restricted", + "type": "str", + "description": "Whether the holding is restricted.", + "default": null, + "optional": true + }, + { + "name": "fair_value_level", + "type": "int", + "description": "The fair value level of the holding.", + "default": null, + "optional": true + }, + { + "name": "is_cash_collateral", + "type": "str", + "description": "Whether the holding is cash collateral.", + "default": null, + "optional": true + }, + { + "name": "is_non_cash_collateral", + "type": "str", + "description": "Whether the holding is non-cash collateral.", + "default": null, + "optional": true + }, + { + "name": "is_loan_by_fund", + "type": "str", + "description": "Whether the holding is loan by fund.", + "default": null, + "optional": true + }, + { + "name": "loan_value", + "type": "float", + "description": "The loan value of the holding.", + "default": null, + "optional": true + }, + { + "name": "issuer_conditional", + "type": "str", + "description": "The issuer conditions of the holding.", + "default": null, + "optional": true + }, + { + "name": "asset_conditional", + "type": "str", + "description": "The asset conditions of the holding.", + "default": null, + "optional": true + }, + { + "name": "maturity_date", + "type": "date", + "description": "The maturity date of the debt security.", + "default": null, + "optional": true + }, + { + "name": "coupon_kind", + "type": "str", + "description": "The type of coupon for the debt security.", + "default": null, + "optional": true + }, + { + "name": "rate_type", + "type": "str", + "description": "The type of rate for the debt security, floating or fixed.", + "default": null, + "optional": true + }, + { + "name": "annualized_return", + "type": "float", + "description": "The annualized return on the debt security.", + "default": null, + "optional": true + }, + { + "name": "is_default", + "type": "str", + "description": "If the debt security is defaulted.", + "default": null, + "optional": true + }, + { + "name": "in_arrears", + "type": "str", + "description": "If the debt security is in arrears.", + "default": null, + "optional": true + }, + { + "name": "is_paid_kind", + "type": "str", + "description": "If the debt security payments are paid in kind.", + "default": null, + "optional": true + }, + { + "name": "derivative_category", + "type": "str", + "description": "The derivative category of the holding.", + "default": null, + "optional": true + }, + { + "name": "counterparty", + "type": "str", + "description": "The counterparty of the derivative.", + "default": null, + "optional": true + }, + { + "name": "underlying_name", + "type": "str", + "description": "The name of the underlying asset associated with the derivative.", + "default": null, + "optional": true + }, + { + "name": "option_type", + "type": "str", + "description": "The type of option.", + "default": null, + "optional": true + }, + { + "name": "derivative_payoff", + "type": "str", + "description": "The payoff profile of the derivative.", + "default": null, + "optional": true + }, + { + "name": "expiry_date", + "type": "date", + "description": "The expiry or termination date of the derivative.", + "default": null, + "optional": true + }, + { + "name": "exercise_price", + "type": "float", + "description": "The exercise price of the option.", + "default": null, + "optional": true + }, + { + "name": "exercise_currency", + "type": "str", + "description": "The currency of the option exercise price.", + "default": null, + "optional": true + }, + { + "name": "shares_per_contract", + "type": "float", + "description": "The number of shares per contract.", + "default": null, + "optional": true + }, + { + "name": "delta", + "type": "Union[str, float]", + "description": "The delta of the option.", + "default": null, + "optional": true + }, + { + "name": "rate_type_rec", + "type": "str", + "description": "The type of rate for reveivable portion of the swap.", + "default": null, + "optional": true + }, + { + "name": "receive_currency", + "type": "str", + "description": "The receive currency of the swap.", + "default": null, + "optional": true + }, + { + "name": "upfront_receive", + "type": "float", + "description": "The upfront amount received of the swap.", + "default": null, + "optional": true + }, + { + "name": "floating_rate_index_rec", + "type": "str", + "description": "The floating rate index for reveivable portion of the swap.", + "default": null, + "optional": true + }, + { + "name": "floating_rate_spread_rec", + "type": "float", + "description": "The floating rate spread for reveivable portion of the swap.", + "default": null, + "optional": true + }, + { + "name": "rate_tenor_rec", + "type": "str", + "description": "The rate tenor for reveivable portion of the swap.", + "default": null, + "optional": true + }, + { + "name": "rate_tenor_unit_rec", + "type": "Union[int, str]", + "description": "The rate tenor unit for reveivable portion of the swap.", + "default": null, + "optional": true + }, + { + "name": "reset_date_rec", + "type": "str", + "description": "The reset date for reveivable portion of the swap.", + "default": null, + "optional": true + }, + { + "name": "reset_date_unit_rec", + "type": "Union[int, str]", + "description": "The reset date unit for reveivable portion of the swap.", + "default": null, + "optional": true + }, + { + "name": "rate_type_pmnt", + "type": "str", + "description": "The type of rate for payment portion of the swap.", + "default": null, + "optional": true + }, + { + "name": "payment_currency", + "type": "str", + "description": "The payment currency of the swap.", + "default": null, + "optional": true + }, + { + "name": "upfront_payment", + "type": "float", + "description": "The upfront amount received of the swap.", + "default": null, + "optional": true + }, + { + "name": "floating_rate_index_pmnt", + "type": "str", + "description": "The floating rate index for payment portion of the swap.", + "default": null, + "optional": true + }, + { + "name": "floating_rate_spread_pmnt", + "type": "float", + "description": "The floating rate spread for payment portion of the swap.", + "default": null, + "optional": true + }, + { + "name": "rate_tenor_pmnt", + "type": "str", + "description": "The rate tenor for payment portion of the swap.", + "default": null, + "optional": true + }, + { + "name": "rate_tenor_unit_pmnt", + "type": "Union[int, str]", + "description": "The rate tenor unit for payment portion of the swap.", + "default": null, + "optional": true + }, + { + "name": "reset_date_pmnt", + "type": "str", + "description": "The reset date for payment portion of the swap.", + "default": null, + "optional": true + }, + { + "name": "reset_date_unit_pmnt", + "type": "Union[int, str]", + "description": "The reset date unit for payment portion of the swap.", + "default": null, + "optional": true + }, + { + "name": "repo_type", + "type": "str", + "description": "The type of repo.", + "default": null, + "optional": true + }, + { + "name": "is_cleared", + "type": "str", + "description": "If the repo is cleared.", + "default": null, + "optional": true + }, + { + "name": "is_tri_party", + "type": "str", + "description": "If the repo is tri party.", + "default": null, + "optional": true + }, + { + "name": "principal_amount", + "type": "float", + "description": "The principal amount of the repo.", + "default": null, + "optional": true + }, + { + "name": "principal_currency", + "type": "str", + "description": "The currency of the principal amount.", + "default": null, + "optional": true + }, + { + "name": "collateral_type", + "type": "str", + "description": "The collateral type of the repo.", + "default": null, + "optional": true + }, + { + "name": "collateral_amount", + "type": "float", + "description": "The collateral amount of the repo.", + "default": null, + "optional": true + }, + { + "name": "collateral_currency", + "type": "str", + "description": "The currency of the collateral amount.", + "default": null, + "optional": true + }, + { + "name": "exchange_currency", + "type": "str", + "description": "The currency of the exchange rate.", + "default": null, + "optional": true + }, + { + "name": "exchange_rate", + "type": "float", + "description": "The exchange rate.", + "default": null, + "optional": true + }, + { + "name": "currency_sold", + "type": "str", + "description": "The currency sold in a Forward Derivative.", + "default": null, + "optional": true + }, + { + "name": "currency_amount_sold", + "type": "float", + "description": "The amount of currency sold in a Forward Derivative.", + "default": null, + "optional": true + }, + { + "name": "currency_bought", + "type": "str", + "description": "The currency bought in a Forward Derivative.", + "default": null, + "optional": true + }, + { + "name": "currency_amount_bought", + "type": "float", + "description": "The amount of currency bought in a Forward Derivative.", + "default": null, + "optional": true + }, + { + "name": "notional_amount", + "type": "float", + "description": "The notional amount of the derivative.", + "default": null, + "optional": true + }, + { + "name": "notional_currency", + "type": "str", + "description": "The currency of the derivative's notional amount.", + "default": null, + "optional": true + }, + { + "name": "unrealized_gain", + "type": "float", + "description": "The unrealized gain or loss on the derivative.", + "default": null, + "optional": true + } + ] + }, + "model": "EtfHoldings" + }, + "/etf/holdings_date": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Use this function to get the holdings dates, if available.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.etf.holdings_date(symbol='XLK', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for. (ETF)", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [ + { + "name": "cik", + "type": "str", + "description": "The CIK of the filing entity. Overrides symbol.", + "default": null, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EtfHoldingsDate]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + } + ], + "fmp": [] + }, + "model": "EtfHoldingsDate" + }, + "/etf/holdings_performance": { + "deprecated": { + "flag": true, + "message": "This endpoint is deprecated; pass a list of holdings symbols directly to `/equity/price/performance` instead. Deprecated in OpenBB Platform V4.1 to be removed in V4.2." + }, + "description": "Get the recent price performance of each ticker held in the ETF.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.etf.holdings_performance(symbol='XLK', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EtfHoldingsPerformance]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": null, + "optional": true + }, + { + "name": "one_day", + "type": "float", + "description": "One-day return.", + "default": null, + "optional": true + }, + { + "name": "wtd", + "type": "float", + "description": "Week to date return.", + "default": null, + "optional": true + }, + { + "name": "one_week", + "type": "float", + "description": "One-week return.", + "default": null, + "optional": true + }, + { + "name": "mtd", + "type": "float", + "description": "Month to date return.", + "default": null, + "optional": true + }, + { + "name": "one_month", + "type": "float", + "description": "One-month return.", + "default": null, + "optional": true + }, + { + "name": "qtd", + "type": "float", + "description": "Quarter to date return.", + "default": null, + "optional": true + }, + { + "name": "three_month", + "type": "float", + "description": "Three-month return.", + "default": null, + "optional": true + }, + { + "name": "six_month", + "type": "float", + "description": "Six-month return.", + "default": null, + "optional": true + }, + { + "name": "ytd", + "type": "float", + "description": "Year to date return.", + "default": null, + "optional": true + }, + { + "name": "one_year", + "type": "float", + "description": "One-year return.", + "default": null, + "optional": true + }, + { + "name": "two_year", + "type": "float", + "description": "Two-year return.", + "default": null, + "optional": true + }, + { + "name": "three_year", + "type": "float", + "description": "Three-year return.", + "default": null, + "optional": true + }, + { + "name": "four_year", + "type": "float", + "description": "Four-year", + "default": null, + "optional": true + }, + { + "name": "five_year", + "type": "float", + "description": "Five-year return.", + "default": null, + "optional": true + }, + { + "name": "ten_year", + "type": "float", + "description": "Ten-year return.", + "default": null, + "optional": true + }, + { + "name": "max", + "type": "float", + "description": "Return from the beginning of the time series.", + "default": null, + "optional": true + } + ], + "fmp": [] + }, + "model": "EtfHoldingsPerformance" + }, + "/etf/equity_exposure": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the exposure to ETFs for a specific stock.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.etf.equity_exposure(symbol='MSFT', provider='fmp')\n# This function accepts multiple tickers.\nobb.etf.equity_exposure(symbol='MSFT,AAPL', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. (Stock) Multiple items allowed for provider(s): fmp.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EtfEquityExposure]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "equity_symbol", + "type": "str", + "description": "The symbol of the equity requested.", + "default": "", + "optional": false + }, + { + "name": "etf_symbol", + "type": "str", + "description": "The symbol of the ETF with exposure to the requested equity.", + "default": "", + "optional": false + }, + { + "name": "shares", + "type": "float", + "description": "The number of shares held in the ETF.", + "default": null, + "optional": true + }, + { + "name": "weight", + "type": "float", + "description": "The weight of the equity in the ETF, as a normalized percent.", + "default": null, + "optional": true + }, + { + "name": "market_value", + "type": "Union[float, int]", + "description": "The market value of the equity position in the ETF.", + "default": null, + "optional": true + } + ], + "fmp": [] + }, + "model": "EtfEquityExposure" + }, + "/fixedincome/rate/ameribor": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Ameribor.\n\nAmeribor (short for the American interbank offered rate) is a benchmark interest rate that reflects the true cost of\nshort-term interbank borrowing. This rate is based on transactions in overnight unsecured loans conducted on the\nAmerican Financial Exchange (AFX).", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.rate.ameribor(provider='fred')\nobb.fixedincome.rate.ameribor(parameter=30_day_ma, provider='fred')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fred']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", + "default": "fred", + "optional": true + } + ], + "fred": [ + { + "name": "parameter", + "type": "Literal['overnight', 'term_30', 'term_90', '1_week_term_structure', '1_month_term_structure', '3_month_term_structure', '6_month_term_structure', '1_year_term_structure', '2_year_term_structure', '30_day_ma', '90_day_ma']", + "description": "Period of AMERIBOR rate.", + "default": "overnight", + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[AMERIBOR]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fred']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "rate", + "type": "float", + "description": "AMERIBOR rate.", + "default": "", + "optional": false + } + ], + "fred": [] + }, + "model": "AMERIBOR" + }, + "/fixedincome/rate/sonia": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Sterling Overnight Index Average.\n\nSONIA (Sterling Overnight Index Average) is an important interest rate benchmark. SONIA is based on actual\ntransactions and reflects the average of the interest rates that banks pay to borrow sterling overnight from other\nfinancial institutions and other institutional investors.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.rate.sonia(provider='fred')\nobb.fixedincome.rate.sonia(parameter=total_nominal_value, provider='fred')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fred']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", + "default": "fred", + "optional": true + } + ], + "fred": [ + { + "name": "parameter", + "type": "Literal['rate', 'index', '10th_percentile', '25th_percentile', '75th_percentile', '90th_percentile', 'total_nominal_value']", + "description": "Period of SONIA rate.", + "default": "rate", + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[SONIA]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fred']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "rate", + "type": "float", + "description": "SONIA rate.", + "default": "", + "optional": false + } + ], + "fred": [] + }, + "model": "SONIA" + }, + "/fixedincome/rate/iorb": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Interest on Reserve Balances.\n\nGet Interest Rate on Reserve Balances data A bank rate is the interest rate a nation's central bank charges to its\ndomestic banks to borrow money. The rates central banks charge are set to stabilize the economy. In the\nUnited States, the Federal Reserve System's Board of Governors set the bank rate, also known as the discount rate.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.rate.iorb(provider='fred')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fred']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", + "default": "fred", + "optional": true + } + ], + "fred": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[IORB]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fred']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "rate", + "type": "float", + "description": "IORB rate.", + "default": "", + "optional": false + } + ], + "fred": [] + }, + "model": "IORB" + }, + "/fixedincome/rate/effr": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Fed Funds Rate.\n\nGet Effective Federal Funds Rate data. A bank rate is the interest rate a nation's central bank charges to its\ndomestic banks to borrow money. The rates central banks charge are set to stabilize the economy. In the\nUnited States, the Federal Reserve System's Board of Governors set the bank rate, also known as the discount rate.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.rate.effr(provider='fred')\nobb.fixedincome.rate.effr(parameter=daily, provider='fred')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['federal_reserve', 'fred']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'federal_reserve' if there is no default.", + "default": "federal_reserve", + "optional": true + } + ], + "federal_reserve": [], + "fred": [ + { + "name": "parameter", + "type": "Literal['monthly', 'daily', 'weekly', 'daily_excl_weekend', 'annual', 'biweekly', 'volume']", + "description": "Period of FED rate.", + "default": "weekly", + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[FEDFUNDS]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['federal_reserve', 'fred']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "rate", + "type": "float", + "description": "FED rate.", + "default": "", + "optional": false + } + ], + "federal_reserve": [], + "fred": [] + }, + "model": "FEDFUNDS" + }, + "/fixedincome/rate/effr_forecast": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Fed Funds Rate Projections.\n\nThe projections for the federal funds rate are the value of the midpoint of the\nprojected appropriate target range for the federal funds rate or the projected\nappropriate target level for the federal funds rate at the end of the specified\ncalendar year or over the longer run.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.rate.effr_forecast(provider='fred')\nobb.fixedincome.rate.effr_forecast(long_run=True, provider='fred')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "provider", + "type": "Literal['fred']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", + "default": "fred", + "optional": true + } + ], + "fred": [ + { + "name": "long_run", + "type": "bool", + "description": "Flag to show long run projections", + "default": false, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[PROJECTIONS]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fred']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "range_high", + "type": "float", + "description": "High projection of rates.", + "default": "", + "optional": false + }, + { + "name": "central_tendency_high", + "type": "float", + "description": "Central tendency of high projection of rates.", + "default": "", + "optional": false + }, + { + "name": "median", + "type": "float", + "description": "Median projection of rates.", + "default": "", + "optional": false + }, + { + "name": "range_midpoint", + "type": "float", + "description": "Midpoint projection of rates.", + "default": "", + "optional": false + }, + { + "name": "central_tendency_midpoint", + "type": "float", + "description": "Central tendency of midpoint projection of rates.", + "default": "", + "optional": false + }, + { + "name": "range_low", + "type": "float", + "description": "Low projection of rates.", + "default": "", + "optional": false + }, + { + "name": "central_tendency_low", + "type": "float", + "description": "Central tendency of low projection of rates.", + "default": "", + "optional": false + } + ], + "fred": [] + }, + "model": "PROJECTIONS" + }, + "/fixedincome/rate/estr": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Euro Short-Term Rate.\n\nThe euro short-term rate (\u20acSTR) reflects the wholesale euro unsecured overnight borrowing costs of banks located in\nthe euro area. The \u20acSTR is published on each TARGET2 business day based on transactions conducted and settled on\nthe previous TARGET2 business day (the reporting date \u201cT\u201d) with a maturity date of T+1 which are deemed to have been\nexecuted at arm\u2019s length and thus reflect market rates in an unbiased way.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.rate.estr(provider='fred')\nobb.fixedincome.rate.estr(parameter=number_of_active_banks, provider='fred')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fred']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", + "default": "fred", + "optional": true + } + ], + "fred": [ + { + "name": "parameter", + "type": "Literal['volume_weighted_trimmed_mean_rate', 'number_of_transactions', 'number_of_active_banks', 'total_volume', 'share_of_volume_of_the_5_largest_active_banks', 'rate_at_75th_percentile_of_volume', 'rate_at_25th_percentile_of_volume']", + "description": "Period of ESTR rate.", + "default": "volume_weighted_trimmed_mean_rate", + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[ESTR]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fred']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "rate", + "type": "float", + "description": "ESTR rate.", + "default": "", + "optional": false + } + ], + "fred": [] + }, + "model": "ESTR" + }, + "/fixedincome/rate/ecb": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "European Central Bank Interest Rates.\n\nThe Governing Council of the ECB sets the key interest rates for the euro area:\n\n- The interest rate on the main refinancing operations (MRO), which provide\nthe bulk of liquidity to the banking system.\n- The rate on the deposit facility, which banks may use to make overnight deposits with the Eurosystem.\n- The rate on the marginal lending facility, which offers overnight credit to banks from the Eurosystem.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.rate.ecb(provider='fred')\nobb.fixedincome.rate.ecb(interest_rate_type='refinancing', provider='fred')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "interest_rate_type", + "type": "Literal['deposit', 'lending', 'refinancing']", + "description": "The type of interest rate.", + "default": "lending", + "optional": true + }, + { + "name": "provider", + "type": "Literal['fred']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", + "default": "fred", + "optional": true + } + ], + "fred": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[EuropeanCentralBankInterestRates]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fred']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "rate", + "type": "float", + "description": "European Central Bank Interest Rate.", + "default": "", + "optional": false + } + ], + "fred": [] + }, + "model": "EuropeanCentralBankInterestRates" + }, + "/fixedincome/rate/dpcredit": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Discount Window Primary Credit Rate.\n\nA bank rate is the interest rate a nation's central bank charges to its domestic banks to borrow money.\nThe rates central banks charge are set to stabilize the economy.\nIn the United States, the Federal Reserve System's Board of Governors set the bank rate,\nalso known as the discount rate.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.rate.dpcredit(provider='fred')\nobb.fixedincome.rate.dpcredit(start_date='2023-02-01', end_date='2023-05-01', provider='fred')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fred']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", + "default": "fred", + "optional": true + } + ], + "fred": [ + { + "name": "parameter", + "type": "Literal['daily_excl_weekend', 'monthly', 'weekly', 'daily', 'annual']", + "description": "FRED series ID of DWPCR data.", + "default": "daily_excl_weekend", + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[DiscountWindowPrimaryCreditRate]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fred']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "rate", + "type": "float", + "description": "Discount Window Primary Credit Rate.", + "default": "", + "optional": false + } + ], + "fred": [] + }, + "model": "DiscountWindowPrimaryCreditRate" + }, + "/fixedincome/spreads/tcm": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Treasury Constant Maturity.\n\nGet data for 10-Year Treasury Constant Maturity Minus Selected Treasury Constant Maturity.\nConstant maturity is the theoretical value of a U.S. Treasury that is based on recent values of auctioned U.S.\nTreasuries. The value is obtained by the U.S. Treasury on a daily basis through interpolation of the Treasury\nyield curve which, in turn, is based on closing bid-yields of actively-traded Treasury securities.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.spreads.tcm(provider='fred')\nobb.fixedincome.spreads.tcm(maturity='2y', provider='fred')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "maturity", + "type": "Literal['3m', '2y']", + "description": "The maturity", + "default": "3m", + "optional": true + }, + { + "name": "provider", + "type": "Literal['fred']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", + "default": "fred", + "optional": true + } + ], + "fred": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[TreasuryConstantMaturity]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fred']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "rate", + "type": "float", + "description": "TreasuryConstantMaturity Rate.", + "default": "", + "optional": false + } + ], + "fred": [] + }, + "model": "TreasuryConstantMaturity" + }, + "/fixedincome/spreads/tcm_effr": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Select Treasury Constant Maturity.\n\nGet data for Selected Treasury Constant Maturity Minus Federal Funds Rate\nConstant maturity is the theoretical value of a U.S. Treasury that is based on recent values of auctioned U.S.\nTreasuries. The value is obtained by the U.S. Treasury on a daily basis through interpolation of the Treasury\nyield curve which, in turn, is based on closing bid-yields of actively-traded Treasury securities.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.spreads.tcm_effr(provider='fred')\nobb.fixedincome.spreads.tcm_effr(maturity='10y', provider='fred')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "maturity", + "type": "Literal['10y', '5y', '1y', '6m', '3m']", + "description": "The maturity", + "default": "10y", + "optional": true + }, + { + "name": "provider", + "type": "Literal['fred']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", + "default": "fred", + "optional": true + } + ], + "fred": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[SelectedTreasuryConstantMaturity]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fred']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "rate", + "type": "float", + "description": "Selected Treasury Constant Maturity Rate.", + "default": "", + "optional": false + } + ], + "fred": [] + }, + "model": "SelectedTreasuryConstantMaturity" + }, + "/fixedincome/spreads/treasury_effr": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Select Treasury Bill.\n\nGet Selected Treasury Bill Minus Federal Funds Rate.\nConstant maturity is the theoretical value of a U.S. Treasury that is based on recent values of\nauctioned U.S. Treasuries.\nThe value is obtained by the U.S. Treasury on a daily basis through interpolation of the Treasury\nyield curve which, in turn, is based on closing bid-yields of actively-traded Treasury securities.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.spreads.treasury_effr(provider='fred')\nobb.fixedincome.spreads.treasury_effr(maturity='6m', provider='fred')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "maturity", + "type": "Literal['3m', '6m']", + "description": "The maturity", + "default": "3m", + "optional": true + }, + { + "name": "provider", + "type": "Literal['fred']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", + "default": "fred", + "optional": true + } + ], + "fred": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[SelectedTreasuryBill]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fred']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "rate", + "type": "float", + "description": "SelectedTreasuryBill Rate.", + "default": "", + "optional": false + } + ], + "fred": [] + }, + "model": "SelectedTreasuryBill" + }, + "/fixedincome/government/us_yield_curve": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "US Yield Curve. Get United States yield curve.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.government.us_yield_curve(provider='fred')\nobb.fixedincome.government.us_yield_curve(inflation_adjusted=True, provider='fred')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "date", + "type": "Union[date, str]", + "description": "A specific date to get data for. Defaults to the most recent FRED entry.", + "default": null, + "optional": true + }, + { + "name": "inflation_adjusted", + "type": "bool", + "description": "Get inflation adjusted rates.", + "default": false, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fred']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", + "default": "fred", + "optional": true + } + ], + "fred": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[USYieldCurve]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fred']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "maturity", + "type": "float", + "description": "Maturity of the treasury rate in years.", + "default": "", + "optional": false + }, + { + "name": "rate", + "type": "float", + "description": "Associated rate given in decimal form (0.05 is 5%)", + "default": "", + "optional": false + } + ], + "fred": [] + }, + "model": "USYieldCurve" + }, + "/fixedincome/government/treasury_rates": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Government Treasury Rates.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.government.treasury_rates(provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['federal_reserve', 'fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'federal_reserve' if there is no default.", + "default": "federal_reserve", + "optional": true + } + ], + "federal_reserve": [], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[TreasuryRates]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['federal_reserve', 'fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "week_4", + "type": "float", + "description": "4 week Treasury bills rate (secondary market).", + "default": null, + "optional": true + }, + { + "name": "month_1", + "type": "float", + "description": "1 month Treasury rate.", + "default": null, + "optional": true + }, + { + "name": "month_2", + "type": "float", + "description": "2 month Treasury rate.", + "default": null, + "optional": true + }, + { + "name": "month_3", + "type": "float", + "description": "3 month Treasury rate.", + "default": null, + "optional": true + }, + { + "name": "month_6", + "type": "float", + "description": "6 month Treasury rate.", + "default": null, + "optional": true + }, + { + "name": "year_1", + "type": "float", + "description": "1 year Treasury rate.", + "default": null, + "optional": true + }, + { + "name": "year_2", + "type": "float", + "description": "2 year Treasury rate.", + "default": null, + "optional": true + }, + { + "name": "year_3", + "type": "float", + "description": "3 year Treasury rate.", + "default": null, + "optional": true + }, + { + "name": "year_5", + "type": "float", + "description": "5 year Treasury rate.", + "default": null, + "optional": true + }, + { + "name": "year_7", + "type": "float", + "description": "7 year Treasury rate.", + "default": null, + "optional": true + }, + { + "name": "year_10", + "type": "float", + "description": "10 year Treasury rate.", + "default": null, + "optional": true + }, + { + "name": "year_20", + "type": "float", + "description": "20 year Treasury rate.", + "default": null, + "optional": true + }, + { + "name": "year_30", + "type": "float", + "description": "30 year Treasury rate.", + "default": null, + "optional": true + } + ], + "federal_reserve": [], + "fmp": [] + }, + "model": "TreasuryRates" + }, + "/fixedincome/corporate/ice_bofa": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "ICE BofA US Corporate Bond Indices.\n\nThe ICE BofA US Corporate Index tracks the performance of US dollar denominated investment grade corporate debt\npublicly issued in the US domestic market. Qualifying securities must have an investment grade rating (based on an\naverage of Moody\u2019s, S&P and Fitch), at least 18 months to final maturity at the time of issuance, at least one year\nremaining term to final maturity as of the rebalance date, a fixed coupon schedule and a minimum amount\noutstanding of $250 million. The ICE BofA US Corporate Index is a component of the US Corporate Master Index.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.corporate.ice_bofa(provider='fred')\nobb.fixedincome.corporate.ice_bofa(index_type='yield_to_worst', provider='fred')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "index_type", + "type": "Literal['yield', 'yield_to_worst', 'total_return', 'spread']", + "description": "The type of series.", + "default": "yield", + "optional": true + }, + { + "name": "provider", + "type": "Literal['fred']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", + "default": "fred", + "optional": true + } + ], + "fred": [ + { + "name": "category", + "type": "Literal['all', 'duration', 'eur', 'usd']", + "description": "The type of category.", + "default": "all", + "optional": true + }, + { + "name": "area", + "type": "Literal['asia', 'emea', 'eu', 'ex_g10', 'latin_america', 'us']", + "description": "The type of area.", + "default": "us", + "optional": true + }, + { + "name": "grade", + "type": "Literal['a', 'aa', 'aaa', 'b', 'bb', 'bbb', 'ccc', 'crossover', 'high_grade', 'high_yield', 'non_financial', 'non_sovereign', 'private_sector', 'public_sector']", + "description": "The type of grade.", + "default": "non_sovereign", + "optional": true + }, + { + "name": "options", + "type": "bool", + "description": "Whether to include options in the results.", + "default": false, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[ICEBofA]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fred']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "rate", + "type": "float", + "description": "ICE BofA US Corporate Bond Indices Rate.", + "default": "", + "optional": false + } + ], + "fred": [] + }, + "model": "ICEBofA" + }, + "/fixedincome/corporate/moody": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Moody Corporate Bond Index.\n\nMoody's Aaa and Baa are investment bonds that acts as an index of\nthe performance of all bonds given an Aaa or Baa rating by Moody's Investors Service respectively.\nThese corporate bonds often are used in macroeconomics as an alternative to the federal ten-year\nTreasury Bill as an indicator of the interest rate.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.corporate.moody(provider='fred')\nobb.fixedincome.corporate.moody(index_type='baa', provider='fred')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "index_type", + "type": "Literal['aaa', 'baa']", + "description": "The type of series.", + "default": "aaa", + "optional": true + }, + { + "name": "provider", + "type": "Literal['fred']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", + "default": "fred", + "optional": true + } + ], + "fred": [ + { + "name": "spread", + "type": "Literal['treasury', 'fed_funds']", + "description": "The type of spread.", + "default": null, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[MoodyCorporateBondIndex]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fred']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "rate", + "type": "float", + "description": "Moody Corporate Bond Index Rate.", + "default": "", + "optional": false + } + ], + "fred": [] + }, + "model": "MoodyCorporateBondIndex" + }, + "/fixedincome/corporate/hqm": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "High Quality Market Corporate Bond.\n\nThe HQM yield curve represents the high quality corporate bond market, i.e.,\ncorporate bonds rated AAA, AA, or A. The HQM curve contains two regression terms.\nThese terms are adjustment factors that blend AAA, AA, and A bonds into a single HQM yield curve\nthat is the market-weighted average (MWA) quality of high quality bonds.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.corporate.hqm(provider='fred')\nobb.fixedincome.corporate.hqm(yield_curve='par', provider='fred')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "date", + "type": "Union[date, str]", + "description": "A specific date to get data for.", + "default": null, + "optional": true + }, + { + "name": "yield_curve", + "type": "Literal['spot', 'par']", + "description": "The yield curve type.", + "default": "spot", + "optional": true + }, + { + "name": "provider", + "type": "Literal['fred']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", + "default": "fred", + "optional": true + } + ], + "fred": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[HighQualityMarketCorporateBond]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fred']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "rate", + "type": "float", + "description": "HighQualityMarketCorporateBond Rate.", + "default": "", + "optional": false + }, + { + "name": "maturity", + "type": "str", + "description": "Maturity.", + "default": "", + "optional": false + }, + { + "name": "yield_curve", + "type": "Literal['spot', 'par']", + "description": "The yield curve type.", + "default": "", + "optional": false + } + ], + "fred": [ + { + "name": "series_id", + "type": "str", + "description": "FRED series id.", + "default": "", + "optional": false + } + ] + }, + "model": "HighQualityMarketCorporateBond" + }, + "/fixedincome/corporate/spot_rates": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Spot Rates.\n\nThe spot rates for any maturity is the yield on a bond that provides a single payment at that maturity.\nThis is a zero coupon bond.\nBecause each spot rate pertains to a single cashflow, it is the relevant interest rate\nconcept for discounting a pension liability at the same maturity.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.corporate.spot_rates(provider='fred')\nobb.fixedincome.corporate.spot_rates(maturity='10,20,30,50', provider='fred')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "maturity", + "type": "Union[Union[float, str], List[Union[float, str]]]", + "description": "Maturities in years. Multiple items allowed for provider(s): fred.", + "default": 10.0, + "optional": true + }, + { + "name": "category", + "type": "Union[str, List[str]]", + "description": "Rate category. Options: spot_rate, par_yield. Multiple items allowed for provider(s): fred.", + "default": "spot_rate", + "optional": true + }, + { + "name": "provider", + "type": "Literal['fred']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", + "default": "fred", + "optional": true + } + ], + "fred": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[SpotRate]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fred']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "rate", + "type": "float", + "description": "Spot Rate.", + "default": "", + "optional": false + } + ], + "fred": [] + }, + "model": "SpotRate" + }, + "/fixedincome/corporate/commercial_paper": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Commercial Paper.\n\nCommercial paper (CP) consists of short-term, promissory notes issued primarily by corporations.\nMaturities range up to 270 days but average about 30 days.\nMany companies use CP to raise cash needed for current transactions,\nand many find it to be a lower-cost alternative to bank loans.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.corporate.commercial_paper(provider='fred')\nobb.fixedincome.corporate.commercial_paper(maturity='15d', provider='fred')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "maturity", + "type": "Literal['overnight', '7d', '15d', '30d', '60d', '90d']", + "description": "The maturity.", + "default": "30d", + "optional": true + }, + { + "name": "category", + "type": "Literal['asset_backed', 'financial', 'nonfinancial']", + "description": "The category.", + "default": "financial", + "optional": true + }, + { + "name": "grade", + "type": "Literal['aa', 'a2_p2']", + "description": "The grade.", + "default": "aa", + "optional": true + }, + { + "name": "provider", + "type": "Literal['fred']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", + "default": "fred", + "optional": true + } + ], + "fred": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[CommercialPaper]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fred']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "rate", + "type": "float", + "description": "Commercial Paper Rate.", + "default": "", + "optional": false + } + ], + "fred": [] + }, + "model": "CommercialPaper" + }, + "/fixedincome/sofr": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Secured Overnight Financing Rate.\n\nThe Secured Overnight Financing Rate (SOFR) is a broad measure of the cost of\nborrowing cash overnight collateralizing by Treasury securities.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.fixedincome.sofr(provider='fred')\nobb.fixedincome.sofr(period=overnight, provider='fred')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['fred']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fred' if there is no default.", + "default": "fred", + "optional": true + } + ], + "fred": [ + { + "name": "period", + "type": "Literal['overnight', '30_day', '90_day', '180_day', 'index']", + "description": "Period of SOFR rate.", + "default": "overnight", + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[SOFR]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fred']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "date", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "rate", + "type": "float", + "description": "SOFR rate.", + "default": "", + "optional": false + } + ], + "fred": [] + }, + "model": "SOFR" + }, + "/index/price/historical": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Historical Index Levels.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.index.price.historical(symbol='^GSPC', provider='fmp')\n# Not all providers have the same symbols.\nobb.index.price.historical(symbol='SPX', provider='intrinio')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio, polygon, yfinance.", + "default": "", + "optional": false + }, + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "interval", + "type": "str", + "description": "Time interval of the data to return.", + "default": "1d", + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp', 'intrinio', 'polygon', 'yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [], + "intrinio": [ + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": 10000, + "optional": true + } + ], + "polygon": [ + { + "name": "sort", + "type": "Literal['asc', 'desc']", + "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date.", + "default": "asc", + "optional": true + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": 49999, + "optional": true + } + ], + "yfinance": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[IndexHistorical]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'intrinio', 'polygon', 'yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "Union[date, datetime]", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "open", + "type": "Annotated[float, Strict(strict=True)]", + "description": "The open price.", + "default": null, + "optional": true + }, + { + "name": "high", + "type": "Annotated[float, Strict(strict=True)]", + "description": "The high price.", + "default": null, + "optional": true + }, + { + "name": "low", + "type": "Annotated[float, Strict(strict=True)]", + "description": "The low price.", + "default": null, + "optional": true + }, + { + "name": "close", + "type": "Annotated[float, Strict(strict=True)]", + "description": "The close price.", + "default": null, + "optional": true + }, + { + "name": "volume", + "type": "int", + "description": "The trading volume.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "vwap", + "type": "float", + "description": "Volume Weighted Average Price over the period.", + "default": null, + "optional": true + }, + { + "name": "change", + "type": "float", + "description": "Change in the price from the previous close.", + "default": null, + "optional": true + }, + { + "name": "change_percent", + "type": "float", + "description": "Change in the price from the previous close, as a normalized percent.", + "default": null, + "optional": true + } + ], + "intrinio": [], + "polygon": [ + { + "name": "transactions", + "type": "Annotated[int, Gt(gt=0)]", + "description": "Number of transactions for the symbol in the time period.", + "default": null, + "optional": true + } + ], + "yfinance": [] + }, + "model": "IndexHistorical" + }, + "/index/market": { + "deprecated": { + "flag": true, + "message": "This endpoint is deprecated; use `/index/price/historical` instead. Deprecated in OpenBB Platform V4.1 to be removed in V4.3." + }, + "description": "Get Historical Market Indices.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.index.market(symbol='^IBEX', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio, polygon, yfinance.", + "default": "", + "optional": false + }, + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "interval", + "type": "str", + "description": "Time interval of the data to return.", + "default": "1d", + "optional": true + }, + { + "name": "provider", + "type": "Literal['fmp', 'intrinio', 'polygon', 'yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [], + "intrinio": [ + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": 10000, + "optional": true + } + ], + "polygon": [ + { + "name": "sort", + "type": "Literal['asc', 'desc']", + "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date.", + "default": "asc", + "optional": true + }, + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return.", + "default": 49999, + "optional": true + } + ], + "yfinance": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[MarketIndices]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'intrinio', 'polygon', 'yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "Union[date, datetime]", + "description": "The date of the data.", + "default": "", + "optional": false + }, + { + "name": "open", + "type": "Annotated[float, Strict(strict=True)]", + "description": "The open price.", + "default": null, + "optional": true + }, + { + "name": "high", + "type": "Annotated[float, Strict(strict=True)]", + "description": "The high price.", + "default": null, + "optional": true + }, + { + "name": "low", + "type": "Annotated[float, Strict(strict=True)]", + "description": "The low price.", + "default": null, + "optional": true + }, + { + "name": "close", + "type": "Annotated[float, Strict(strict=True)]", + "description": "The close price.", + "default": null, + "optional": true + }, + { + "name": "volume", + "type": "int", + "description": "The trading volume.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "vwap", + "type": "float", + "description": "Volume Weighted Average Price over the period.", + "default": null, + "optional": true + }, + { + "name": "change", + "type": "float", + "description": "Change in the price from the previous close.", + "default": null, + "optional": true + }, + { + "name": "change_percent", + "type": "float", + "description": "Change in the price from the previous close, as a normalized percent.", + "default": null, + "optional": true + } + ], + "intrinio": [], + "polygon": [ + { + "name": "transactions", + "type": "Annotated[int, Gt(gt=0)]", + "description": "Number of transactions for the symbol in the time period.", + "default": null, + "optional": true + } + ], + "yfinance": [] + }, + "model": "MarketIndices" + }, + "/index/constituents": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get Index Constituents.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.index.constituents(symbol='dowjones', provider='fmp')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['fmp']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[IndexConstituents]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + }, + { + "name": "name", + "type": "str", + "description": "Name of the constituent company in the index.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "sector", + "type": "str", + "description": "Sector the constituent company in the index belongs to.", + "default": "", + "optional": false + }, + { + "name": "sub_sector", + "type": "str", + "description": "Sub-sector the constituent company in the index belongs to.", + "default": null, + "optional": true + }, + { + "name": "headquarter", + "type": "str", + "description": "Location of the headquarter of the constituent company in the index.", + "default": null, + "optional": true + }, + { + "name": "date_first_added", + "type": "Union[str, date]", + "description": "Date the constituent company was added to the index.", + "default": null, + "optional": true + }, + { + "name": "cik", + "type": "int", + "description": "Central Index Key (CIK) for the requested entity.", + "default": null, + "optional": true + }, + { + "name": "founded", + "type": "Union[str, date]", + "description": "Founding year of the constituent company in the index.", + "default": null, + "optional": true + } + ] + }, + "model": "IndexConstituents" + }, + "/index/available": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "All indices available from a given provider.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.index.available(provider='fmp')\nobb.index.available(provider='yfinance')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "provider", + "type": "Literal['fmp', 'yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default.", + "default": "fmp", + "optional": true + } + ], + "fmp": [], + "yfinance": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[AvailableIndices]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['fmp', 'yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "name", + "type": "str", + "description": "Name of the index.", + "default": null, + "optional": true + }, + { + "name": "currency", + "type": "str", + "description": "Currency the index is traded in.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "stock_exchange", + "type": "str", + "description": "Stock exchange where the index is listed.", + "default": "", + "optional": false + }, + { + "name": "exchange_short_name", + "type": "str", + "description": "Short name of the stock exchange where the index is listed.", + "default": "", + "optional": false + } + ], + "yfinance": [ + { + "name": "code", + "type": "str", + "description": "ID code for keying the index in the OpenBB Terminal.", + "default": "", + "optional": false + }, + { + "name": "symbol", + "type": "str", + "description": "Symbol for the index.", + "default": "", + "optional": false + } + ] + }, + "model": "AvailableIndices" + }, + "/news/world": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "World News. Global news data.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.news.world(provider='fmp')\nobb.news.world(limit=100, provider='intrinio')\n# Get news on the specified dates.\nobb.news.world(start_date='2024-02-01', end_date='2024-02-07', provider='intrinio')\n# Display the headlines of the news.\nobb.news.world(display=headline, provider='benzinga')\n# Get news by topics.\nobb.news.world(topics=finance, provider='benzinga')\n# Get news by source using 'tingo' as provider.\nobb.news.world(provider='tiingo', source=bloomberg)\n```\n\n", + "parameters": { + "standard": [ + { + "name": "limit", + "type": "int", + "description": "The number of data entries to return. The number of articles to return.", + "default": 2500, + "optional": true + }, + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "provider", + "type": "Literal['benzinga', 'fmp', 'intrinio', 'tiingo']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'benzinga' if there is no default.", + "default": "benzinga", + "optional": true + } + ], + "benzinga": [ + { + "name": "date", + "type": "Union[date, str]", + "description": "A specific date to get data for.", + "default": null, + "optional": true + }, + { + "name": "display", + "type": "Literal['headline', 'abstract', 'full']", + "description": "Specify headline only (headline), headline + teaser (abstract), or headline + full body (full).", + "default": "full", + "optional": true + }, + { + "name": "updated_since", + "type": "int", + "description": "Number of seconds since the news was updated.", + "default": null, + "optional": true + }, + { + "name": "published_since", + "type": "int", + "description": "Number of seconds since the news was published.", + "default": null, + "optional": true + }, + { + "name": "sort", + "type": "Literal['id', 'created', 'updated']", + "description": "Key to sort the news by.", + "default": "created", + "optional": true + }, + { + "name": "order", + "type": "Literal['asc', 'desc']", + "description": "Order to sort the news by.", + "default": "desc", + "optional": true + }, + { + "name": "isin", + "type": "str", + "description": "The ISIN of the news to retrieve.", + "default": null, + "optional": true + }, + { + "name": "cusip", + "type": "str", + "description": "The CUSIP of the news to retrieve.", + "default": null, + "optional": true + }, + { + "name": "channels", + "type": "str", + "description": "Channels of the news to retrieve.", + "default": null, + "optional": true + }, + { + "name": "topics", + "type": "str", + "description": "Topics of the news to retrieve.", + "default": null, + "optional": true + }, + { + "name": "authors", + "type": "str", + "description": "Authors of the news to retrieve.", + "default": null, + "optional": true + }, + { + "name": "content_types", + "type": "str", + "description": "Content types of the news to retrieve.", + "default": null, + "optional": true + } + ], + "fmp": [], + "intrinio": [], + "tiingo": [ + { + "name": "offset", + "type": "int", + "description": "Page offset, used in conjunction with limit.", + "default": 0, + "optional": true + }, + { + "name": "source", + "type": "str", + "description": "A comma-separated list of the domains requested.", + "default": null, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[WorldNews]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['benzinga', 'fmp', 'intrinio', 'tiingo']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "datetime", + "description": "The date of the data. The published date of the article.", + "default": "", + "optional": false + }, + { + "name": "title", + "type": "str", + "description": "Title of the article.", + "default": "", + "optional": false + }, + { + "name": "images", + "type": "List[Dict[str, str]]", + "description": "Images associated with the article.", + "default": null, + "optional": true + }, + { + "name": "text", + "type": "str", + "description": "Text/body of the article.", + "default": null, + "optional": true + }, + { + "name": "url", + "type": "str", + "description": "URL to the article.", + "default": null, + "optional": true + } + ], + "benzinga": [ + { + "name": "id", + "type": "str", + "description": "Article ID.", + "default": "", + "optional": false + }, + { + "name": "author", + "type": "str", + "description": "Author of the news.", + "default": null, + "optional": true + }, + { + "name": "teaser", + "type": "str", + "description": "Teaser of the news.", + "default": null, + "optional": true + }, + { + "name": "channels", + "type": "str", + "description": "Channels associated with the news.", + "default": null, + "optional": true + }, + { + "name": "stocks", + "type": "str", + "description": "Stocks associated with the news.", + "default": null, + "optional": true + }, + { + "name": "tags", + "type": "str", + "description": "Tags associated with the news.", + "default": null, + "optional": true + }, + { + "name": "updated", + "type": "datetime", + "description": "Updated date of the news.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "site", + "type": "str", + "description": "News source.", + "default": "", + "optional": false + } + ], + "intrinio": [ + { + "name": "id", + "type": "str", + "description": "Article ID.", + "default": "", + "optional": false + }, + { + "name": "company", + "type": "Dict[str, Any]", + "description": "Company details related to the news article.", + "default": "", + "optional": false + } + ], + "tiingo": [ + { + "name": "symbols", + "type": "str", + "description": "Ticker tagged in the fetched news.", + "default": null, + "optional": true + }, + { + "name": "article_id", + "type": "int", + "description": "Unique ID of the news article.", + "default": "", + "optional": false + }, + { + "name": "site", + "type": "str", + "description": "News source.", + "default": "", + "optional": false + }, + { + "name": "tags", + "type": "str", + "description": "Tags associated with the news article.", + "default": null, + "optional": true + }, + { + "name": "crawl_date", + "type": "datetime", + "description": "Date the news article was crawled.", + "default": "", + "optional": false + } + ] + }, + "model": "WorldNews" + }, + "/news/company": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Company News. Get news for one or more companies.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.news.company(provider='benzinga')\nobb.news.company(limit=100, provider='benzinga')\n# Get news on the specified dates.\nobb.news.company(symbol='AAPL', start_date='2024-02-01', end_date='2024-02-07', provider='intrinio')\n# Display the headlines of the news.\nobb.news.company(symbol='AAPL', display=headline, provider='benzinga')\n# Get news for multiple symbols.\nobb.news.company(symbol='aapl,tsla', provider='fmp')\n# Get news company's ISIN.\nobb.news.company(symbol='NVDA', isin=US0378331005, provider='benzinga')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "Union[str, List[str]]", + "description": "Symbol to get data for. Multiple items allowed for provider(s): benzinga, fmp, intrinio, polygon, tiingo, yfinance.", + "default": null, + "optional": true + }, + { + "name": "start_date", + "type": "Union[date, str]", + "description": "Start date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "end_date", + "type": "Union[date, str]", + "description": "End date of the data, in YYYY-MM-DD format.", + "default": null, + "optional": true + }, + { + "name": "limit", + "type": "Annotated[int, Ge(ge=0)]", + "description": "The number of data entries to return.", + "default": 2500, + "optional": true + }, + { + "name": "provider", + "type": "Literal['benzinga', 'fmp', 'intrinio', 'polygon', 'tiingo', 'yfinance']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'benzinga' if there is no default.", + "default": "benzinga", + "optional": true + } + ], + "benzinga": [ + { + "name": "date", + "type": "Union[date, str]", + "description": "A specific date to get data for.", + "default": null, + "optional": true + }, + { + "name": "display", + "type": "Literal['headline', 'abstract', 'full']", + "description": "Specify headline only (headline), headline + teaser (abstract), or headline + full body (full).", + "default": "full", + "optional": true + }, + { + "name": "updated_since", + "type": "int", + "description": "Number of seconds since the news was updated.", + "default": null, + "optional": true + }, + { + "name": "published_since", + "type": "int", + "description": "Number of seconds since the news was published.", + "default": null, + "optional": true + }, + { + "name": "sort", + "type": "Literal['id', 'created', 'updated']", + "description": "Key to sort the news by.", + "default": "created", + "optional": true + }, + { + "name": "order", + "type": "Literal['asc', 'desc']", + "description": "Order to sort the news by.", + "default": "desc", + "optional": true + }, + { + "name": "isin", + "type": "str", + "description": "The company's ISIN.", + "default": null, + "optional": true + }, + { + "name": "cusip", + "type": "str", + "description": "The company's CUSIP.", + "default": null, + "optional": true + }, + { + "name": "channels", + "type": "str", + "description": "Channels of the news to retrieve.", + "default": null, + "optional": true + }, + { + "name": "topics", + "type": "str", + "description": "Topics of the news to retrieve.", + "default": null, + "optional": true + }, + { + "name": "authors", + "type": "str", + "description": "Authors of the news to retrieve.", + "default": null, + "optional": true + }, + { + "name": "content_types", + "type": "str", + "description": "Content types of the news to retrieve.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "page", + "type": "int", + "description": "Page number of the results. Use in combination with limit.", + "default": 0, + "optional": true + } + ], + "intrinio": [], + "polygon": [ + { + "name": "order", + "type": "Literal['asc', 'desc']", + "description": "Sort order of the articles.", + "default": "desc", + "optional": true + } + ], + "tiingo": [ + { + "name": "offset", + "type": "int", + "description": "Page offset, used in conjunction with limit.", + "default": 0, + "optional": true + }, + { + "name": "source", + "type": "str", + "description": "A comma-separated list of the domains requested.", + "default": null, + "optional": true + } + ], + "yfinance": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[CompanyNews]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['benzinga', 'fmp', 'intrinio', 'polygon', 'tiingo', 'yfinance']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "date", + "type": "datetime", + "description": "The date of the data. Here it is the published date of the article.", + "default": "", + "optional": false + }, + { + "name": "title", + "type": "str", + "description": "Title of the article.", + "default": "", + "optional": false + }, + { + "name": "text", + "type": "str", + "description": "Text/body of the article.", + "default": null, + "optional": true + }, + { + "name": "images", + "type": "List[Dict[str, str]]", + "description": "Images associated with the article.", + "default": null, + "optional": true + }, + { + "name": "url", + "type": "str", + "description": "URL to the article.", + "default": "", + "optional": false + }, + { + "name": "symbols", + "type": "str", + "description": "Symbols associated with the article.", + "default": null, + "optional": true + } + ], + "benzinga": [ + { + "name": "id", + "type": "str", + "description": "Article ID.", + "default": "", + "optional": false + }, + { + "name": "author", + "type": "str", + "description": "Author of the article.", + "default": null, + "optional": true + }, + { + "name": "teaser", + "type": "str", + "description": "Teaser of the news.", + "default": null, + "optional": true + }, + { + "name": "channels", + "type": "str", + "description": "Channels associated with the news.", + "default": null, + "optional": true + }, + { + "name": "stocks", + "type": "str", + "description": "Stocks associated with the news.", + "default": null, + "optional": true + }, + { + "name": "tags", + "type": "str", + "description": "Tags associated with the news.", + "default": null, + "optional": true + }, + { + "name": "updated", + "type": "datetime", + "description": "Updated date of the news.", + "default": null, + "optional": true + } + ], + "fmp": [ + { + "name": "source", + "type": "str", + "description": "Name of the news source.", + "default": "", + "optional": false + } + ], + "intrinio": [ + { + "name": "id", + "type": "str", + "description": "Article ID.", + "default": "", + "optional": false + } + ], + "polygon": [ + { + "name": "source", + "type": "str", + "description": "Source of the article.", + "default": null, + "optional": true + }, + { + "name": "tags", + "type": "str", + "description": "Keywords/tags in the article", + "default": null, + "optional": true + }, + { + "name": "id", + "type": "str", + "description": "Article ID.", + "default": "", + "optional": false + }, + { + "name": "amp_url", + "type": "str", + "description": "AMP URL.", + "default": null, + "optional": true + }, + { + "name": "publisher", + "type": "PolygonPublisher", + "description": "Publisher of the article.", + "default": "", + "optional": false + } + ], + "tiingo": [ + { + "name": "tags", + "type": "str", + "description": "Tags associated with the news article.", + "default": null, + "optional": true + }, + { + "name": "article_id", + "type": "int", + "description": "Unique ID of the news article.", + "default": "", + "optional": false + }, + { + "name": "source", + "type": "str", + "description": "News source.", + "default": "", + "optional": false + }, + { + "name": "crawl_date", + "type": "datetime", + "description": "Date the news article was crawled.", + "default": "", + "optional": false + } + ], + "yfinance": [ + { + "name": "source", + "type": "str", + "description": "Source of the news article", + "default": "", + "optional": false + } + ] + }, + "model": "CompanyNews" + }, + "/regulators/sec/cik_map": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Map a ticker symbol to a CIK number.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.regulators.sec.cik_map(symbol='MSFT', provider='sec')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol to get data for.", + "default": "", + "optional": false + }, + { + "name": "provider", + "type": "Literal['sec']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'sec' if there is no default.", + "default": "sec", + "optional": true + } + ], + "sec": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[CikMap]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['sec']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [ + { + "name": "cik", + "type": "Union[int, str]", + "description": "Central Index Key (CIK) for the requested entity.", + "default": null, + "optional": true + } + ], + "sec": [] + }, + "model": "CikMap" + }, + "/regulators/sec/institutions_search": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Search SEC-regulated institutions by name and return a list of results with CIK numbers.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.regulators.sec.institutions_search(provider='sec')\nobb.regulators.sec.institutions_search(query='blackstone real estate', provider='sec')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "query", + "type": "str", + "description": "Search query.", + "default": "", + "optional": true + }, + { + "name": "use_cache", + "type": "bool", + "description": "Whether or not to use cache. If True, cache will store for seven days.", + "default": true, + "optional": true + }, + { + "name": "provider", + "type": "Literal['sec']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'sec' if there is no default.", + "default": "sec", + "optional": true + } + ], + "sec": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[InstitutionsSearch]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['sec']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [], + "sec": [ + { + "name": "name", + "type": "str", + "description": "The name of the institution.", + "default": null, + "optional": true + }, + { + "name": "cik", + "type": "Union[int, str]", + "description": "Central Index Key (CIK)", + "default": null, + "optional": true + } + ] + }, + "model": "InstitutionsSearch" + }, + "/regulators/sec/schema_files": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Use tool for navigating the directory of SEC XML schema files by year.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.regulators.sec.schema_files(provider='sec')\n# Get a list of schema files.\ndata = obb.regulators.sec.schema_files().results\ndata.files[0]\n'https://xbrl.fasb.org/us-gaap/'\n# The directory structure can be navigated by constructing a URL from the 'results' list.\nurl = data.files[0]+data.files[-1]\n# The URL base will always be the 0 position in the list, feed the URL back in as a parameter.\nobb.regulators.sec.schema_files(url=url).results.files\n['https://xbrl.fasb.org/us-gaap/2024/'\n'USGAAP2024FileList.xml'\n'dis/'\n'dqcrules/'\n'ebp/'\n'elts/'\n'entire/'\n'meta/'\n'stm/'\n'us-gaap-2024.zip']\n```\n\n", + "parameters": { + "standard": [ + { + "name": "query", + "type": "str", + "description": "Search query.", + "default": "", + "optional": true + }, + { + "name": "use_cache", + "type": "bool", + "description": "Whether or not to use cache. If True, cache will store for seven days.", + "default": true, + "optional": true + }, + { + "name": "provider", + "type": "Literal['sec']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'sec' if there is no default.", + "default": "sec", + "optional": true + } + ], + "sec": [ + { + "name": "url", + "type": "str", + "description": "Enter an optional URL path to fetch the next level.", + "default": null, + "optional": true + } + ] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[SchemaFiles]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['sec']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [], + "sec": [ + { + "name": "files", + "type": "List[str]", + "description": "Dictionary of URLs to SEC Schema Files", + "default": "", + "optional": false + } + ] + }, + "model": "SchemaFiles" + }, + "/regulators/sec/symbol_map": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Map a CIK number to a ticker symbol, leading 0s can be omitted or included.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.regulators.sec.symbol_map(query='0000789019', provider='sec')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "query", + "type": "str", + "description": "Search query.", + "default": "", + "optional": false + }, + { + "name": "use_cache", + "type": "bool", + "description": "Whether or not to use cache. If True, cache will store for seven days.", + "default": true, + "optional": true + }, + { + "name": "provider", + "type": "Literal['sec']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'sec' if there is no default.", + "default": "sec", + "optional": true + } + ], + "sec": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[SymbolMap]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['sec']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [], + "sec": [ + { + "name": "symbol", + "type": "str", + "description": "Symbol representing the entity requested in the data.", + "default": "", + "optional": false + } + ] + }, + "model": "SymbolMap" + }, + "/regulators/sec/rss_litigation": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Get the RSS feed that provides links to litigation releases concerning civil lawsuits brought by the Commission in federal court.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.regulators.sec.rss_litigation(provider='sec')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "provider", + "type": "Literal['sec']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'sec' if there is no default.", + "default": "sec", + "optional": true + } + ], + "sec": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[RssLitigation]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['sec']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [], + "sec": [ + { + "name": "published", + "type": "datetime", + "description": "The date of publication.", + "default": "", + "optional": false + }, + { + "name": "title", + "type": "str", + "description": "The title of the release.", + "default": "", + "optional": false + }, + { + "name": "summary", + "type": "str", + "description": "Short summary of the release.", + "default": "", + "optional": false + }, + { + "name": "id", + "type": "str", + "description": "The identifier associated with the release.", + "default": "", + "optional": false + }, + { + "name": "link", + "type": "str", + "description": "URL to the release.", + "default": "", + "optional": false + } + ] + }, + "model": "RssLitigation" + }, + "/regulators/sec/sic_search": { + "deprecated": { + "flag": null, + "message": null + }, + "description": "Search for Industry Titles, Reporting Office, and SIC Codes. An empty query string returns all results.", + "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.regulators.sec.sic_search(provider='sec')\nobb.regulators.sec.sic_search(query='real estate investment trusts', provider='sec')\n```\n\n", + "parameters": { + "standard": [ + { + "name": "query", + "type": "str", + "description": "Search query.", + "default": "", + "optional": true + }, + { + "name": "use_cache", + "type": "bool", + "description": "Whether or not to use cache. If True, cache will store for seven days.", + "default": true, + "optional": true + }, + { + "name": "provider", + "type": "Literal['sec']", + "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'sec' if there is no default.", + "default": "sec", + "optional": true + } + ], + "sec": [] + }, + "returns": { + "OBBject": [ + { + "name": "results", + "type": "List[SicSearch]", + "description": "Serializable results." + }, + { + "name": "provider", + "type": "Optional[Literal['sec']]", + "description": "Provider name." + }, + { + "name": "warnings", + "type": "Optional[List[Warning_]]", + "description": "List of warnings." + }, + { + "name": "chart", + "type": "Optional[Chart]", + "description": "Chart object." + }, + { + "name": "extra", + "type": "Dict[str, Any]", + "description": "Extra info." + } + ] + }, + "data": { + "standard": [], + "sec": [ + { + "name": "sic", + "type": "int", + "description": "Sector Industrial Code (SIC)", + "default": "", + "optional": false + }, + { + "name": "industry", + "type": "str", + "description": "Industry title.", + "default": "", + "optional": false + }, + { + "name": "office", + "type": "str", + "description": "Reporting office within the Corporate Finance Office", + "default": "", + "optional": false + } + ] + }, + "model": "SicSearch" + } }, - "/regulators/sec/symbol_map": { - "deprecated": { - "flag": null, - "message": null + "routers": { + "/crypto": { + "description": "Cryptocurrency market data." }, - "description": "Map a CIK number to a ticker symbol, leading 0s can be omitted or included.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.regulators.sec.symbol_map(query='0000789019', provider='sec')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "query", - "type": "str", - "description": "Search query.", - "default": "", - "optional": false - }, - { - "name": "use_cache", - "type": "bool", - "description": "Whether or not to use cache. If True, cache will store for seven days.", - "default": true, - "optional": true - }, - { - "name": "provider", - "type": "Literal['sec']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'sec' if there is no default.", - "default": "sec", - "optional": true - } - ], - "sec": [] - }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[SymbolMap]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['sec']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] - }, - "data": { - "standard": [], - "sec": [ - { - "name": "symbol", - "type": "str", - "description": "Symbol representing the entity requested in the data.", - "default": "", - "optional": false - } - ] - }, - "model": "SymbolMap" - }, - "/regulators/sec/rss_litigation": { - "deprecated": { - "flag": null, - "message": null + "/currency": { + "description": "Foreign exchange (FX) market data." }, - "description": "The RSS feed provides links to litigation releases concerning civil lawsuits brought by the Commission in federal court.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.regulators.sec.rss_litigation(provider='sec')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "provider", - "type": "Literal['sec']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'sec' if there is no default.", - "default": "sec", - "optional": true - } - ], - "sec": [] + "/derivatives": { + "description": "Derivatives market data." }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[RssLitigation]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['sec']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] + "/economy": { + "description": "Economic data." }, - "data": { - "standard": [], - "sec": [ - { - "name": "published", - "type": "datetime", - "description": "The date of publication.", - "default": "", - "optional": false - }, - { - "name": "title", - "type": "str", - "description": "The title of the release.", - "default": "", - "optional": false - }, - { - "name": "summary", - "type": "str", - "description": "Short summary of the release.", - "default": "", - "optional": false - }, - { - "name": "id", - "type": "str", - "description": "The identifier associated with the release.", - "default": "", - "optional": false - }, - { - "name": "link", - "type": "str", - "description": "URL to the release.", - "default": "", - "optional": false - } - ] + "/equity": { + "description": "Equity market data." }, - "model": "RssLitigation" - }, - "/regulators/sec/sic_search": { - "deprecated": { - "flag": null, - "message": null + "/etf": { + "description": "Exchange Traded Funds market data." }, - "description": "Search for Industry Titles, Reporting Office, and SIC Codes. An empty query string returns all results.", - "examples": "\nExamples\n--------\n\n```python\nfrom openbb import obb\nobb.regulators.sec.sic_search(provider='sec')\nobb.regulators.sec.sic_search(query='real estate investment trusts', provider='sec')\n```\n\n", - "parameters": { - "standard": [ - { - "name": "query", - "type": "str", - "description": "Search query.", - "default": "", - "optional": true - }, - { - "name": "use_cache", - "type": "bool", - "description": "Whether or not to use cache. If True, cache will store for seven days.", - "default": true, - "optional": true - }, - { - "name": "provider", - "type": "Literal['sec']", - "description": "The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'sec' if there is no default.", - "default": "sec", - "optional": true - } - ], - "sec": [] + "/fixedincome": { + "description": "Fixed Income market data." }, - "returns": { - "OBBject": [ - { - "name": "results", - "type": "List[SicSearch]", - "description": "Serializable results." - }, - { - "name": "provider", - "type": "Optional[Literal['sec']]", - "description": "Provider name." - }, - { - "name": "warnings", - "type": "Optional[List[Warning_]]", - "description": "List of warnings." - }, - { - "name": "chart", - "type": "Optional[Chart]", - "description": "Chart object." - }, - { - "name": "extra", - "type": "Dict[str, Any]", - "description": "Extra info." - } - ] + "/index": { + "description": "Indices data." }, - "data": { - "standard": [], - "sec": [ - { - "name": "sic", - "type": "int", - "description": "Sector Industrial Code (SIC)", - "default": "", - "optional": false - }, - { - "name": "industry", - "type": "str", - "description": "Industry title.", - "default": "", - "optional": false - }, - { - "name": "office", - "type": "str", - "description": "Reporting office within the Corporate Finance Office", - "default": "", - "optional": false - } - ] + "/news": { + "description": "Financial market news data." }, - "model": "SicSearch" + "/regulators": { + "description": "Financial market regulators data." + } } } \ No newline at end of file diff --git a/openbb_platform/openbb/package/__extensions__.py b/openbb_platform/openbb/package/__extensions__.py index 4bca6a0d00d..a2300745866 100644 --- a/openbb_platform/openbb/package/__extensions__.py +++ b/openbb_platform/openbb/package/__extensions__.py @@ -20,29 +20,29 @@ Routers: /regulators Extensions: - - commodity@1.0.2 - - crypto@1.1.4 - - currency@1.1.4 - - derivatives@1.1.4 - - economy@1.1.4 - - equity@1.1.4 - - etf@1.1.4 - - fixedincome@1.1.4 - - index@1.1.4 - - news@1.1.4 - - regulators@1.1.4 + - commodity@1.0.4 + - crypto@1.1.5 + - currency@1.1.5 + - derivatives@1.1.5 + - economy@1.1.5 + - equity@1.1.5 + - etf@1.1.5 + - fixedincome@1.1.5 + - index@1.1.5 + - news@1.1.5 + - regulators@1.1.5 - - benzinga@1.1.4 - - federal_reserve@1.1.4 - - fmp@1.1.4 - - fred@1.1.4 - - intrinio@1.1.4 - - oecd@1.1.4 - - polygon@1.1.4 - - sec@1.1.4 - - tiingo@1.1.4 - - tradingeconomics@1.1.4 - - yfinance@1.1.4 """ + - benzinga@1.1.5 + - federal_reserve@1.1.5 + - fmp@1.1.5 + - fred@1.1.5 + - intrinio@1.1.5 + - oecd@1.1.5 + - polygon@1.1.5 + - sec@1.1.5 + - tiingo@1.1.5 + - tradingeconomics@1.1.5 + - yfinance@1.1.5 """ # fmt: on def __repr__(self) -> str: diff --git a/openbb_platform/openbb/package/crypto.py b/openbb_platform/openbb/package/crypto.py index 7fe45375b17..246dbc86584 100644 --- a/openbb_platform/openbb/package/crypto.py +++ b/openbb_platform/openbb/package/crypto.py @@ -2,7 +2,7 @@ from typing import Literal, Optional -from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.field import OpenBBField from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import exception_handler, validate @@ -31,11 +31,11 @@ class ROUTER_crypto(Container): def search( self, query: Annotated[ - Optional[str], OpenBBCustomParameter(description="Search query.") + Optional[str], OpenBBField(description="Search query.") ] = None, provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, diff --git a/openbb_platform/openbb/package/crypto_price.py b/openbb_platform/openbb/package/crypto_price.py index 16cfc3fd056..7c3bedbb362 100644 --- a/openbb_platform/openbb/package/crypto_price.py +++ b/openbb_platform/openbb/package/crypto_price.py @@ -3,7 +3,7 @@ import datetime from typing import List, Literal, Optional, Union -from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.field import OpenBBField from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import exception_handler, validate @@ -25,25 +25,21 @@ class ROUTER_crypto_price(Container): self, symbol: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( + OpenBBField( description="Symbol to get data for. Can use CURR1-CURR2 or CURR1CURR2 format. Multiple comma separated items allowed for provider(s): fmp, polygon, tiingo, yfinance." ), ], start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ Optional[Literal["fmp", "polygon", "tiingo", "yfinance"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, diff --git a/openbb_platform/openbb/package/currency.py b/openbb_platform/openbb/package/currency.py index 770dba593b8..e27529d8c14 100644 --- a/openbb_platform/openbb/package/currency.py +++ b/openbb_platform/openbb/package/currency.py @@ -2,7 +2,7 @@ from typing import List, Literal, Optional, Union -from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.field import OpenBBField from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import exception_handler, validate @@ -33,7 +33,7 @@ class ROUTER_currency(Container): self, provider: Annotated[ Optional[Literal["fmp", "intrinio", "polygon"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -153,25 +153,25 @@ class ROUTER_currency(Container): self, base: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( + OpenBBField( description="The base currency symbol. Multiple comma separated items allowed for provider(s): fmp." ), ] = "usd", quote_type: Annotated[ Literal["direct", "indirect"], - OpenBBCustomParameter( + OpenBBField( description="Whether the quote is direct or indirect. Selecting 'direct' will return the exchange rate as the amount of domestic currency required to buy one unit of the foreign currency. Selecting 'indirect' (default) will return the exchange rate as the amount of foreign currency required to buy one unit of the domestic currency." ), ] = "indirect", counter_currencies: Annotated[ Union[List[str], str, None], - OpenBBCustomParameter( + OpenBBField( description="An optional list of counter currency symbols to filter for. None returns all." ), ] = None, provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, diff --git a/openbb_platform/openbb/package/currency_price.py b/openbb_platform/openbb/package/currency_price.py index 5def1fa4952..396977d0443 100644 --- a/openbb_platform/openbb/package/currency_price.py +++ b/openbb_platform/openbb/package/currency_price.py @@ -3,7 +3,7 @@ import datetime from typing import List, Literal, Optional, Union -from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.field import OpenBBField from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import exception_handler, validate @@ -25,25 +25,21 @@ class ROUTER_currency_price(Container): self, symbol: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( + OpenBBField( description="Symbol to get data for. Can use CURR1-CURR2 or CURR1CURR2 format. Multiple comma separated items allowed for provider(s): fmp, polygon, tiingo, yfinance." ), ], start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ Optional[Literal["fmp", "polygon", "tiingo", "yfinance"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, diff --git a/openbb_platform/openbb/package/derivatives_options.py b/openbb_platform/openbb/package/derivatives_options.py index 99a5e45a156..4e95763ec5f 100644 --- a/openbb_platform/openbb/package/derivatives_options.py +++ b/openbb_platform/openbb/package/derivatives_options.py @@ -2,7 +2,7 @@ from typing import Literal, Optional -from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.field import OpenBBField from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import exception_handler, validate @@ -23,12 +23,10 @@ class ROUTER_derivatives_options(Container): @validate def chains( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], provider: Annotated[ Optional[Literal["intrinio"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'intrinio' if there is\n no default." ), ] = None, @@ -183,13 +181,11 @@ class ROUTER_derivatives_options(Container): self, symbol: Annotated[ Optional[str], - OpenBBCustomParameter( - description="Symbol to get data for. (the underlying symbol)" - ), + OpenBBField(description="Symbol to get data for. (the underlying symbol)"), ] = None, provider: Annotated[ Optional[Literal["intrinio"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'intrinio' if there is\n no default." ), ] = None, diff --git a/openbb_platform/openbb/package/economy.py b/openbb_platform/openbb/package/economy.py index b7fbc25648a..c687d8a100b 100644 --- a/openbb_platform/openbb/package/economy.py +++ b/openbb_platform/openbb/package/economy.py @@ -3,10 +3,7 @@ import datetime from typing import List, Literal, Optional, Union -from openbb_core.app.model.custom_parameter import ( - OpenBBCustomChoices, - OpenBBCustomParameter, -) +from openbb_core.app.model.field import OpenBBField from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import exception_handler, validate @@ -39,19 +36,15 @@ class ROUTER_economy(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ Optional[Literal["fmp", "tradingeconomics"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -162,26 +155,25 @@ class ROUTER_economy(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ Optional[Literal["oecd"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'oecd' if there is\n no default." ), ] = None, **kwargs ) -> OBBject: - """The composite leading indicator (CLI) is designed to provide early signals of turning points + """Use the composite leading indicator (CLI). + + It is designed to provide early signals of turning points in business cycles showing fluctuation of the economic activity around its long term potential level. + CLIs show short-term economic movements in qualitative rather than quantitative terms. @@ -252,10 +244,8 @@ class ROUTER_economy(Container): self, country: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( - description="The country to get data. Multiple comma separated items allowed for provider(s): fred." - ), - OpenBBCustomChoices( + OpenBBField( + description="The country to get data. Multiple comma separated items allowed for provider(s): fred.", choices=[ "australia", "austria", @@ -306,48 +296,44 @@ class ROUTER_economy(Container): "turkey", "united_kingdom", "united_states", - ] + ], ), ], units: Annotated[ Literal["growth_previous", "growth_same", "index_2015"], - OpenBBCustomParameter( + OpenBBField( description="The unit of measurement for the data.\n Options:\n - `growth_previous`: Percent growth from the previous period.\n If monthly data, this is month-over-month, etc\n - `growth_same`: Percent growth from the same period in the previous year.\n If looking at monthly data, this would be year-over-year, etc.\n - `index_2015`: Rescaled index value, such that the value in 2015 is 100." ), ] = "growth_same", frequency: Annotated[ Literal["monthly", "quarter", "annual"], - OpenBBCustomParameter( + OpenBBField( description="The frequency of the data.\n Options: `monthly`, `quarter`, and `annual`." ), ] = "monthly", harmonized: Annotated[ - bool, - OpenBBCustomParameter( - description="Whether you wish to obtain harmonized data." - ), + bool, OpenBBField(description="Whether you wish to obtain harmonized data.") ] = False, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ Optional[Literal["fred"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fred' if there is\n no default." ), ] = None, **kwargs ) -> OBBject: - """Consumer Price Index (CPI). Returns either the rescaled index value, or a rate of change (inflation). + """Get Consumer Price Index (CPI). + + Returns either the rescaled index value, or a rate of change (inflation). + Parameters ---------- @@ -429,34 +415,29 @@ class ROUTER_economy(Container): @validate def fred_regional( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, limit: Annotated[ Optional[int], - OpenBBCustomParameter(description="The number of data entries to return."), + OpenBBField(description="The number of data entries to return."), ] = 100000, provider: Annotated[ Optional[Literal["fred"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fred' if there is\n no default." ), ] = None, **kwargs ) -> OBBject: """Query the Geo Fred API for regional economic data by series group. + The series group ID is found by using `fred_search` and the `series_id` parameter. @@ -585,17 +566,18 @@ class ROUTER_economy(Container): def fred_search( self, query: Annotated[ - Optional[str], OpenBBCustomParameter(description="The search word(s).") + Optional[str], OpenBBField(description="The search word(s).") ] = None, provider: Annotated[ Optional[Literal["fred"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fred' if there is\n no default." ), ] = None, **kwargs ) -> OBBject: """Search for FRED series or economic releases by ID or string. + This does not return the observation values, only the metadata. Use this function to find series IDs for `fred_series()`. @@ -713,29 +695,25 @@ class ROUTER_economy(Container): self, symbol: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( + OpenBBField( description="Symbol to get data for. Multiple comma separated items allowed for provider(s): fred." ), ], start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, limit: Annotated[ Optional[int], - OpenBBCustomParameter(description="The number of data entries to return."), + OpenBBField(description="The number of data entries to return."), ] = 100000, provider: Annotated[ Optional[Literal["fred", "intrinio"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fred' if there is\n no default." ), ] = None, @@ -867,25 +845,22 @@ class ROUTER_economy(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ Optional[Literal["oecd"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'oecd' if there is\n no default." ), ] = None, **kwargs ) -> OBBject: - """Long-term interest rates refer to government bonds maturing in ten years. + """Get Long-term interest rates that refer to government bonds maturing in ten years. + Rates are mainly determined by the price charged by the lender, the risk from the borrower and the fall in the capital value. Long-term interest rates are generally averages of daily rates, measured as a percentage. These interest rates are implied by the prices at which the government bonds are @@ -895,6 +870,7 @@ class ROUTER_economy(Container): Low long-term interest rates encourage investment in new equipment and high interest rates discourage it. Investment is, in turn, a major source of economic growth. + Parameters ---------- start_date : Union[datetime.date, None, str] @@ -964,31 +940,28 @@ class ROUTER_economy(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, adjusted: Annotated[ Optional[bool], - OpenBBCustomParameter( - description="Whether to return seasonally adjusted data." - ), + OpenBBField(description="Whether to return seasonally adjusted data."), ] = True, provider: Annotated[ Optional[Literal["federal_reserve"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'federal_reserve' if there is\n no default." ), ] = None, **kwargs ) -> OBBject: - """Money Measures (M1/M2 and components). The Federal Reserve publishes as part of the H.6 Release. + """Get Money Measures (M1/M2 and components). + + The Federal Reserve publishes as part of the H.6 Release. + Parameters ---------- @@ -1068,13 +1041,13 @@ class ROUTER_economy(Container): self, provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, **kwargs ) -> OBBject: - """Market Risk Premium by country. + """Get Market Risk Premium by country. Parameters ---------- @@ -1135,26 +1108,25 @@ class ROUTER_economy(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ Optional[Literal["oecd"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'oecd' if there is\n no default." ), ] = None, **kwargs ) -> OBBject: - """Short-term interest rates are the rates at which short-term borrowings are effected between + """Get Short-term interest rates. + + They are the rates at which short-term borrowings are effected between financial institutions or the rate at which short-term government paper is issued or traded in the market. + Short-term interest rates are generally averages of daily rates, measured as a percentage. Short-term interest rates are based on three-month money market rates where available. Typical standardised names are "money market rate" and "treasury bill rate". @@ -1229,25 +1201,21 @@ class ROUTER_economy(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ Optional[Literal["oecd"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'oecd' if there is\n no default." ), ] = None, **kwargs ) -> OBBject: - """Global unemployment data. + """Get global unemployment data. Parameters ---------- diff --git a/openbb_platform/openbb/package/economy_gdp.py b/openbb_platform/openbb/package/economy_gdp.py index d4a4bb05a85..3f26966bffb 100644 --- a/openbb_platform/openbb/package/economy_gdp.py +++ b/openbb_platform/openbb/package/economy_gdp.py @@ -3,7 +3,7 @@ import datetime from typing import Literal, Optional, Union -from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.field import OpenBBField from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import exception_handler, validate @@ -27,37 +27,33 @@ class ROUTER_economy_gdp(Container): self, period: Annotated[ Literal["quarter", "annual"], - OpenBBCustomParameter( + OpenBBField( description="Time period of the data to return. Units for nominal GDP period. Either quarter or annual." ), ] = "annual", start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, type: Annotated[ Literal["nominal", "real"], - OpenBBCustomParameter( + OpenBBField( description="Type of GDP to get forecast of. Either nominal or real." ), ] = "real", provider: Annotated[ Optional[Literal["oecd"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'oecd' if there is\n no default." ), ] = None, **kwargs ) -> OBBject: - """Forecasted GDP Data. + """Get Forecasted GDP Data. Parameters ---------- @@ -130,31 +126,27 @@ class ROUTER_economy_gdp(Container): self, units: Annotated[ Literal["usd", "usd_cap"], - OpenBBCustomParameter( + OpenBBField( description="The unit of measurement for the data. Units to get nominal GDP in. Either usd or usd_cap indicating per capita." ), ] = "usd", start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ Optional[Literal["oecd"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'oecd' if there is\n no default." ), ] = None, **kwargs ) -> OBBject: - """Nominal GDP Data. + """Get Nominal GDP Data. Parameters ---------- @@ -224,31 +216,27 @@ class ROUTER_economy_gdp(Container): self, units: Annotated[ Literal["idx", "qoq", "yoy"], - OpenBBCustomParameter( + OpenBBField( description="The unit of measurement for the data. Either idx (indicating 2015=100), qoq (previous period) or yoy (same period, previous year).)" ), ] = "yoy", start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ Optional[Literal["oecd"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'oecd' if there is\n no default." ), ] = None, **kwargs ) -> OBBject: - """Real GDP Data. + """Get Real GDP Data. Parameters ---------- diff --git a/openbb_platform/openbb/package/equity.py b/openbb_platform/openbb/package/equity.py index a984281621c..a044ac60f54 100644 --- a/openbb_platform/openbb/package/equity.py +++ b/openbb_platform/openbb/package/equity.py @@ -2,7 +2,7 @@ from typing import List, Literal, Optional, Union -from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.field import OpenBBField from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import exception_handler, validate @@ -78,7 +78,7 @@ class ROUTER_equity(Container): self, provider: Annotated[ Optional[Literal["fmp", "intrinio", "polygon"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -253,13 +253,13 @@ class ROUTER_equity(Container): self, symbol: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( + OpenBBField( description="Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio, yfinance." ), ], provider: Annotated[ Optional[Literal["fmp", "intrinio", "yfinance"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -448,14 +448,16 @@ class ROUTER_equity(Container): self, provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, **kwargs ) -> OBBject: - """Screen for companies meeting various criteria. These criteria include - market cap, price, beta, volume, and dividend yield. + """Screen for companies meeting various criteria. + + These criteria include market cap, price, beta, volume, and dividend yield. + Parameters ---------- @@ -568,18 +570,16 @@ class ROUTER_equity(Container): @validate def search( self, - query: Annotated[str, OpenBBCustomParameter(description="Search query.")] = "", + query: Annotated[str, OpenBBField(description="Search query.")] = "", is_symbol: Annotated[ - bool, - OpenBBCustomParameter(description="Whether to search by ticker symbol."), + bool, OpenBBField(description="Whether to search by ticker symbol.") ] = False, use_cache: Annotated[ - Optional[bool], - OpenBBCustomParameter(description="Whether to use the cache or not."), + Optional[bool], OpenBBField(description="Whether to use the cache or not.") ] = True, provider: Annotated[ Optional[Literal["intrinio", "sec"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'intrinio' if there is\n no default." ), ] = None, diff --git a/openbb_platform/openbb/package/equity_calendar.py b/openbb_platform/openbb/package/equity_calendar.py index 927f6a74e99..891ac9995f0 100644 --- a/openbb_platform/openbb/package/equity_calendar.py +++ b/openbb_platform/openbb/package/equity_calendar.py @@ -3,7 +3,7 @@ import datetime from typing import Literal, Optional, Union -from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.field import OpenBBField from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import exception_handler, validate @@ -28,19 +28,15 @@ class ROUTER_equity_calendar(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -124,19 +120,15 @@ class ROUTER_equity_calendar(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -225,27 +217,23 @@ class ROUTER_equity_calendar(Container): def ipo( self, symbol: Annotated[ - Optional[str], OpenBBCustomParameter(description="Symbol to get data for.") + Optional[str], OpenBBField(description="Symbol to get data for.") ] = None, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, limit: Annotated[ Optional[int], - OpenBBCustomParameter(description="The number of data entries to return."), + OpenBBField(description="The number of data entries to return."), ] = 100, provider: Annotated[ Optional[Literal["intrinio"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'intrinio' if there is\n no default." ), ] = None, @@ -369,19 +357,15 @@ class ROUTER_equity_calendar(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, diff --git a/openbb_platform/openbb/package/equity_compare.py b/openbb_platform/openbb/package/equity_compare.py index 704c2328a1e..6daed76b856 100644 --- a/openbb_platform/openbb/package/equity_compare.py +++ b/openbb_platform/openbb/package/equity_compare.py @@ -2,7 +2,7 @@ from typing import Literal, Optional -from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.field import OpenBBField from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import exception_handler, validate @@ -22,12 +22,10 @@ class ROUTER_equity_compare(Container): @validate def peers( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -38,6 +36,7 @@ class ROUTER_equity_compare(Container): Peers consist of companies trading on the same exchange, operating within the same sector and with comparable market capitalizations. + Parameters ---------- symbol : str diff --git a/openbb_platform/openbb/package/equity_discovery.py b/openbb_platform/openbb/package/equity_discovery.py index 12df47ef903..770a2ce6dae 100644 --- a/openbb_platform/openbb/package/equity_discovery.py +++ b/openbb_platform/openbb/package/equity_discovery.py @@ -3,7 +3,7 @@ import datetime from typing import Literal, Optional, Union -from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.field import OpenBBField from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import exception_handler, validate @@ -32,13 +32,13 @@ class ROUTER_equity_discovery(Container): self, sort: Annotated[ Literal["asc", "desc"], - OpenBBCustomParameter( + OpenBBField( description="Sort order. Possible values: 'asc', 'desc'. Default: 'desc'." ), ] = "desc", provider: Annotated[ Optional[Literal["yfinance"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'yfinance' if there is\n no default." ), ] = None, @@ -120,13 +120,13 @@ class ROUTER_equity_discovery(Container): self, sort: Annotated[ Literal["asc", "desc"], - OpenBBCustomParameter( + OpenBBField( description="Sort order. Possible values: 'asc', 'desc'. Default: 'desc'." ), ] = "desc", provider: Annotated[ Optional[Literal["yfinance"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'yfinance' if there is\n no default." ), ] = None, @@ -208,36 +208,32 @@ class ROUTER_equity_discovery(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, form_type: Annotated[ Optional[str], - OpenBBCustomParameter( + OpenBBField( description="Filter by form type. Visit https://www.sec.gov/forms for a list of supported form types." ), ] = None, limit: Annotated[ - int, - OpenBBCustomParameter(description="The number of data entries to return."), + int, OpenBBField(description="The number of data entries to return.") ] = 100, provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, **kwargs ) -> OBBject: - """Get the URLs to SEC filings reported to EDGAR database, such as 10-K, 10-Q, 8-K, and more. SEC - filings include Form 10-K, Form 10-Q, Form 8-K, the proxy statement, Forms 3, 4, and 5, Schedule 13, Form 114, + """Get the URLs to SEC filings reported to EDGAR database, such as 10-K, 10-Q, 8-K, and more. + + SEC filings include Form 10-K, Form 10-Q, Form 8-K, the proxy statement, Forms 3, 4, and 5, Schedule 13, Form 114, Foreign Investment Disclosures and others. The annual 10-K report is required to be filed annually and includes the company's financial statements, management discussion and analysis, and audited financial statements. @@ -323,13 +319,13 @@ class ROUTER_equity_discovery(Container): self, sort: Annotated[ Literal["asc", "desc"], - OpenBBCustomParameter( + OpenBBField( description="Sort order. Possible values: 'asc', 'desc'. Default: 'desc'." ), ] = "desc", provider: Annotated[ Optional[Literal["yfinance"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'yfinance' if there is\n no default." ), ] = None, @@ -411,13 +407,13 @@ class ROUTER_equity_discovery(Container): self, sort: Annotated[ Literal["asc", "desc"], - OpenBBCustomParameter( + OpenBBField( description="Sort order. Possible values: 'asc', 'desc'. Default: 'desc'." ), ] = "desc", provider: Annotated[ Optional[Literal["yfinance"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'yfinance' if there is\n no default." ), ] = None, @@ -499,13 +495,13 @@ class ROUTER_equity_discovery(Container): self, sort: Annotated[ Literal["asc", "desc"], - OpenBBCustomParameter( + OpenBBField( description="Sort order. Possible values: 'asc', 'desc'. Default: 'desc'." ), ] = "desc", provider: Annotated[ Optional[Literal["yfinance"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'yfinance' if there is\n no default." ), ] = None, @@ -587,13 +583,13 @@ class ROUTER_equity_discovery(Container): self, sort: Annotated[ Literal["asc", "desc"], - OpenBBCustomParameter( + OpenBBField( description="Sort order. Possible values: 'asc', 'desc'. Default: 'desc'." ), ] = "desc", provider: Annotated[ Optional[Literal["yfinance"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'yfinance' if there is\n no default." ), ] = None, @@ -675,13 +671,13 @@ class ROUTER_equity_discovery(Container): self, sort: Annotated[ Literal["asc", "desc"], - OpenBBCustomParameter( + OpenBBField( description="Sort order. Possible values: 'asc', 'desc'. Default: 'desc'." ), ] = "desc", provider: Annotated[ Optional[Literal["yfinance"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'yfinance' if there is\n no default." ), ] = None, diff --git a/openbb_platform/openbb/package/equity_estimates.py b/openbb_platform/openbb/package/equity_estimates.py index 6a5ef3fa944..36212035e8b 100644 --- a/openbb_platform/openbb/package/equity_estimates.py +++ b/openbb_platform/openbb/package/equity_estimates.py @@ -2,7 +2,7 @@ from typing import List, Literal, Optional, Union -from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.field import OpenBBField from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import exception_handler, validate @@ -14,6 +14,8 @@ class ROUTER_equity_estimates(Container): """/equity/estimates analyst_search consensus + forward_eps + forward_sales historical price_target """ @@ -27,19 +29,19 @@ class ROUTER_equity_estimates(Container): self, analyst_name: Annotated[ Union[str, None, List[Optional[str]]], - OpenBBCustomParameter( + OpenBBField( description="Analyst names to return. Omitting will return all available analysts. Multiple comma separated items allowed for provider(s): benzinga." ), ] = None, firm_name: Annotated[ Union[str, None, List[Optional[str]]], - OpenBBCustomParameter( + OpenBBField( description="Firm names to return. Omitting will return all available firms. Multiple comma separated items allowed for provider(s): benzinga." ), ] = None, provider: Annotated[ Optional[Literal["benzinga"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'benzinga' if there is\n no default." ), ] = None, @@ -124,6 +126,10 @@ class ROUTER_equity_estimates(Container): The average percent (normalized) price difference per rating over the last month (provider: benzinga) std_dev_1m : Optional[float] The standard deviation in percent (normalized) price difference in the analyst's ratings over the last month (provider: benzinga) + smart_score_1m : Optional[float] + A weighted average smart score over the last month. (provider: benzinga) + success_rate_1m : Optional[float] + The percentage (normalized) of gain/loss ratings that resulted in a gain over the last month (provider: benzinga) gain_count_3m : Optional[int] The number of ratings that have gained value over the last 3 months (provider: benzinga) loss_count_3m : Optional[int] @@ -132,6 +138,10 @@ class ROUTER_equity_estimates(Container): The average percent (normalized) price difference per rating over the last 3 months (provider: benzinga) std_dev_3m : Optional[float] The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 3 months (provider: benzinga) + smart_score_3m : Optional[float] + A weighted average smart score over the last 3 months. (provider: benzinga) + success_rate_3m : Optional[float] + The percentage (normalized) of gain/loss ratings that resulted in a gain over the last 3 months (provider: benzinga) gain_count_6m : Optional[int] The number of ratings that have gained value over the last 6 months (provider: benzinga) loss_count_6m : Optional[int] @@ -148,6 +158,10 @@ class ROUTER_equity_estimates(Container): The average percent (normalized) price difference per rating over the last 9 months (provider: benzinga) std_dev_9m : Optional[float] The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 9 months (provider: benzinga) + smart_score_9m : Optional[float] + A weighted average smart score over the last 9 months. (provider: benzinga) + success_rate_9m : Optional[float] + The percentage (normalized) of gain/loss ratings that resulted in a gain over the last 9 months (provider: benzinga) gain_count_1y : Optional[int] The number of ratings that have gained value over the last 1 year (provider: benzinga) loss_count_1y : Optional[int] @@ -156,6 +170,10 @@ class ROUTER_equity_estimates(Container): The average percent (normalized) price difference per rating over the last 1 year (provider: benzinga) std_dev_1y : Optional[float] The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 1 year (provider: benzinga) + smart_score_1y : Optional[float] + A weighted average smart score over the last 1 year. (provider: benzinga) + success_rate_1y : Optional[float] + The percentage (normalized) of gain/loss ratings that resulted in a gain over the last 1 year (provider: benzinga) gain_count_2y : Optional[int] The number of ratings that have gained value over the last 2 years (provider: benzinga) loss_count_2y : Optional[int] @@ -164,6 +182,10 @@ class ROUTER_equity_estimates(Container): The average percent (normalized) price difference per rating over the last 2 years (provider: benzinga) std_dev_2y : Optional[float] The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 2 years (provider: benzinga) + smart_score_2y : Optional[float] + A weighted average smart score over the last 3 years. (provider: benzinga) + success_rate_2y : Optional[float] + The percentage (normalized) of gain/loss ratings that resulted in a gain over the last 2 years (provider: benzinga) gain_count_3y : Optional[int] The number of ratings that have gained value over the last 3 years (provider: benzinga) loss_count_3y : Optional[int] @@ -172,6 +194,10 @@ class ROUTER_equity_estimates(Container): The average percent (normalized) price difference per rating over the last 3 years (provider: benzinga) std_dev_3y : Optional[float] The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 3 years (provider: benzinga) + smart_score_3y : Optional[float] + A weighted average smart score over the last 3 years. (provider: benzinga) + success_rate_3y : Optional[float] + The percentage (normalized) of gain/loss ratings that resulted in a gain over the last 3 years (provider: benzinga) Examples -------- @@ -210,14 +236,14 @@ class ROUTER_equity_estimates(Container): def consensus( self, symbol: Annotated[ - Union[str, List[str]], - OpenBBCustomParameter( - description="Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, yfinance." + Union[str, None, List[Optional[str]]], + OpenBBField( + description="Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio, yfinance." ), - ], + ] = None, provider: Annotated[ - Optional[Literal["fmp", "yfinance"]], - OpenBBCustomParameter( + Optional[Literal["fmp", "intrinio", "yfinance"]], + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -227,19 +253,21 @@ class ROUTER_equity_estimates(Container): Parameters ---------- - symbol : Union[str, List[str]] - Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, yfinance. - provider : Optional[Literal['fmp', 'yfinance']] + symbol : Union[str, None, List[Optional[str]]] + Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio, yfinance. + provider : Optional[Literal['fmp', 'intrinio', 'yfinance']] The provider to use for the query, by default None. If None, the provider specified in defaults is selected or 'fmp' if there is no default. + industry_group_number : Optional[int] + The Zacks industry group number. (provider: intrinio) Returns ------- OBBject results : List[PriceTargetConsensus] Serializable results. - provider : Optional[Literal['fmp', 'yfinance']] + provider : Optional[Literal['fmp', 'intrinio', 'yfinance']] Provider name. warnings : Optional[List[Warning_]] List of warnings. @@ -252,6 +280,8 @@ class ROUTER_equity_estimates(Container): -------------------- symbol : str Symbol representing the entity requested in the data. + name : Optional[str] + The company name target_high : Optional[float] High target of the price target consensus. target_low : Optional[float] @@ -260,6 +290,18 @@ class ROUTER_equity_estimates(Container): Consensus target of the price target consensus. target_median : Optional[float] Median target of the price target consensus. + standard_deviation : Optional[float] + The standard deviation of target price estimates. (provider: intrinio) + total_anaylsts : Optional[int] + The total number of target price estimates in consensus. (provider: intrinio) + raised : Optional[int] + The number of analysts that have raised their target price estimates. (provider: intrinio) + lowered : Optional[int] + The number of analysts that have lowered their target price estimates. (provider: intrinio) + most_recent_date : Optional[date] + The date of the most recent estimate. (provider: intrinio) + industry_group_number : Optional[int] + The Zacks industry group number. (provider: intrinio) recommendation : Optional[str] Recommendation - buy, sell, etc. (provider: yfinance) recommendation_mean : Optional[float] @@ -285,14 +327,260 @@ class ROUTER_equity_estimates(Container): "provider": self._get_provider( provider, "/equity/estimates/consensus", - ("fmp", "yfinance"), + ("fmp", "intrinio", "yfinance"), ) }, standard_params={ "symbol": symbol, }, extra_params=kwargs, - info={"symbol": {"multiple_items_allowed": ["fmp", "yfinance"]}}, + info={ + "symbol": { + "multiple_items_allowed": ["fmp", "intrinio", "yfinance"] + } + }, + ) + ) + + @exception_handler + @validate + def forward_eps( + self, + symbol: Annotated[ + Union[str, None, List[Optional[str]]], + OpenBBField( + description="Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio." + ), + ] = None, + provider: Annotated[ + Optional[Literal["fmp", "intrinio"]], + OpenBBField( + description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." + ), + ] = None, + **kwargs + ) -> OBBject: + """Get forward EPS estimates. + + Parameters + ---------- + symbol : Union[str, None, List[Optional[str]]] + Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio. + provider : Optional[Literal['fmp', 'intrinio']] + The provider to use for the query, by default None. + If None, the provider specified in defaults is selected or 'fmp' if there is + no default. + fiscal_period : Optional[Union[Literal['annual', 'quarter'], Literal['fy', 'q1', 'q2', 'q3', 'q4']]] + The future fiscal period to retrieve estimates for. (provider: fmp, intrinio) + limit : Optional[int] + The number of data entries to return. (provider: fmp) + include_historical : bool + If True, the data will include all past data and the limit will be ignored. (provider: fmp) + fiscal_year : Optional[int] + The future fiscal year to retrieve estimates for. When no symbol and year is supplied the current calendar year is used. (provider: intrinio) + calendar_year : Optional[int] + The future calendar year to retrieve estimates for. When no symbol and year is supplied the current calendar year is used. (provider: intrinio) + calendar_period : Optional[Literal['q1', 'q2', 'q3', 'q4']] + The future calendar period to retrieve estimates for. (provider: intrinio) + + Returns + ------- + OBBject + results : List[ForwardEpsEstimates] + Serializable results. + provider : Optional[Literal['fmp', 'intrinio']] + Provider name. + warnings : Optional[List[Warning_]] + List of warnings. + chart : Optional[Chart] + Chart object. + extra : Dict[str, Any] + Extra info. + + ForwardEpsEstimates + ------------------- + symbol : str + Symbol representing the entity requested in the data. + name : Optional[str] + Name of the entity. + date : date + The date of the data. + fiscal_year : Optional[int] + Fiscal year for the estimate. + fiscal_period : Optional[str] + Fiscal quarter for the estimate. + calendar_year : Optional[int] + Calendar year for the estimate. + calendar_period : Optional[str] + Calendar quarter for the estimate. + low_estimate : Optional[float] + Estimated EPS low for the period. + high_estimate : Optional[float] + Estimated EPS high for the period. + mean : Optional[float] + Estimated EPS mean for the period. + median : Optional[float] + Estimated EPS median for the period. + standard_deviation : Optional[float] + Estimated EPS standard deviation for the period. + number_of_analysts : Optional[int] + Number of analysts providing estimates for the period. + revisions_change_percent : Optional[float] + The earnings per share (EPS) percent change in estimate for the period. (provider: intrinio) + mean_1w : Optional[float] + The mean estimate for the period one week ago. (provider: intrinio) + mean_1m : Optional[float] + The mean estimate for the period one month ago. (provider: intrinio) + mean_2m : Optional[float] + The mean estimate for the period two months ago. (provider: intrinio) + mean_3m : Optional[float] + The mean estimate for the period three months ago. (provider: intrinio) + + Examples + -------- + >>> from openbb import obb + >>> obb.equity.estimates.forward_eps(symbol='AAPL', provider='intrinio') + >>> obb.equity.estimates.forward_eps(fiscal_year=2025, fiscal_period='fy', provider='intrinio') + """ # noqa: E501 + + return self._run( + "/equity/estimates/forward_eps", + **filter_inputs( + provider_choices={ + "provider": self._get_provider( + provider, + "/equity/estimates/forward_eps", + ("fmp", "intrinio"), + ) + }, + standard_params={ + "symbol": symbol, + }, + extra_params=kwargs, + info={"symbol": {"multiple_items_allowed": ["fmp", "intrinio"]}}, + ) + ) + + @exception_handler + @validate + def forward_sales( + self, + symbol: Annotated[ + Union[str, None, List[Optional[str]]], + OpenBBField( + description="Symbol to get data for. Multiple comma separated items allowed for provider(s): intrinio." + ), + ] = None, + provider: Annotated[ + Optional[Literal["intrinio"]], + OpenBBField( + description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'intrinio' if there is\n no default." + ), + ] = None, + **kwargs + ) -> OBBject: + """Get forward sales estimates. + + Parameters + ---------- + symbol : Union[str, None, List[Optional[str]]] + Symbol to get data for. Multiple comma separated items allowed for provider(s): intrinio. + provider : Optional[Literal['intrinio']] + The provider to use for the query, by default None. + If None, the provider specified in defaults is selected or 'intrinio' if there is + no default. + fiscal_year : Optional[int] + The future fiscal year to retrieve estimates for. When no symbol and year is supplied the current calendar year is used. (provider: intrinio) + fiscal_period : Optional[Literal['fy', 'q1', 'q2', 'q3', 'q4']] + The future fiscal period to retrieve estimates for. (provider: intrinio) + calendar_year : Optional[int] + The future calendar year to retrieve estimates for. When no symbol and year is supplied the current calendar year is used. (provider: intrinio) + calendar_period : Optional[Literal['q1', 'q2', 'q3', 'q4']] + The future calendar period to retrieve estimates for. (provider: intrinio) + + Returns + ------- + OBBject + results : List[ForwardSalesEstimates] + Serializable results. + provider : Optional[Literal['intrinio']] + Provider name. + warnings : Optional[List[Warning_]] + List of warnings. + chart : Optional[Chart] + Chart object. + extra : Dict[str, Any] + Extra info. + + ForwardSalesEstimates + --------------------- + symbol : str + Symbol representing the entity requested in the data. + name : Optional[str] + Name of the entity. + date : date + The date of the data. + fiscal_year : Optional[int] + Fiscal year for the estimate. + fiscal_period : Optional[str] + Fiscal quarter for the estimate. + calendar_year : Optional[int] + Calendar year for the estimate. + calendar_period : Optional[str] + Calendar quarter for the estimate. + low_estimate : Optional[int] + The sales estimate low for the period. + high_estimate : Optional[int] + The sales estimate high for the period. + mean : Optional[int] + The sales estimate mean for the period. + median : Optional[int] + The sales estimate median for the period. + standard_deviation : Optional[int] + The sales estimate standard deviation for the period. + number_of_analysts : Optional[int] + Number of analysts providing estimates for the period. + revisions_1w_up : Optional[int] + Number of revisions up in the last week. (provider: intrinio) + revisions_1w_down : Optional[int] + Number of revisions down in the last week. (provider: intrinio) + revisions_1w_change_percent : Optional[float] + The analyst revisions percent change in estimate for the period of 1 week. (provider: intrinio) + revisions_1m_up : Optional[int] + Number of revisions up in the last month. (provider: intrinio) + revisions_1m_down : Optional[int] + Number of revisions down in the last month. (provider: intrinio) + revisions_1m_change_percent : Optional[float] + The analyst revisions percent change in estimate for the period of 1 month. (provider: intrinio) + revisions_3m_up : Optional[int] + Number of revisions up in the last 3 months. (provider: intrinio) + revisions_3m_down : Optional[int] + Number of revisions down in the last 3 months. (provider: intrinio) + revisions_3m_change_percent : Optional[float] + The analyst revisions percent change in estimate for the period of 3 months. (provider: intrinio) + + Examples + -------- + >>> from openbb import obb + >>> obb.equity.estimates.forward_sales(symbol='AAPL', provider='intrinio') + >>> obb.equity.estimates.forward_sales(fiscal_year=2025, fiscal_period='fy', provider='intrinio') + """ # noqa: E501 + + return self._run( + "/equity/estimates/forward_sales", + **filter_inputs( + provider_choices={ + "provider": self._get_provider( + provider, + "/equity/estimates/forward_sales", + ("intrinio",), + ) + }, + standard_params={ + "symbol": symbol, + }, + extra_params=kwargs, + info={"symbol": {"multiple_items_allowed": ["intrinio"]}}, ) ) @@ -302,13 +590,13 @@ class ROUTER_equity_estimates(Container): self, symbol: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( + OpenBBField( description="Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp." ), ], provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -420,17 +708,16 @@ class ROUTER_equity_estimates(Container): self, symbol: Annotated[ Union[str, None, List[Optional[str]]], - OpenBBCustomParameter( + OpenBBField( description="Symbol to get data for. Multiple comma separated items allowed for provider(s): benzinga, fmp." ), ] = None, limit: Annotated[ - int, - OpenBBCustomParameter(description="The number of data entries to return."), + int, OpenBBField(description="The number of data entries to return.") ] = 200, provider: Annotated[ Optional[Literal["benzinga", "fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'benzinga' if there is\n no default." ), ] = None, diff --git a/openbb_platform/openbb/package/equity_fundamental.py b/openbb_platform/openbb/package/equity_fundamental.py index 3cf436980fe..f7adce615f7 100644 --- a/openbb_platform/openbb/package/equity_fundamental.py +++ b/openbb_platform/openbb/package/equity_fundamental.py @@ -6,7 +6,7 @@ from warnings import simplefilter, warn from annotated_types import Ge from openbb_core.app.deprecation import OpenBBDeprecationWarning -from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.field import OpenBBField from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import exception_handler, validate @@ -50,19 +50,17 @@ class ROUTER_equity_fundamental(Container): @validate def balance( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], period: Annotated[ - str, OpenBBCustomParameter(description="Time period of the data to return.") + str, OpenBBField(description="Time period of the data to return.") ] = "annual", limit: Annotated[ Optional[Annotated[int, Ge(ge=0)]], - OpenBBCustomParameter(description="The number of data entries to return."), + OpenBBField(description="The number of data entries to return."), ] = 5, provider: Annotated[ Optional[Literal["fmp", "intrinio", "polygon", "yfinance"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -412,16 +410,13 @@ class ROUTER_equity_fundamental(Container): @validate def balance_growth( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], limit: Annotated[ - int, - OpenBBCustomParameter(description="The number of data entries to return."), + int, OpenBBField(description="The number of data entries to return.") ] = 10, provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -570,19 +565,17 @@ class ROUTER_equity_fundamental(Container): @validate def cash( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], period: Annotated[ - str, OpenBBCustomParameter(description="Time period of the data to return.") + str, OpenBBField(description="Time period of the data to return.") ] = "annual", limit: Annotated[ Optional[Annotated[int, Ge(ge=0)]], - OpenBBCustomParameter(description="The number of data entries to return."), + OpenBBField(description="The number of data entries to return."), ] = 5, provider: Annotated[ Optional[Literal["fmp", "intrinio", "polygon", "yfinance"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -840,16 +833,13 @@ class ROUTER_equity_fundamental(Container): @validate def cash_growth( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], limit: Annotated[ - int, - OpenBBCustomParameter(description="The number of data entries to return."), + int, OpenBBField(description="The number of data entries to return.") ] = 10, provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -980,24 +970,18 @@ class ROUTER_equity_fundamental(Container): @validate def dividends( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ Optional[Literal["fmp", "intrinio", "yfinance"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -1086,12 +1070,10 @@ class ROUTER_equity_fundamental(Container): @validate def employee_count( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -1171,21 +1153,20 @@ class ROUTER_equity_fundamental(Container): def filings( self, symbol: Annotated[ - Optional[str], OpenBBCustomParameter(description="Symbol to get data for.") + Optional[str], OpenBBField(description="Symbol to get data for.") ] = None, form_type: Annotated[ Optional[str], - OpenBBCustomParameter( + OpenBBField( description="Filter by form type. Check the data provider for available types." ), ] = None, limit: Annotated[ - int, - OpenBBCustomParameter(description="The number of data entries to return."), + int, OpenBBField(description="The number of data entries to return.") ] = 100, provider: Annotated[ Optional[Literal["fmp", "intrinio", "sec"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -1324,47 +1305,41 @@ class ROUTER_equity_fundamental(Container): self, symbol: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( + OpenBBField( description="Symbol to get data for. Multiple comma separated items allowed for provider(s): intrinio." ), ], tag: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( + OpenBBField( description="Intrinio data tag ID or code. Multiple comma separated items allowed for provider(s): intrinio." ), ], start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, frequency: Annotated[ Optional[Literal["daily", "weekly", "monthly", "quarterly", "yearly"]], - OpenBBCustomParameter(description="The frequency of the data."), + OpenBBField(description="The frequency of the data."), ] = "yearly", limit: Annotated[ Optional[int], - OpenBBCustomParameter(description="The number of data entries to return."), + OpenBBField(description="The number of data entries to return."), ] = 1000, tag_type: Annotated[ - Optional[str], - OpenBBCustomParameter(description="Filter by type, when applicable."), + Optional[str], OpenBBField(description="Filter by type, when applicable.") ] = None, sort: Annotated[ - Optional[Literal["asc", "desc"]], - OpenBBCustomParameter(description="Sort order."), + Optional[Literal["asc", "desc"]], OpenBBField(description="Sort order.") ] = "desc", provider: Annotated[ Optional[Literal["intrinio"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'intrinio' if there is\n no default." ), ] = None, @@ -1458,12 +1433,10 @@ class ROUTER_equity_fundamental(Container): @validate def historical_eps( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -1546,12 +1519,10 @@ class ROUTER_equity_fundamental(Container): @validate def historical_splits( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -1620,19 +1591,17 @@ class ROUTER_equity_fundamental(Container): @validate def income( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], period: Annotated[ - str, OpenBBCustomParameter(description="Time period of the data to return.") + str, OpenBBField(description="Time period of the data to return.") ] = "annual", limit: Annotated[ Optional[Annotated[int, Ge(ge=0)]], - OpenBBCustomParameter(description="The number of data entries to return."), + OpenBBField(description="The number of data entries to return."), ] = 5, provider: Annotated[ Optional[Literal["fmp", "intrinio", "polygon", "yfinance"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -1984,20 +1953,17 @@ class ROUTER_equity_fundamental(Container): @validate def income_growth( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], limit: Annotated[ - int, - OpenBBCustomParameter(description="The number of data entries to return."), + int, OpenBBField(description="The number of data entries to return.") ] = 10, period: Annotated[ Literal["annual", "quarter"], - OpenBBCustomParameter(description="Time period of the data to return."), + OpenBBField(description="Time period of the data to return."), ] = "annual", provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -2125,19 +2091,19 @@ class ROUTER_equity_fundamental(Container): self, symbol: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( + OpenBBField( description="Symbol to get data for. Multiple comma separated items allowed for provider(s): intrinio." ), ], tag: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( + OpenBBField( description="Intrinio data tag ID or code. Multiple comma separated items allowed for provider(s): intrinio." ), ], provider: Annotated[ Optional[Literal["intrinio"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'intrinio' if there is\n no default." ), ] = None, @@ -2211,12 +2177,10 @@ class ROUTER_equity_fundamental(Container): @validate def management( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], provider: Annotated[ Optional[Literal["fmp", "yfinance"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -2297,13 +2261,13 @@ class ROUTER_equity_fundamental(Container): self, symbol: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( + OpenBBField( description="Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp." ), ], provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -2399,21 +2363,21 @@ class ROUTER_equity_fundamental(Container): self, symbol: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( + OpenBBField( description="Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio, yfinance." ), ], period: Annotated[ Optional[Literal["annual", "quarter"]], - OpenBBCustomParameter(description="Time period of the data to return."), + OpenBBField(description="Time period of the data to return."), ] = "annual", limit: Annotated[ Optional[int], - OpenBBCustomParameter(description="The number of data entries to return."), + OpenBBField(description="The number of data entries to return."), ] = 100, provider: Annotated[ Optional[Literal["fmp", "intrinio", "yfinance"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -2720,13 +2684,13 @@ class ROUTER_equity_fundamental(Container): self, symbol: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( + OpenBBField( description="Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp." ), ], provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -2914,12 +2878,10 @@ class ROUTER_equity_fundamental(Container): ) def overview( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -3059,19 +3021,16 @@ class ROUTER_equity_fundamental(Container): @validate def ratios( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], period: Annotated[ - str, OpenBBCustomParameter(description="Time period of the data to return.") + str, OpenBBField(description="Time period of the data to return.") ] = "annual", limit: Annotated[ - int, - OpenBBCustomParameter(description="The number of data entries to return."), + int, OpenBBField(description="The number of data entries to return.") ] = 12, provider: Annotated[ Optional[Literal["fmp", "intrinio"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -3259,27 +3218,25 @@ class ROUTER_equity_fundamental(Container): @validate def reported_financials( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], period: Annotated[ - str, OpenBBCustomParameter(description="Time period of the data to return.") + str, OpenBBField(description="Time period of the data to return.") ] = "annual", statement_type: Annotated[ str, - OpenBBCustomParameter( + OpenBBField( description="The type of financial statement - i.e, balance, income, cash." ), ] = "balance", limit: Annotated[ Optional[int], - OpenBBCustomParameter( + OpenBBField( description="The number of data entries to return. Although the response object contains multiple results, because of the variance in the fields, year-to-year and quarter-to-quarter, it is recommended to view results in small chunks." ), ] = 100, provider: Annotated[ Optional[Literal["intrinio"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'intrinio' if there is\n no default." ), ] = None, @@ -3363,20 +3320,18 @@ class ROUTER_equity_fundamental(Container): @validate def revenue_per_geography( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], period: Annotated[ - Literal["annual", "quarter"], - OpenBBCustomParameter(description="Time period of the data to return."), + Literal["quarter", "annual"], + OpenBBField(description="Time period of the data to return."), ] = "annual", structure: Annotated[ Literal["hierarchical", "flat"], - OpenBBCustomParameter(description="Structure of the returned data."), + OpenBBField(description="Structure of the returned data."), ] = "flat", provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -3388,7 +3343,7 @@ class ROUTER_equity_fundamental(Container): ---------- symbol : str Symbol to get data for. - period : Literal['annual', 'quarter'] + period : Literal['quarter', 'annual'] Time period of the data to return. structure : Literal['hierarchical', 'flat'] Structure of the returned data. @@ -3454,20 +3409,18 @@ class ROUTER_equity_fundamental(Container): @validate def revenue_per_segment( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], period: Annotated[ - Literal["annual", "quarter"], - OpenBBCustomParameter(description="Time period of the data to return."), + Literal["quarter", "annual"], + OpenBBField(description="Time period of the data to return."), ] = "annual", structure: Annotated[ Literal["hierarchical", "flat"], - OpenBBCustomParameter(description="Structure of the returned data."), + OpenBBField(description="Structure of the returned data."), ] = "flat", provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -3479,7 +3432,7 @@ class ROUTER_equity_fundamental(Container): ---------- symbol : str Symbol to get data for. - period : Literal['annual', 'quarter'] + period : Literal['quarter', 'annual'] Time period of the data to return. structure : Literal['hierarchical', 'flat'] Structure of the returned data. @@ -3545,16 +3498,14 @@ class ROUTER_equity_fundamental(Container): @validate def search_attributes( self, - query: Annotated[ - str, OpenBBCustomParameter(description="Query to search for.") - ], + query: Annotated[str, OpenBBField(description="Query to search for.")], limit: Annotated[ Optional[int], - OpenBBCustomParameter(description="The number of data entries to return."), + OpenBBField(description="The number of data entries to return."), ] = 1000, provider: Annotated[ Optional[Literal["intrinio"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'intrinio' if there is\n no default." ), ] = None, @@ -3640,18 +3591,16 @@ class ROUTER_equity_fundamental(Container): @validate def trailing_dividend_yield( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], limit: Annotated[ Optional[int], - OpenBBCustomParameter( + OpenBBField( description="The number of data entries to return. Default is 252, the number of trading days in a year." ), ] = 252, provider: Annotated[ Optional[Literal["tiingo"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'tiingo' if there is\n no default." ), ] = None, @@ -3720,16 +3669,13 @@ class ROUTER_equity_fundamental(Container): @validate def transcript( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], year: Annotated[ - int, - OpenBBCustomParameter(description="Year of the earnings call transcript."), + int, OpenBBField(description="Year of the earnings call transcript.") ], provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, diff --git a/openbb_platform/openbb/package/equity_ownership.py b/openbb_platform/openbb/package/equity_ownership.py index 1d2778bfb3d..7311c9aa7eb 100644 --- a/openbb_platform/openbb/package/equity_ownership.py +++ b/openbb_platform/openbb/package/equity_ownership.py @@ -3,7 +3,7 @@ import datetime from typing import List, Literal, Optional, Union -from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.field import OpenBBField from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import exception_handler, validate @@ -29,31 +29,33 @@ class ROUTER_equity_ownership(Container): self, symbol: Annotated[ str, - OpenBBCustomParameter( + OpenBBField( description="Symbol to get data for. A CIK or Symbol can be used." ), ], date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( + OpenBBField( description="A specific date to get data for. The date represents the end of the reporting period. All form 13F-HR filings are based on the calendar year and are reported quarterly. If a date is not supplied, the most recent filing is returned. Submissions beginning 2013-06-30 are supported." ), ] = None, limit: Annotated[ Optional[int], - OpenBBCustomParameter( + OpenBBField( description="The number of data entries to return. The number of previous filings to return. The date parameter takes priority over this parameter." ), ] = 1, provider: Annotated[ Optional[Literal["sec"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'sec' if there is\n no default." ), ] = None, **kwargs ) -> OBBject: - """The Securities and Exchange Commission's (SEC) Form 13F is a quarterly report + """Get the form 13F. + + The Securities and Exchange Commission's (SEC) Form 13F is a quarterly report that is required to be filed by all institutional investment managers with at least $100 million in assets under management. Managers are required to file Form 13F within 45 days after the last day of the calendar quarter. @@ -150,16 +152,13 @@ class ROUTER_equity_ownership(Container): @validate def insider_trading( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], limit: Annotated[ - int, - OpenBBCustomParameter(description="The number of data entries to return."), + int, OpenBBField(description="The number of data entries to return.") ] = 500, provider: Annotated[ Optional[Literal["fmp", "intrinio"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -292,12 +291,10 @@ class ROUTER_equity_ownership(Container): @validate def institutional( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -434,20 +431,17 @@ class ROUTER_equity_ownership(Container): @validate def major_holders( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter(description="A specific date to get data for."), + OpenBBField(description="A specific date to get data for."), ] = None, page: Annotated[ - Optional[int], - OpenBBCustomParameter(description="Page number of the data to fetch."), + Optional[int], OpenBBField(description="Page number of the data to fetch.") ] = 0, provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -595,13 +589,13 @@ class ROUTER_equity_ownership(Container): self, symbol: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( + OpenBBField( description="Symbol to get data for. Multiple comma separated items allowed for provider(s): yfinance." ), ], provider: Annotated[ Optional[Literal["fmp", "intrinio", "yfinance"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, diff --git a/openbb_platform/openbb/package/equity_price.py b/openbb_platform/openbb/package/equity_price.py index 667889137d3..369b2c14646 100644 --- a/openbb_platform/openbb/package/equity_price.py +++ b/openbb_platform/openbb/package/equity_price.py @@ -3,7 +3,7 @@ import datetime from typing import List, Literal, Optional, Union -from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.field import OpenBBField from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import exception_handler, validate @@ -28,29 +28,25 @@ class ROUTER_equity_price(Container): self, symbol: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( + OpenBBField( description="Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, polygon, tiingo, yfinance." ), ], interval: Annotated[ Optional[str], - OpenBBCustomParameter(description="Time interval of the data to return."), + OpenBBField(description="Time interval of the data to return."), ] = "1d", start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ Optional[Literal["fmp", "intrinio", "polygon", "tiingo", "yfinance"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -207,12 +203,10 @@ class ROUTER_equity_price(Container): @validate def nbbo( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], provider: Annotated[ Optional[Literal["polygon"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'polygon' if there is\n no default." ), ] = None, @@ -317,13 +311,13 @@ class ROUTER_equity_price(Container): self, symbol: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( + OpenBBField( description="Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp." ), ], provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -421,13 +415,13 @@ class ROUTER_equity_price(Container): self, symbol: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( + OpenBBField( description="Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio, yfinance." ), ], provider: Annotated[ Optional[Literal["fmp", "intrinio", "yfinance"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, diff --git a/openbb_platform/openbb/package/equity_shorts.py b/openbb_platform/openbb/package/equity_shorts.py index 115690a4fab..c8e2c37deb1 100644 --- a/openbb_platform/openbb/package/equity_shorts.py +++ b/openbb_platform/openbb/package/equity_shorts.py @@ -2,7 +2,7 @@ from typing import Literal, Optional -from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.field import OpenBBField from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import exception_handler, validate @@ -22,12 +22,10 @@ class ROUTER_equity_shorts(Container): @validate def fails_to_deliver( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], provider: Annotated[ Optional[Literal["sec"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'sec' if there is\n no default." ), ] = None, diff --git a/openbb_platform/openbb/package/etf.py b/openbb_platform/openbb/package/etf.py index a48f89d875c..5ac4c7fa0af 100644 --- a/openbb_platform/openbb/package/etf.py +++ b/openbb_platform/openbb/package/etf.py @@ -2,13 +2,15 @@ import datetime from typing import List, Literal, Optional, Union +from warnings import simplefilter, warn -from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.deprecation import OpenBBDeprecationWarning +from openbb_core.app.model.field import OpenBBField from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import exception_handler, validate from openbb_core.app.static.utils.filters import filter_inputs -from typing_extensions import Annotated +from typing_extensions import Annotated, deprecated class ROUTER_etf(Container): @@ -34,13 +36,13 @@ class ROUTER_etf(Container): self, symbol: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( + OpenBBField( description="Symbol to get data for. (ETF) Multiple comma separated items allowed for provider(s): fmp." ), ], provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -106,13 +108,13 @@ class ROUTER_etf(Container): self, symbol: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( + OpenBBField( description="Symbol to get data for. (Stock) Multiple comma separated items allowed for provider(s): fmp." ), ], provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -188,29 +190,25 @@ class ROUTER_etf(Container): self, symbol: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( + OpenBBField( description="Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, polygon, tiingo, yfinance." ), ], interval: Annotated[ Optional[str], - OpenBBCustomParameter(description="Time interval of the data to return."), + OpenBBField(description="Time interval of the data to return."), ] = "1d", start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ Optional[Literal["fmp", "intrinio", "polygon", "tiingo", "yfinance"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -370,11 +368,11 @@ class ROUTER_etf(Container): def holdings( self, symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for. (ETF)") + str, OpenBBField(description="Symbol to get data for. (ETF)") ], provider: Annotated[ Optional[Literal["fmp", "intrinio", "sec"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -392,6 +390,7 @@ class ROUTER_etf(Container): no default. date : Optional[Union[str, datetime.date]] A specific date to get data for. Entering a date will attempt to return the NPORT-P filing for the entered date. This needs to be _exactly_ the date of the filing. Use the holdings_date command/endpoint to find available filing dates for the ETF. (provider: fmp); + A specific date to get data for. (provider: intrinio); A specific date to get data for. The date represents the period ending. The date entered will return the closest filing. (provider: sec) cik : Optional[str] The CIK of the filing entity. Overrides symbol. (provider: fmp) @@ -630,11 +629,11 @@ class ROUTER_etf(Container): def holdings_date( self, symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for. (ETF)") + str, OpenBBField(description="Symbol to get data for. (ETF)") ], provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -697,17 +696,21 @@ class ROUTER_etf(Container): @exception_handler @validate + @deprecated( + "This endpoint is deprecated; pass a list of holdings symbols directly to `/equity/price/performance` instead. Deprecated in OpenBB Platform V4.1 to be removed in V4.2.", + category=OpenBBDeprecationWarning, + ) def holdings_performance( self, symbol: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( + OpenBBField( description="Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp." ), ], provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -781,6 +784,13 @@ class ROUTER_etf(Container): >>> obb.etf.holdings_performance(symbol='XLK', provider='fmp') """ # noqa: E501 + simplefilter("always", DeprecationWarning) + warn( + "This endpoint is deprecated; pass a list of holdings symbols directly to `/equity/price/performance` instead. Deprecated in OpenBB Platform V4.1 to be removed in V4.2.", + category=DeprecationWarning, + stacklevel=2, + ) + return self._run( "/etf/holdings_performance", **filter_inputs( @@ -805,13 +815,13 @@ class ROUTER_etf(Container): self, symbol: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( + OpenBBField( description="Symbol to get data for. (ETF) Multiple comma separated items allowed for provider(s): fmp, intrinio, yfinance." ), ], provider: Annotated[ Optional[Literal["fmp", "intrinio", "yfinance"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -1197,13 +1207,13 @@ class ROUTER_etf(Container): self, symbol: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( + OpenBBField( description="Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio." ), ], provider: Annotated[ Optional[Literal["fmp", "intrinio"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -1334,12 +1344,10 @@ class ROUTER_etf(Container): @validate def search( self, - query: Annotated[ - Optional[str], OpenBBCustomParameter(description="Search query.") - ] = "", + query: Annotated[Optional[str], OpenBBField(description="Search query.")] = "", provider: Annotated[ Optional[Literal["fmp", "intrinio"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -1449,11 +1457,11 @@ class ROUTER_etf(Container): def sectors( self, symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for. (ETF)") + str, OpenBBField(description="Symbol to get data for. (ETF)") ], provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, diff --git a/openbb_platform/openbb/package/fixedincome.py b/openbb_platform/openbb/package/fixedincome.py index 30bfb1f52c8..535ad86b1f8 100644 --- a/openbb_platform/openbb/package/fixedincome.py +++ b/openbb_platform/openbb/package/fixedincome.py @@ -3,7 +3,7 @@ import datetime from typing import Literal, Optional, Union -from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.field import OpenBBField from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import exception_handler, validate @@ -56,19 +56,15 @@ class ROUTER_fixedincome(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ Optional[Literal["fred"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fred' if there is\n no default." ), ] = None, diff --git a/openbb_platform/openbb/package/fixedincome_corporate.py b/openbb_platform/openbb/package/fixedincome_corporate.py index bc5bcb97b09..7f3a1e19957 100644 --- a/openbb_platform/openbb/package/fixedincome_corporate.py +++ b/openbb_platform/openbb/package/fixedincome_corporate.py @@ -3,10 +3,7 @@ import datetime from typing import List, Literal, Optional, Union -from openbb_core.app.model.custom_parameter import ( - OpenBBCustomChoices, - OpenBBCustomParameter, -) +from openbb_core.app.model.field import OpenBBField from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import exception_handler, validate @@ -32,30 +29,26 @@ class ROUTER_fixedincome_corporate(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, maturity: Annotated[ Literal["overnight", "7d", "15d", "30d", "60d", "90d"], - OpenBBCustomParameter(description="The maturity."), + OpenBBField(description="The maturity."), ] = "30d", category: Annotated[ Literal["asset_backed", "financial", "nonfinancial"], - OpenBBCustomParameter(description="The category."), + OpenBBField(description="The category."), ] = "financial", grade: Annotated[ - Literal["aa", "a2_p2"], OpenBBCustomParameter(description="The grade.") + Literal["aa", "a2_p2"], OpenBBField(description="The grade.") ] = "aa", provider: Annotated[ Optional[Literal["fred"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fred' if there is\n no default." ), ] = None, @@ -141,15 +134,14 @@ class ROUTER_fixedincome_corporate(Container): self, date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter(description="A specific date to get data for."), + OpenBBField(description="A specific date to get data for."), ] = None, yield_curve: Annotated[ - Literal["spot", "par"], - OpenBBCustomParameter(description="The yield curve type."), + Literal["spot", "par"], OpenBBField(description="The yield curve type.") ] = "spot", provider: Annotated[ Optional[Literal["fred"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fred' if there is\n no default." ), ] = None, @@ -232,23 +224,19 @@ class ROUTER_fixedincome_corporate(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, index_type: Annotated[ Literal["yield", "yield_to_worst", "total_return", "spread"], - OpenBBCustomParameter(description="The type of series."), + OpenBBField(description="The type of series."), ] = "yield", provider: Annotated[ Optional[Literal["fred"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fred' if there is\n no default." ), ] = None, @@ -337,23 +325,18 @@ class ROUTER_fixedincome_corporate(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, index_type: Annotated[ - Literal["aaa", "baa"], - OpenBBCustomParameter(description="The type of series."), + Literal["aaa", "baa"], OpenBBField(description="The type of series.") ] = "aaa", provider: Annotated[ Optional[Literal["fred"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fred' if there is\n no default." ), ] = None, @@ -435,32 +418,28 @@ class ROUTER_fixedincome_corporate(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, maturity: Annotated[ Union[float, str, List[Union[float, str]]], - OpenBBCustomParameter( + OpenBBField( description="Maturities in years. Multiple comma separated items allowed for provider(s): fred." ), ] = 10.0, category: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( - description="Rate category. Options: spot_rate, par_yield. Multiple comma separated items allowed for provider(s): fred." + OpenBBField( + description="Rate category. Options: spot_rate, par_yield. Multiple comma separated items allowed for provider(s): fred.", + choices=["par_yield", "spot_rate"], ), - OpenBBCustomChoices(choices=["par_yield", "spot_rate"]), ] = "spot_rate", provider: Annotated[ Optional[Literal["fred"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fred' if there is\n no default." ), ] = None, diff --git a/openbb_platform/openbb/package/fixedincome_government.py b/openbb_platform/openbb/package/fixedincome_government.py index 5b0f6169e6c..7bf4e522c83 100644 --- a/openbb_platform/openbb/package/fixedincome_government.py +++ b/openbb_platform/openbb/package/fixedincome_government.py @@ -3,7 +3,7 @@ import datetime from typing import Literal, Optional, Union -from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.field import OpenBBField from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import exception_handler, validate @@ -26,19 +26,15 @@ class ROUTER_fixedincome_government(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ Optional[Literal["federal_reserve", "fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'federal_reserve' if there is\n no default." ), ] = None, @@ -132,17 +128,16 @@ class ROUTER_fixedincome_government(Container): self, date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( + OpenBBField( description="A specific date to get data for. Defaults to the most recent FRED entry." ), ] = None, inflation_adjusted: Annotated[ - Optional[bool], - OpenBBCustomParameter(description="Get inflation adjusted rates."), + Optional[bool], OpenBBField(description="Get inflation adjusted rates.") ] = False, provider: Annotated[ Optional[Literal["fred"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fred' if there is\n no default." ), ] = None, diff --git a/openbb_platform/openbb/package/fixedincome_rate.py b/openbb_platform/openbb/package/fixedincome_rate.py index 17cb78b99e6..38467c54fc3 100644 --- a/openbb_platform/openbb/package/fixedincome_rate.py +++ b/openbb_platform/openbb/package/fixedincome_rate.py @@ -3,7 +3,7 @@ import datetime from typing import Literal, Optional, Union -from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.field import OpenBBField from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import exception_handler, validate @@ -32,19 +32,15 @@ class ROUTER_fixedincome_rate(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ Optional[Literal["fred"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fred' if there is\n no default." ), ] = None, @@ -122,19 +118,15 @@ class ROUTER_fixedincome_rate(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ Optional[Literal["fred"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fred' if there is\n no default." ), ] = None, @@ -213,23 +205,19 @@ class ROUTER_fixedincome_rate(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, interest_rate_type: Annotated[ Literal["deposit", "lending", "refinancing"], - OpenBBCustomParameter(description="The type of interest rate."), + OpenBBField(description="The type of interest rate."), ] = "lending", provider: Annotated[ Optional[Literal["fred"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fred' if there is\n no default." ), ] = None, @@ -311,19 +299,15 @@ class ROUTER_fixedincome_rate(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ Optional[Literal["federal_reserve", "fred"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'federal_reserve' if there is\n no default." ), ] = None, @@ -401,7 +385,7 @@ class ROUTER_fixedincome_rate(Container): self, provider: Annotated[ Optional[Literal["fred"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fred' if there is\n no default." ), ] = None, @@ -485,19 +469,15 @@ class ROUTER_fixedincome_rate(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ Optional[Literal["fred"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fred' if there is\n no default." ), ] = None, @@ -576,19 +556,15 @@ class ROUTER_fixedincome_rate(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ Optional[Literal["fred"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fred' if there is\n no default." ), ] = None, @@ -663,19 +639,15 @@ class ROUTER_fixedincome_rate(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ Optional[Literal["fred"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fred' if there is\n no default." ), ] = None, diff --git a/openbb_platform/openbb/package/fixedincome_spreads.py b/openbb_platform/openbb/package/fixedincome_spreads.py index b70c58e9676..fdc1773327e 100644 --- a/openbb_platform/openbb/package/fixedincome_spreads.py +++ b/openbb_platform/openbb/package/fixedincome_spreads.py @@ -3,7 +3,7 @@ import datetime from typing import Literal, Optional, Union -from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.field import OpenBBField from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import exception_handler, validate @@ -27,23 +27,18 @@ class ROUTER_fixedincome_spreads(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, maturity: Annotated[ - Optional[Literal["3m", "2y"]], - OpenBBCustomParameter(description="The maturity"), + Optional[Literal["3m", "2y"]], OpenBBField(description="The maturity") ] = "3m", provider: Annotated[ Optional[Literal["fred"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fred' if there is\n no default." ), ] = None, @@ -123,23 +118,19 @@ class ROUTER_fixedincome_spreads(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, maturity: Annotated[ Optional[Literal["10y", "5y", "1y", "6m", "3m"]], - OpenBBCustomParameter(description="The maturity"), + OpenBBField(description="The maturity"), ] = "10y", provider: Annotated[ Optional[Literal["fred"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fred' if there is\n no default." ), ] = None, @@ -219,23 +210,18 @@ class ROUTER_fixedincome_spreads(Container): self, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, maturity: Annotated[ - Optional[Literal["3m", "6m"]], - OpenBBCustomParameter(description="The maturity"), + Optional[Literal["3m", "6m"]], OpenBBField(description="The maturity") ] = "3m", provider: Annotated[ Optional[Literal["fred"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fred' if there is\n no default." ), ] = None, diff --git a/openbb_platform/openbb/package/index.py b/openbb_platform/openbb/package/index.py index 618e90a7985..babec4f8c96 100644 --- a/openbb_platform/openbb/package/index.py +++ b/openbb_platform/openbb/package/index.py @@ -5,7 +5,7 @@ from typing import List, Literal, Optional, Union from warnings import simplefilter, warn from openbb_core.app.deprecation import OpenBBDeprecationWarning -from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.field import OpenBBField from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import exception_handler, validate @@ -30,7 +30,7 @@ class ROUTER_index(Container): self, provider: Annotated[ Optional[Literal["fmp", "yfinance"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, @@ -100,18 +100,16 @@ class ROUTER_index(Container): @validate def constituents( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], provider: Annotated[ Optional[Literal["fmp"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, **kwargs ) -> OBBject: - """Index Constituents. + """Get Index Constituents. Parameters ---------- @@ -188,35 +186,31 @@ class ROUTER_index(Container): self, symbol: Annotated[ Union[str, List[str]], - OpenBBCustomParameter( + OpenBBField( description="Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio, polygon, yfinance." ), ], start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, interval: Annotated[ Optional[str], - OpenBBCustomParameter(description="Time interval of the data to return."), + OpenBBField(description="Time interval of the data to return."), ] = "1d", provider: Annotated[ Optional[Literal["fmp", "intrinio", "polygon", "yfinance"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'fmp' if there is\n no default." ), ] = None, **kwargs ) -> OBBject: - """Historical Market Indices. + """Get Historical Market Indices. Parameters ---------- diff --git a/openbb_platform/openbb/package/news.py b/openbb_platform/openbb/package/news.py index 2238b1e79c6..d137098644d 100644 --- a/openbb_platform/openbb/package/news.py +++ b/openbb_platform/openbb/package/news.py @@ -4,7 +4,7 @@ import datetime from typing import List, Literal, Optional, Union from annotated_types import Ge -from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.field import OpenBBField from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import exception_handler, validate @@ -27,31 +27,27 @@ class ROUTER_news(Container): self, symbol: Annotated[ Union[str, None, List[Optional[str]]], - OpenBBCustomParameter( + OpenBBField( description="Symbol to get data for. Multiple comma separated items allowed for provider(s): benzinga, fmp, intrinio, polygon, tiingo, yfinance." ), ] = None, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, limit: Annotated[ Optional[Annotated[int, Ge(ge=0)]], - OpenBBCustomParameter(description="The number of data entries to return."), + OpenBBField(description="The number of data entries to return."), ] = 2500, provider: Annotated[ Optional[ Literal["benzinga", "fmp", "intrinio", "polygon", "tiingo", "yfinance"] ], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'benzinga' if there is\n no default." ), ] = None, @@ -221,25 +217,21 @@ class ROUTER_news(Container): self, limit: Annotated[ int, - OpenBBCustomParameter( + OpenBBField( description="The number of data entries to return. The number of articles to return." ), ] = 2500, start_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="Start date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="Start date of the data, in YYYY-MM-DD format."), ] = None, end_date: Annotated[ Union[datetime.date, None, str], - OpenBBCustomParameter( - description="End date of the data, in YYYY-MM-DD format." - ), + OpenBBField(description="End date of the data, in YYYY-MM-DD format."), ] = None, provider: Annotated[ Optional[Literal["benzinga", "fmp", "intrinio", "tiingo"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'benzinga' if there is\n no default." ), ] = None, diff --git a/openbb_platform/openbb/package/regulators_sec.py b/openbb_platform/openbb/package/regulators_sec.py index 4b0ebcf377c..0dc6319c271 100644 --- a/openbb_platform/openbb/package/regulators_sec.py +++ b/openbb_platform/openbb/package/regulators_sec.py @@ -2,7 +2,7 @@ from typing import Literal, Optional -from openbb_core.app.model.custom_parameter import OpenBBCustomParameter +from openbb_core.app.model.field import OpenBBField from openbb_core.app.model.obbject import OBBject from openbb_core.app.static.container import Container from openbb_core.app.static.utils.decorators import exception_handler, validate @@ -27,12 +27,10 @@ class ROUTER_regulators_sec(Container): @validate def cik_map( self, - symbol: Annotated[ - str, OpenBBCustomParameter(description="Symbol to get data for.") - ], + symbol: Annotated[str, OpenBBField(description="Symbol to get data for.")], provider: Annotated[ Optional[Literal["sec"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'sec' if there is\n no default." ), ] = None, @@ -95,16 +93,16 @@ class ROUTER_regulators_sec(Container): @validate def institutions_search( self, - query: Annotated[str, OpenBBCustomParameter(description="Search query.")] = "", + query: Annotated[str, OpenBBField(description="Search query.")] = "", use_cache: Annotated[ Optional[bool], - OpenBBCustomParameter( + OpenBBField( description="Whether or not to use cache. If True, cache will store for seven days." ), ] = True, provider: Annotated[ Optional[Literal["sec"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'sec' if there is\n no default." ), ] = None, @@ -175,13 +173,13 @@ class ROUTER_regulators_sec(Container): self, provider: Annotated[ Optional[Literal["sec"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'sec' if there is\n no default." ), ] = None, **kwargs ) -> OBBject: - """The RSS feed provides links to litigation releases concerning civil lawsuits brought by the Commission in federal court. + """Get the RSS feed that provides links to litigation releases concerning civil lawsuits brought by the Commission in federal court. Parameters ---------- @@ -242,22 +240,22 @@ class ROUTER_regulators_sec(Container): @validate def schema_files( self, - query: Annotated[str, OpenBBCustomParameter(description="Search query.")] = "", + query: Annotated[str, OpenBBField(description="Search query.")] = "", use_cache: Annotated[ Optional[bool], - OpenBBCustomParameter( + OpenBBField( description="Whether or not to use cache. If True, cache will store for seven days." ), ] = True, provider: Annotated[ Optional[Literal["sec"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'sec' if there is\n no default." ), ] = None, **kwargs ) -> OBBject: - """A tool for navigating the directory of SEC XML schema files by year. + """Use tool for navigating the directory of SEC XML schema files by year. Parameters ---------- @@ -337,16 +335,16 @@ class ROUTER_regulators_sec(Container): @validate def sic_search( self, - query: Annotated[str, OpenBBCustomParameter(description="Search query.")] = "", + query: Annotated[str, OpenBBField(description="Search query.")] = "", use_cache: Annotated[ Optional[bool], - OpenBBCustomParameter( + OpenBBField( description="Whether or not to use cache. If True, cache will store for seven days." ), ] = True, provider: Annotated[ Optional[Literal["sec"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'sec' if there is\n no default." ), ] = None, @@ -417,16 +415,16 @@ class ROUTER_regulators_sec(Container): @validate def symbol_map( self, - query: Annotated[str, OpenBBCustomParameter(description="Search query.")], + query: Annotated[str, OpenBBField(description="Search query.")], use_cache: Annotated[ Optional[bool], - OpenBBCustomParameter( + OpenBBField( description="Whether or not to use cache. If True, cache will store for seven days." ), ] = True, provider: Annotated[ Optional[Literal["sec"]], - OpenBBCustomParameter( + OpenBBField( description="The provider to use for the query, by default None.\n If None, the provider specified in defaults is selected or 'sec' if there is\n no default." ), ] = None, diff --git a/openbb_platform/providers/__init__.py b/openbb_platform/providers/__init__.py index e69de29bb2d..e80dd09da70 100644 --- a/openbb_platform/providers/__init__.py +++ b/openbb_platform/providers/__init__.py @@ -0,0 +1 @@ +"""OpenBB Platform Providers.""" diff --git a/openbb_platform/providers/alpha_vantage/__init__.py b/openbb_platform/providers/alpha_vantage/__init__.py index e69de29bb2d..cbf25829548 100644 --- a/openbb_platform/providers/alpha_vantage/__init__.py +++ b/openbb_platform/providers/alpha_vantage/__init__.py @@ -0,0 +1 @@ +"""Alpha Vantage Provider.""" diff --git a/openbb_platform/providers/alpha_vantage/openbb_alpha_vantage/models/__init__.py b/openbb_platform/providers/alpha_vantage/openbb_alpha_vantage/models/__init__.py index e69de29bb2d..77b12520b31 100644 --- a/openbb_platform/providers/alpha_vantage/openbb_alpha_vantage/models/__init__.py +++ b/openbb_platform/providers/alpha_vantage/openbb_alpha_vantage/models/__init__.py @@ -0,0 +1 @@ +"""Alpha Vantage models.""" diff --git a/openbb_platform/providers/alpha_vantage/openbb_alpha_vantage/models/equity_historical.py b/openbb_platform/providers/alpha_vantage/openbb_alpha_vantage/models/equity_historical.py index 0ea55731e12..91e20c2d726 100644 --- a/openbb_platform/providers/alpha_vantage/openbb_alpha_vantage/models/equity_historical.py +++ b/openbb_platform/providers/alpha_vantage/openbb_alpha_vantage/models/equity_historical.py @@ -157,7 +157,7 @@ class AVEquityHistoricalFetcher( results = [] async def callback(response, _): - """Callback function to process the response.""" + """Use callback function to process the response.""" try: result = await response.json() if "Information" in result: @@ -168,7 +168,7 @@ class AVEquityHistoricalFetcher( return await response.read() async def intraday_callback(response, _): - """Callback function to process the intraday response.""" + """Use callback function to process the intraday response.""" symbol = response.url.query.get("symbol", None) data = await response.read() if data: @@ -189,7 +189,6 @@ class AVEquityHistoricalFetcher( async def get_one(symbol, intraday: bool = False): """Get data for one symbol.""" - if intraday is True: adjusted = query.adjustment != "unadjusted" if query.adjustment == "splits_only": @@ -298,7 +297,6 @@ class AVEquityHistoricalFetcher( query: AVEquityHistoricalQueryParams, data: List[Dict], **kwargs: Any ) -> List[AVEquityHistoricalData]: """Transform the data to the standard format.""" - if data == []: return [] if "{" in data[0]: diff --git a/openbb_platform/providers/alpha_vantage/openbb_alpha_vantage/utils/__init__.py b/openbb_platform/providers/alpha_vantage/openbb_alpha_vantage/utils/__init__.py index e69de29bb2d..37ed69b5ee1 100644 --- a/openbb_platform/providers/alpha_vantage/openbb_alpha_vantage/utils/__init__.py +++ b/openbb_platform/providers/alpha_vantage/openbb_alpha_vantage/utils/__init__.py @@ -0,0 +1 @@ +"""Alpha Vantage utilities.""" diff --git a/openbb_platform/providers/alpha_vantage/openbb_alpha_vantage/utils/helpers.py b/openbb_platform/providers/alpha_vantage/openbb_alpha_vantage/utils/helpers.py index 88c6bffda35..f16bd40fa0a 100644 --- a/openbb_platform/providers/alpha_vantage/openbb_alpha_vantage/utils/helpers.py +++ b/openbb_platform/providers/alpha_vantage/openbb_alpha_vantage/utils/helpers.py @@ -48,10 +48,10 @@ def filter_by_dates( def calculate_adjusted_prices(df: pd.DataFrame, column: str, dividends: bool = False): - """Calculates the split-adjusted prices, or split and dividend adjusted prices. + """Calculate the split-adjusted prices, or split and dividend adjusted prices. Parameters - ------------ + ---------- df: pd.DataFrame DataFrame with unadjusted OHLCV values + split_factor + dividend column: str @@ -60,11 +60,10 @@ def calculate_adjusted_prices(df: pd.DataFrame, column: str, dividends: bool = F Whether to adjust for both splits and dividends. Default is split-adjusted only. Returns - -------- + ------- pd.DataFrame DataFrame with adjusted prices. """ - df = df.copy() adj_column = "adj_" + column diff --git a/openbb_platform/providers/alpha_vantage/poetry.lock b/openbb_platform/providers/alpha_vantage/poetry.lock index 1f872410758..45aff8d211b 100644 --- a/openbb_platform/providers/alpha_vantage/poetry.lock +++ b/openbb_platform/providers/alpha_vantage/poetry.lock @@ -697,13 +697,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1416,4 +1416,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e5a1c1f22e0b8e42343cef04f6f23281c7d6441df13f2be91584098c856ab1f0" +content-hash = "ca421fe0dbae56150a2fc3a7978ad65f3dd4e70025bc4da4a7f1338b8eca522c" diff --git a/openbb_platform/providers/alpha_vantage/pyproject.toml b/openbb_platform/providers/alpha_vantage/pyproject.toml index d5d25a407f2..852cba82b23 100644 --- a/openbb_platform/providers/alpha_vantage/pyproject.toml +++ b/openbb_platform/providers/alpha_vantage/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-alpha-vantage" -version = "1.1.4" +version = "1.1.5" description = "Alpha Vantage extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_alpha_vantage" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/providers/alpha_vantage/tests/__init__.py b/openbb_platform/providers/alpha_vantage/tests/__init__.py index e69de29bb2d..d12ab5730ed 100644 --- a/openbb_platform/providers/alpha_vantage/tests/__init__.py +++ b/openbb_platform/providers/alpha_vantage/tests/__init__.py @@ -0,0 +1 @@ +"""Alpha Vantage tests.""" diff --git a/openbb_platform/providers/alpha_vantage/tests/test_alpha_vantage_fetchers.py b/openbb_platform/providers/alpha_vantage/tests/test_alpha_vantage_fetchers.py index 8cc9fb7ed66..d14c8c47c55 100644 --- a/openbb_platform/providers/alpha_vantage/tests/test_alpha_vantage_fetchers.py +++ b/openbb_platform/providers/alpha_vantage/tests/test_alpha_vantage_fetchers.py @@ -1,3 +1,5 @@ +"""Test the Alpha Vantage fetchers.""" + from datetime import date import pytest @@ -12,6 +14,7 @@ test_credentials = UserService().default_user_settings.credentials.model_dump( @pytest.fixture(scope="module") def vcr_config(): + """VCR configuration.""" return { "filter_headers": [("User-Agent", None)], "filter_query_parameters": [ @@ -22,6 +25,7 @@ def vcr_config(): @pytest.mark.record_http def test_av_equity_historical_fetcher(credentials=test_credentials): + """Test the Alpha Vantage Equity Historical fetcher.""" params = { "symbol": "AAPL", "start_date": date(2023, 1, 1), @@ -36,6 +40,7 @@ def test_av_equity_historical_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_av_historical_eps_fetcher(credentials=test_credentials): + """Test the Alpha Vantage Historical Earnings fetcher.""" params = {"symbol": "AAPL,MSFT", "period": "quarter", "limit": 4} fetcher = AVHistoricalEpsFetcher() diff --git a/openbb_platform/providers/benzinga/__init__.py b/openbb_platform/providers/benzinga/__init__.py index e69de29bb2d..ae824bf16b4 100644 --- a/openbb_platform/providers/benzinga/__init__.py +++ b/openbb_platform/providers/benzinga/__init__.py @@ -0,0 +1 @@ +"""Benzinga Provider.""" diff --git a/openbb_platform/providers/benzinga/openbb_benzinga/models/__init__.py b/openbb_platform/providers/benzinga/openbb_benzinga/models/__init__.py index e69de29bb2d..8b008a32eb4 100644 --- a/openbb_platform/providers/benzinga/openbb_benzinga/models/__init__.py +++ b/openbb_platform/providers/benzinga/openbb_benzinga/models/__init__.py @@ -0,0 +1 @@ +"""Benzinga Provider Models.""" diff --git a/openbb_platform/providers/benzinga/openbb_benzinga/models/analyst_search.py b/openbb_platform/providers/benzinga/openbb_benzinga/models/analyst_search.py index 90554c4decb..f5cf40a2a5a 100644 --- a/openbb_platform/providers/benzinga/openbb_benzinga/models/analyst_search.py +++ b/openbb_platform/providers/benzinga/openbb_benzinga/models/analyst_search.py @@ -2,7 +2,10 @@ # pylint: disable=unused-argument -from datetime import datetime +from datetime import ( + date as dateType, + timezone, +) from typing import Any, Dict, List, Optional from openbb_core.provider.abstract.fetcher import Fetcher @@ -11,9 +14,12 @@ from openbb_core.provider.standard_models.analyst_search import ( AnalystSearchQueryParams, ) from openbb_core.provider.utils.errors import EmptyDataError -from openbb_core.provider.utils.helpers import amake_request, get_querystring +from openbb_core.provider.utils.helpers import ( + amake_request, + get_querystring, + safe_fromtimestamp, +) from pydantic import Field, field_validator, model_validator -from pytz import UTC class BenzingaAnalystSearchQueryParams(AnalystSearchQueryParams): @@ -145,6 +151,17 @@ class BenzingaAnalystSearchData(AnalystSearchData): json_schema_extra={"unit_measurement": "percent", "frontend_multiply": 100}, alias="1m_stdev", ) + smart_score_1m: Optional[float] = Field( + default=None, + description="A weighted average smart score over the last month.", + alias="1m_smart_score", + ) + success_rate_1m: Optional[float] = Field( + default=None, + description="The percentage (normalized) of gain/loss ratings that resulted in a gain over the last month", + json_schema_extra={"unit_measurement": "percent", "frontend_multiply": 100}, + alias="1m_success_rate", + ) gain_count_3m: Optional[int] = Field( default=None, description="The number of ratings that have gained value over the last 3 months", @@ -169,6 +186,17 @@ class BenzingaAnalystSearchData(AnalystSearchData): json_schema_extra={"unit_measurement": "percent", "frontend_multiply": 100}, alias="3m_stdev", ) + smart_score_3m: Optional[float] = Field( + default=None, + description="A weighted average smart score over the last 3 months.", + alias="3m_smart_score", + ) + success_rate_3m: Optional[float] = Field( + default=None, + description="The percentage (normalized) of gain/loss ratings that resulted in a gain over the last 3 months", + json_schema_extra={"unit_measurement": "percent", "frontend_multiply": 100}, + alias="3m_success_rate", + ) gain_count_6m: Optional[int] = Field( default=None, description="The number of ratings that have gained value over the last 6 months", @@ -217,6 +245,17 @@ class BenzingaAnalystSearchData(AnalystSearchData): json_schema_extra={"unit_measurement": "percent", "frontend_multiply": 100}, alias="9m_stdev", ) + smart_score_9m: Optional[float] = Field( + default=None, + description="A weighted average smart score over the last 9 months.", + alias="9m_smart_score", + ) + success_rate_9m: Optional[float] = Field( + default=None, + description="The percentage (normalized) of gain/loss ratings that resulted in a gain over the last 9 months", + json_schema_extra={"unit_measurement": "percent", "frontend_multiply": 100}, + alias="9m_success_rate", + ) gain_count_1y: Optional[int] = Field( default=None, description="The number of ratings that have gained value over the last 1 year", @@ -241,6 +280,17 @@ class BenzingaAnalystSearchData(AnalystSearchData): json_schema_extra={"unit_measurement": "percent", "frontend_multiply": 100}, alias="1y_stdev", ) + smart_score_1y: Optional[float] = Field( + default=None, + description="A weighted average smart score over the last 1 year.", + alias="1y_smart_score", + ) + success_rate_1y: Optional[float] = Field( + default=None, + description="The percentage (normalized) of gain/loss ratings that resulted in a gain over the last 1 year", + json_schema_extra={"unit_measurement": "percent", "frontend_multiply": 100}, + alias="1y_success_rate", + ) gain_count_2y: Optional[int] = Field( default=None, description="The number of ratings that have gained value over the last 2 years", @@ -265,6 +315,17 @@ class BenzingaAnalystSearchData(AnalystSearchData): json_schema_extra={"unit_measurement": "percent", "frontend_multiply": 100}, alias="2y_stdev", ) + smart_score_2y: Optional[float] = Field( + default=None, + description="A weighted average smart score over the last 3 years.", + alias="2y_smart_score", + ) + success_rate_2y: Optional[float] = Field( + default=None, + description="The percentage (normalized) of gain/loss ratings that resulted in a gain over the last 2 years", + json_schema_extra={"unit_measurement": "percent", "frontend_multiply": 100}, + alias="2y_success_rate", + ) gain_count_3y: Optional[int] = Field( default=None, description="The number of ratings that have gained value over the last 3 years", @@ -289,14 +350,26 @@ class BenzingaAnalystSearchData(AnalystSearchData): json_schema_extra={"unit_measurement": "percent", "frontend_multiply": 100}, alias="3y_stdev", ) + smart_score_3y: Optional[float] = Field( + default=None, + description="A weighted average smart score over the last 3 years.", + alias="3y_smart_score", + ) + success_rate_3y: Optional[float] = Field( + default=None, + description="The percentage (normalized) of gain/loss ratings that resulted in a gain over the last 3 years", + json_schema_extra={"unit_measurement": "percent", "frontend_multiply": 100}, + alias="3y_success_rate", + ) @field_validator("last_updated", mode="before", check_fields=False) @classmethod - def validate_date(cls, v): + def validate_date(cls, v: float) -> Optional[dateType]: + """Validate last_updated.""" if v: - dt = datetime.fromtimestamp(v, UTC) + dt = safe_fromtimestamp(v, tz=timezone.utc) return dt.date() if dt.time() == dt.min.time() else dt - return v + return None @model_validator(mode="before") @classmethod @@ -340,7 +413,6 @@ class BenzingaAnalystSearchFetcher( **kwargs: Any, ) -> List[Dict]: """Extract the raw data.""" - token = credentials.get("benzinga_api_key") if credentials else "" querystring = get_querystring(query.model_dump(), []) url = f"https://api.benzinga.com/api/v2.1/calendar/ratings/analysts?{querystring}&token={token}" diff --git a/openbb_platform/providers/benzinga/openbb_benzinga/models/price_target.py b/openbb_platform/providers/benzinga/openbb_benzinga/models/price_target.py index 561cb9862fa..d799e3410d8 100644 --- a/openbb_platform/providers/benzinga/openbb_benzinga/models/price_target.py +++ b/openbb_platform/providers/benzinga/openbb_benzinga/models/price_target.py @@ -17,9 +17,12 @@ from openbb_core.provider.standard_models.price_target import ( ) from openbb_core.provider.utils.descriptions import QUERY_DESCRIPTIONS from openbb_core.provider.utils.errors import EmptyDataError -from openbb_core.provider.utils.helpers import amake_requests, get_querystring +from openbb_core.provider.utils.helpers import ( + amake_requests, + get_querystring, + safe_fromtimestamp, +) from pydantic import Field, field_validator, model_validator -from pytz import UTC COVERAGE_DICT = { "downgrades": "Downgrades", @@ -221,12 +224,12 @@ class BenzingaPriceTargetData(PriceTargetData): @field_validator("last_updated", mode="before", check_fields=False) @classmethod - def validate_date(cls, v): + def validate_date(cls, v: float) -> Optional[dateType]: """Convert the Unix timestamp to a datetime object.""" if v: - dt = datetime.fromtimestamp(v, UTC) + dt = safe_fromtimestamp(v, tz=timezone.utc) return dt.date() if dt.time() == dt.min.time() else dt - return v + return None @model_validator(mode="before") @classmethod diff --git a/openbb_platform/providers/benzinga/openbb_benzinga/utils/__init__.py b/openbb_platform/providers/benzinga/openbb_benzinga/utils/__init__.py index e69de29bb2d..0209502ea38 100644 --- a/openbb_platform/providers/benzinga/openbb_benzinga/utils/__init__.py +++ b/openbb_platform/providers/benzinga/openbb_benzinga/utils/__init__.py @@ -0,0 +1 @@ +"""Benzinga Provider Utils.""" diff --git a/openbb_platform/providers/benzinga/poetry.lock b/openbb_platform/providers/benzinga/poetry.lock index 1f872410758..45aff8d211b 100644 --- a/openbb_platform/providers/benzinga/poetry.lock +++ b/openbb_platform/providers/benzinga/poetry.lock @@ -697,13 +697,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1416,4 +1416,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e5a1c1f22e0b8e42343cef04f6f23281c7d6441df13f2be91584098c856ab1f0" +content-hash = "ca421fe0dbae56150a2fc3a7978ad65f3dd4e70025bc4da4a7f1338b8eca522c" diff --git a/openbb_platform/providers/benzinga/pyproject.toml b/openbb_platform/providers/benzinga/pyproject.toml index 84cd848b457..f8dc506a3cc 100644 --- a/openbb_platform/providers/benzinga/pyproject.toml +++ b/openbb_platform/providers/benzinga/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-benzinga" -version = "1.1.4" +version = "1.1.5" description = "Benzinga extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_benzinga" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/providers/benzinga/tests/__init__.py b/openbb_platform/providers/benzinga/tests/__init__.py index e69de29bb2d..e423bb41245 100644 --- a/openbb_platform/providers/benzinga/tests/__init__.py +++ b/openbb_platform/providers/benzinga/tests/__init__.py @@ -0,0 +1 @@ +"""Test Benzinga fetchers.""" diff --git a/openbb_platform/providers/benzinga/tests/test_benzinga_fetchers.py b/openbb_platform/providers/benzinga/tests/test_benzinga_fetchers.py index e33454139ca..2902f09847c 100644 --- a/openbb_platform/providers/benzinga/tests/test_benzinga_fetchers.py +++ b/openbb_platform/providers/benzinga/tests/test_benzinga_fetchers.py @@ -1,3 +1,5 @@ +"""Test the Benzinga fetchers.""" + import pytest from openbb_benzinga.models.analyst_search import BenzingaAnalystSearchFetcher from openbb_benzinga.models.company_news import BenzingaCompanyNewsFetcher @@ -12,6 +14,7 @@ test_credentials = UserService().default_user_settings.credentials.model_dump( @pytest.fixture(scope="module") def vcr_config(): + """VCR configuration.""" return { "filter_headers": [("User-Agent", None)], "filter_query_parameters": [ @@ -22,6 +25,7 @@ def vcr_config(): @pytest.mark.record_http def test_benzinga_world_news_fetcher(credentials=test_credentials): + """Test the world news fetcher.""" params = {"limit": 20} fetcher = BenzingaWorldNewsFetcher() @@ -31,6 +35,7 @@ def test_benzinga_world_news_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_benzinga_company_news_fetcher(credentials=test_credentials): + """Test the company news fetcher.""" params = {"symbol": "AAPL,MSFT", "limit": 20} fetcher = BenzingaCompanyNewsFetcher() @@ -40,6 +45,7 @@ def test_benzinga_company_news_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_benzinga_price_target_fetcher(credentials=test_credentials): + """Test the price target fetcher.""" params = {"symbol": "AAPL"} fetcher = BenzingaPriceTargetFetcher() @@ -49,6 +55,7 @@ def test_benzinga_price_target_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_benzinga_analyst_search_fetcher(credentials=test_credentials): + """Test the analyst search fetcher.""" params = {"firm_name": "Barclays"} fetcher = BenzingaAnalystSearchFetcher() diff --git a/openbb_platform/providers/biztoc/__init__.py b/openbb_platform/providers/biztoc/__init__.py index e69de29bb2d..02876107827 100644 --- a/openbb_platform/providers/biztoc/__init__.py +++ b/openbb_platform/providers/biztoc/__init__.py @@ -0,0 +1 @@ +"""Biztoc provider.""" diff --git a/openbb_platform/providers/biztoc/openbb_biztoc/models/__init__.py b/openbb_platform/providers/biztoc/openbb_biztoc/models/__init__.py index e69de29bb2d..e716998b06a 100644 --- a/openbb_platform/providers/biztoc/openbb_biztoc/models/__init__.py +++ b/openbb_platform/providers/biztoc/openbb_biztoc/models/__init__.py @@ -0,0 +1 @@ +"""Biztoc Provider models.""" diff --git a/openbb_platform/providers/biztoc/openbb_biztoc/utils/__init__.py b/openbb_platform/providers/biztoc/openbb_biztoc/utils/__init__.py index e69de29bb2d..e46fb65077d 100644 --- a/openbb_platform/providers/biztoc/openbb_biztoc/utils/__init__.py +++ b/openbb_platform/providers/biztoc/openbb_biztoc/utils/__init__.py @@ -0,0 +1 @@ +"""Biztoc utils.""" diff --git a/openbb_platform/providers/biztoc/openbb_biztoc/utils/helpers.py b/openbb_platform/providers/biztoc/openbb_biztoc/utils/helpers.py index d8d7ea8003f..061271c8a5d 100644 --- a/openbb_platform/providers/biztoc/openbb_biztoc/utils/helpers.py +++ b/openbb_platform/providers/biztoc/openbb_biztoc/utils/helpers.py @@ -1,4 +1,4 @@ -"""Biztoc Helpers""" +"""Biztoc Helpers.""" from datetime import timedelta from typing import Dict, List, Literal @@ -7,6 +7,8 @@ import requests import requests_cache from openbb_core.app.utils import get_user_cache_directory +# pylint: disable=C0325 + cache_dir = get_user_cache_directory() biztoc_session_tags = requests_cache.CachedSession( @@ -18,8 +20,7 @@ biztoc_session_sources = requests_cache.CachedSession( def get_sources(api_key: str) -> List[Dict]: - """Valid sources for Biztoc queries.""" - + """Get valid sources for Biztoc queries.""" headers = { "X-RapidAPI-Key": f"{api_key}", "X-RapidAPI-Host": "biztoc.p.rapidapi.com", @@ -34,8 +35,7 @@ def get_sources(api_key: str) -> List[Dict]: def get_pages(api_key: str) -> List[str]: - """Valid pages for Biztoc queries.""" - + """Get valid pages for Biztoc queries.""" headers = { "X-RapidAPI-Key": f"{api_key}", "X-RapidAPI-Host": "biztoc.p.rapidapi.com", @@ -50,8 +50,7 @@ def get_pages(api_key: str) -> List[str]: def get_tags_by_page(page_id: str, api_key: str) -> List[str]: - """Valid tags required for Biztoc queries.""" - + """Get valid tags required for Biztoc queries.""" headers = { "X-RapidAPI-Key": f"{api_key}", "X-RapidAPI-Host": "biztoc.p.rapidapi.com", @@ -66,12 +65,13 @@ def get_tags_by_page(page_id: str, api_key: str) -> List[str]: def get_all_tags(api_key) -> Dict[str, List[str]]: + """Get all tags for all pages.""" tags: Dict[str, List[str]] = {} pages = get_pages(api_key) for page in pages: page_tags = get_tags_by_page(page, api_key) - tags.update({page: [x["tag"] for x in page_tags]}) + tags.update({page: [x["tag"] for x in page_tags]}) # type: ignore return tags @@ -85,8 +85,7 @@ def get_news( tag: str = "", term: str = "", ) -> List[Dict]: - """Calls the BizToc API and returns the data.""" - + """Call the BizToc API and returns the data.""" results = [] term = term.replace(" ", "%20") if term else "" _tags = get_all_tags(api_key) diff --git a/openbb_platform/providers/biztoc/poetry.lock b/openbb_platform/providers/biztoc/poetry.lock index ec7eb06cfd3..5273eb5c3f2 100644 --- a/openbb_platform/providers/biztoc/poetry.lock +++ b/openbb_platform/providers/biztoc/poetry.lock @@ -696,13 +696,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1474,4 +1474,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "5e1871be66c01fed2ac9442effc275be6755eab8999aa1e176385660744c6e39" +content-hash = "568175cf150aaadfd77c05974f135022a7fd5556d70643ac2b57f36bcf39c731" diff --git a/openbb_platform/providers/biztoc/pyproject.toml b/openbb_platform/providers/biztoc/pyproject.toml index b80fd0974f3..e66604f0558 100644 --- a/openbb_platform/providers/biztoc/pyproject.toml +++ b/openbb_platform/providers/biztoc/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-biztoc" -version = "1.1.4" +version = "1.1.5" description = "" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_biztoc" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" requests-cache = "^1.1.0" [build-system] diff --git a/openbb_platform/providers/biztoc/tests/__init__.py b/openbb_platform/providers/biztoc/tests/__init__.py index e69de29bb2d..f9f64a7d750 100644 --- a/openbb_platform/providers/biztoc/tests/__init__.py +++ b/openbb_platform/providers/biztoc/tests/__init__.py @@ -0,0 +1 @@ +"""Biztoc Provider tests.""" diff --git a/openbb_platform/providers/biztoc/tests/test_biztoc_fetchers.py b/openbb_platform/providers/biztoc/tests/test_biztoc_fetchers.py index b56da94a9a8..e2a3c579573 100644 --- a/openbb_platform/providers/biztoc/tests/test_biztoc_fetchers.py +++ b/openbb_platform/providers/biztoc/tests/test_biztoc_fetchers.py @@ -1,3 +1,5 @@ +"""Tests for the Biztoc fetchers.""" + import pytest from openbb_biztoc.models.world_news import BiztocWorldNewsFetcher from openbb_core.app.service.user_service import UserService @@ -7,6 +9,7 @@ test_credentials = UserService().default_user_settings.credentials.dict() @pytest.fixture(scope="module") def vcr_config(): + """VCR configuration.""" return { "filter_headers": [("User-Agent", None), ("X-RapidAPI-Key", "MOCK_API_KEY")], "filter_query_parameters": [ @@ -17,6 +20,7 @@ def vcr_config(): @pytest.mark.record_http def test_biztoc_world_news_fetcher(credentials=test_credentials): + """Test the Biztoc World News fetcher.""" params = {"term": "earnings"} fetcher = BiztocWorldNewsFetcher() diff --git a/openbb_platform/providers/cboe/__init__.py b/openbb_platform/providers/cboe/__init__.py index e69de29bb2d..635774cce04 100644 --- a/openbb_platform/providers/cboe/__init__.py +++ b/openbb_platform/providers/cboe/__init__.py @@ -0,0 +1 @@ +"""CBOE provider.""" diff --git a/openbb_platform/providers/cboe/openbb_cboe/models/futures_curve.py b/openbb_platform/providers/cboe/openbb_cboe/models/futures_curve.py index 44970f62b89..fee62fb339a 100644 --- a/openbb_platform/providers/cboe/openbb_cboe/models/futures_curve.py +++ b/openbb_platform/providers/cboe/openbb_cboe/models/futures_curve.py @@ -36,6 +36,7 @@ class CboeFuturesCurveFetcher( @staticmethod def transform_query(params: Dict[str, Any]) -> CboeFuturesCurveQueryParams: + """Transform the query.""" return CboeFuturesCurveQueryParams(**params) @staticmethod @@ -45,7 +46,6 @@ class CboeFuturesCurveFetcher( **kwargs: Any, ) -> List[Dict]: """Return the raw data from the CBOE endpoint.""" - symbol = query.symbol.upper().split(",")[0] FUTURES = await get_settlement_prices(**kwargs) if len(FUTURES) == 0: @@ -68,4 +68,5 @@ class CboeFuturesCurveFetcher( data: List[Dict], **kwargs: Any, ) -> List[CboeFuturesCurveData]: + """Transform data.""" return [CboeFuturesCurveData.model_validate(d) for d in data] diff --git a/openbb_platform/providers/cboe/openbb_cboe/utils/helpers.py b/openbb_platform/providers/cboe/openbb_cboe/utils/helpers.py index 74b7ca608cf..e49361b1549 100644 --- a/openbb_platform/providers/cboe/openbb_cboe/utils/helpers.py +++ b/openbb_platform/providers/cboe/openbb_cboe/utils/helpers.py @@ -1,4 +1,4 @@ -"""Cboe Helpers""" +"""Cboe Helpers.""" # pylint: disable=expression-not-assigned, unused-argument @@ -81,7 +81,7 @@ backend = SQLiteBackend(f"{cache_dir}/http/cboe_directories", expire_after=3600 async def response_callback(response: ClientResponse, _: Any): - """Callback for HTTP Client Response.""" + """Use callback for HTTP Client Response.""" content_type = response.headers.get("Content-Type", "") if "application/json" in content_type: return await response.json() @@ -91,7 +91,7 @@ async def response_callback(response: ClientResponse, _: Any): async def get_cboe_data(url, use_cache: bool = True, **kwargs) -> Any: - """Generic Cboe HTTP request.""" + """Use the generic Cboe HTTP request.""" if use_cache is True: async with CachedSession(cache=backend) as cached_session: try: @@ -106,15 +106,14 @@ async def get_cboe_data(url, use_cache: bool = True, **kwargs) -> Any: async def get_company_directory(use_cache: bool = True, **kwargs) -> DataFrame: - """ - Get the US Company Directory for Cboe options. If use_cache is True, - the data will be cached for 24 hours. + """Get the US Company Directory for Cboe options. + + If use_cache is True, the data will be cached for 24 hours. Returns ------- DataFrame: Pandas DataFrame of the Cboe listings directory """ - url = "https://www.cboe.com/us/options/symboldir/equity_index_options/?download=csv" results = await get_cboe_data(url, use_cache) @@ -136,15 +135,14 @@ async def get_company_directory(use_cache: bool = True, **kwargs) -> DataFrame: async def get_index_directory(use_cache: bool = True, **kwargs) -> DataFrame: - """ - Get the Cboe Index Directory. If use_cache is True, - the data will be cached for 24 hours. + """Get the Cboe Index Directory. + + If use_cache is True, the data will be cached for 24 hours. Returns - -------- + ------- List[Dict]: A list of dictionaries containing the index information. """ - url = "https://cdn.cboe.com/api/global/us_indices/definitions/all_indices.json" results = await get_cboe_data(url, use_cache=use_cache) @@ -162,11 +160,10 @@ async def list_futures(**kwargs) -> List[dict]: """List of CBOE futures and their underlying symbols. Returns - -------- + ------- pd.DataFrame Pandas DataFrame with results. """ - r = await get_cboe_data( "https://cdn.cboe.com/api/global/delayed_quotes/symbol_book/futures-roots.json" ) @@ -183,10 +180,10 @@ async def get_settlement_prices( final_settlement: bool = False, **kwargs, ) -> DataFrame: - """Gets the settlement prices of CBOE futures. + """Get the settlement prices of CBOE futures. Parameters - ----------- + ---------- settlement_date: Optional[date] The settlement date. Only valid for active contracts. [YYYY-MM-DD] options: bool diff --git a/openbb_platform/providers/cboe/poetry.lock b/openbb_platform/providers/cboe/poetry.lock index a3aa5003401..bd3089b5849 100644 --- a/openbb_platform/providers/cboe/poetry.lock +++ b/openbb_platform/providers/cboe/poetry.lock @@ -751,13 +751,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1484,4 +1484,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "6a3d58e3422d1ba3b69823fe40edbda25545ab4c7b96b678dc2f47430833a15b" +content-hash = "7fd94b8732cf94829c9edccbce65681547ff7ea9b6ec050748d703e6aff09de0" diff --git a/openbb_platform/providers/cboe/pyproject.toml b/openbb_platform/providers/cboe/pyproject.toml index b06c69163ab..0e6aaaaaf3b 100644 --- a/openbb_platform/providers/cboe/pyproject.toml +++ b/openbb_platform/providers/cboe/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-cboe" -version = "1.1.4" +version = "1.1.5" description = "CBOE extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -10,7 +10,7 @@ packages = [{ include = "openbb_cboe" }] python = "^3.8" aiohttp-client-cache = "^0.10.0" aiosqlite = "^0.19.0" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/providers/cboe/tests/__init__.py b/openbb_platform/providers/cboe/tests/__init__.py index e69de29bb2d..41685dac0a5 100644 --- a/openbb_platform/providers/cboe/tests/__init__.py +++ b/openbb_platform/providers/cboe/tests/__init__.py @@ -0,0 +1 @@ +"""CBOE tests.""" diff --git a/openbb_platform/providers/cboe/tests/test_cboe_fetchers.py b/openbb_platform/providers/cboe/tests/test_cboe_fetchers.py index 9f380286c00..1545a87a00d 100644 --- a/openbb_platform/providers/cboe/tests/test_cboe_fetchers.py +++ b/openbb_platform/providers/cboe/tests/test_cboe_fetchers.py @@ -34,6 +34,7 @@ test_credentials = UserService().default_user_settings.credentials.model_dump( @pytest.fixture(scope="module") def vcr_config(): + """VCR configuration.""" return { "filter_headers": [("User-Agent", None)], "filter_query_parameters": [ @@ -44,6 +45,7 @@ def vcr_config(): @pytest.mark.record_http def test_cboe_index_historical_fetcher(credentials=test_credentials): + """Test Cboe index historical fetcher.""" params = {"symbol": "AAVE10RP", "use_cache": False} fetcher = CboeIndexHistoricalFetcher() @@ -53,6 +55,7 @@ def test_cboe_index_historical_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_cboe_index_constituents_fetcher(credentials=test_credentials): + """Test Cboe index constituents fetcher.""" params = {"symbol": "BUK100P"} fetcher = CboeIndexConstituentsFetcher() @@ -62,6 +65,7 @@ def test_cboe_index_constituents_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_cboe_index_search_fetcher(credentials=test_credentials): + """Test Cboe index search fetcher.""" params = {"query": "uk", "use_cache": False} fetcher = CboeIndexSearchFetcher() @@ -71,6 +75,7 @@ def test_cboe_index_search_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_cboe_equity_historical_fetcher(credentials=test_credentials): + """Test Cboe equity historical fetcher.""" params = { "symbol": "AAPL", "start_date": date(2023, 1, 1), @@ -86,6 +91,7 @@ def test_cboe_equity_historical_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_cboe_available_indices_fetcher(credentials=test_credentials): + """Test Cboe available indices fetcher.""" params = {"use_cache": False} fetcher = CboeAvailableIndicesFetcher() @@ -95,6 +101,7 @@ def test_cboe_available_indices_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_cboe_options_chains_fetcher(credentials=test_credentials): + """Test Cboe options chains fetcher.""" params = {"symbol": "AAPL", "use_cache": False} fetcher = CboeOptionsChainsFetcher() @@ -104,6 +111,7 @@ def test_cboe_options_chains_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_cboe_equity_search_fetcher(credentials=test_credentials): + """Test Cboe equity search fetcher.""" params = {"query": "ETF", "use_cache": False} fetcher = CboeEquitySearchFetcher() @@ -113,6 +121,7 @@ def test_cboe_equity_search_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_cboe_equity_quote_fetcher(credentials=test_credentials): + """Test Cboe equity quote fetcher.""" params = {"symbol": "AAPL", "use_cache": False} fetcher = CboeEquityQuoteFetcher() @@ -122,6 +131,7 @@ def test_cboe_equity_quote_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_cboe_futures_curve_fetcher(credentials=test_credentials): + """Test Cboe futures curve fetcher.""" params = {"symbol": "VX"} fetcher = CboeFuturesCurveFetcher() @@ -131,6 +141,7 @@ def test_cboe_futures_curve_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_cboe_index_snapshots_fetcher(credentials=test_credentials): + """Test Cboe index snapshots fetcher.""" params = {"region": "eu"} fetcher = CboeIndexSnapshotsFetcher() diff --git a/openbb_platform/providers/ecb/openbb_ecb/models/__init__.py b/openbb_platform/providers/ecb/openbb_ecb/models/__init__.py index e69de29bb2d..de03eacd4a6 100644 --- a/openbb_platform/providers/ecb/openbb_ecb/models/__init__.py +++ b/openbb_platform/providers/ecb/openbb_ecb/models/__init__.py @@ -0,0 +1 @@ +"""ECB Provider Models.""" diff --git a/openbb_platform/providers/ecb/openbb_ecb/utils/__init__.py b/openbb_platform/providers/ecb/openbb_ecb/utils/__init__.py index e69de29bb2d..c703f4399bd 100644 --- a/openbb_platform/providers/ecb/openbb_ecb/utils/__init__.py +++ b/openbb_platform/providers/ecb/openbb_ecb/utils/__init__.py @@ -0,0 +1 @@ +"""ECB utils module.""" diff --git a/openbb_platform/providers/ecb/poetry.lock b/openbb_platform/providers/ecb/poetry.lock index b259691dd84..33e2587fd3b 100644 --- a/openbb_platform/providers/ecb/poetry.lock +++ b/openbb_platform/providers/ecb/poetry.lock @@ -682,13 +682,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1412,4 +1412,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "fdc72f89649382aa5641fc6e4a55b171a9231eeaf613723bc2e3205d78e09c5e" +content-hash = "a5b4bc77391f8d797fb64b16333d066842efe91e979e99994c63ecaf79d920fc" diff --git a/openbb_platform/providers/ecb/pyproject.toml b/openbb_platform/providers/ecb/pyproject.toml index 9cca1fbed4d..59ecace1729 100644 --- a/openbb_platform/providers/ecb/pyproject.toml +++ b/openbb_platform/providers/ecb/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-ecb" -version = "1.1.4" +version = "1.1.5" description = "ECB extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_ecb" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" xmltodict = "^0.13.0" [build-system] diff --git a/openbb_platform/providers/federal_reserve/__init__.py b/openbb_platform/providers/federal_reserve/__init__.py index e69de29bb2d..e06814d7031 100644 --- a/openbb_platform/providers/federal_reserve/__init__.py +++ b/openbb_platform/providers/federal_reserve/__init__.py @@ -0,0 +1 @@ +"""Federal Reserve provider for OpenBB Platform.""" diff --git a/openbb_platform/providers/federal_reserve/poetry.lock b/openbb_platform/providers/federal_reserve/poetry.lock index b1a428337f0..d8ec9345f79 100644 --- a/openbb_platform/providers/federal_reserve/poetry.lock +++ b/openbb_platform/providers/federal_reserve/poetry.lock @@ -682,13 +682,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1401,4 +1401,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e5a1c1f22e0b8e42343cef04f6f23281c7d6441df13f2be91584098c856ab1f0" +content-hash = "ca421fe0dbae56150a2fc3a7978ad65f3dd4e70025bc4da4a7f1338b8eca522c" diff --git a/openbb_platform/providers/federal_reserve/pyproject.toml b/openbb_platform/providers/federal_reserve/pyproject.toml index 6d6ba143e31..eaa919ada36 100644 --- a/openbb_platform/providers/federal_reserve/pyproject.toml +++ b/openbb_platform/providers/federal_reserve/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-federal-reserve" -version = "1.1.4" +version = "1.1.5" description = "US Federal Reserve Data Extension for OpenBB" authors = ["OpenBB "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_federal_reserve" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/providers/federal_reserve/tests/test_federal_reserve_fetchers.py b/openbb_platform/providers/federal_reserve/tests/test_federal_reserve_fetchers.py index 97e9fe5ac73..40e5bab1f15 100644 --- a/openbb_platform/providers/federal_reserve/tests/test_federal_reserve_fetchers.py +++ b/openbb_platform/providers/federal_reserve/tests/test_federal_reserve_fetchers.py @@ -1,3 +1,5 @@ +"""Tests for the Federal Reserve fetchers.""" + from datetime import date import pytest @@ -17,6 +19,7 @@ test_credentials = UserService().default_user_settings.credentials.model_dump( @pytest.mark.record_http def test_federal_reserve_treasury_rates_fetcher(credentials=test_credentials): + """Test the Federal Reserve Treasury Rates fetcher.""" params = {"start_date": date(2023, 1, 1), "end_date": date(2023, 5, 10)} fetcher = FederalReserveTreasuryRatesFetcher() @@ -26,6 +29,7 @@ def test_federal_reserve_treasury_rates_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_federal_reserve_money_measures_fetcher(credentials=test_credentials): + """Test the Federal Reserve Money Measures fetcher.""" params = {"start_date": date(2023, 1, 1), "end_date": date(2023, 5, 10)} fetcher = FederalReserveMoneyMeasuresFetcher() @@ -35,6 +39,7 @@ def test_federal_reserve_money_measures_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_federal_reserve_fed_fetcher(credentials=test_credentials): + """Test the Federal Reserve FED fetcher.""" params = {"start_date": date(2023, 1, 1), "end_date": date(2023, 6, 6)} fetcher = FederalReserveFEDFetcher() diff --git a/openbb_platform/providers/finra/__init__.py b/openbb_platform/providers/finra/__init__.py index e69de29bb2d..35f7b384ac0 100644 --- a/openbb_platform/providers/finra/__init__.py +++ b/openbb_platform/providers/finra/__init__.py @@ -0,0 +1 @@ +"""FINRA provider for OpenBB Platform.""" diff --git a/openbb_platform/providers/finra/openbb_finra/utils/helpers.py b/openbb_platform/providers/finra/openbb_finra/utils/helpers.py index 4468004ebd0..364f3fde743 100644 --- a/openbb_platform/providers/finra/openbb_finra/utils/helpers.py +++ b/openbb_platform/providers/finra/openbb_finra/utils/helpers.py @@ -1,12 +1,15 @@ -# Helper functions for FINRA API +"""Helper functions for FINRA API.""" + import datetime from typing import List import requests +# pylint: disable=W0621 + def get_finra_weeks(tier: str = "T1", is_ats: bool = True): - """Fetches the available weeks from FINRA that can be used.""" + """Fetch the available weeks from FINRA that can be used.""" request_header = {"Accept": "application/json", "Content-Type": "application/json"} request_data = { @@ -40,6 +43,7 @@ def get_finra_weeks(tier: str = "T1", is_ats: bool = True): def get_finra_data(symbol, week_start, tier: str = "T1", is_ats: bool = True): + """Get the data for a symbol from FINRA.""" req_hdr = { "Accept": "application/json", "Content-Type": "application/json", @@ -93,6 +97,7 @@ def get_finra_data(symbol, week_start, tier: str = "T1", is_ats: bool = True): def get_full_data(symbol, tier: str = "T1", is_ats: bool = True): + """Get the full data for a symbol from FINRA.""" weeks = [week["weekStartDate"] for week in get_finra_weeks(tier, is_ats)] data = [] @@ -106,6 +111,7 @@ def get_full_data(symbol, tier: str = "T1", is_ats: bool = True): def get_adjusted_date(year, month, day): + """Find the closest date if the date falls on a weekend.""" # Get the date date = datetime.date(year, month, day) @@ -120,13 +126,14 @@ def get_adjusted_date(year, month, day): def get_short_interest_dates() -> List[str]: - """ - Get a list of dates for which the short interest data is available. It is reported on the 15th and the - last day of each month,but if the date falls on a weekend, the date is adjusted to the closest friday. + """Get a list of dates for which the short interest data is available. + + It is reported on the 15th and the last day of each month,but if the date falls on a weekend, + the date is adjusted to the closest friday. """ def get_adjusted_date(year, month, day): - """If the date falls on a weekend, find the closest date""" + """Find the closest date if the date falls on a weekend.""" # Get the date date = datetime.date(year, month, day) diff --git a/openbb_platform/providers/finra/poetry.lock b/openbb_platform/providers/finra/poetry.lock index fc6d85d4845..16e2a4aa4cb 100644 --- a/openbb_platform/providers/finra/poetry.lock +++ b/openbb_platform/providers/finra/poetry.lock @@ -671,13 +671,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1390,4 +1390,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e5a1c1f22e0b8e42343cef04f6f23281c7d6441df13f2be91584098c856ab1f0" +content-hash = "ca421fe0dbae56150a2fc3a7978ad65f3dd4e70025bc4da4a7f1338b8eca522c" diff --git a/openbb_platform/providers/finra/pyproject.toml b/openbb_platform/providers/finra/pyproject.toml index d5d3f94ca27..20525def1fd 100644 --- a/openbb_platform/providers/finra/pyproject.toml +++ b/openbb_platform/providers/finra/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-finra" -version = "1.1.4" +version = "1.1.5" description = "FINRA extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_finra" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/providers/finra/tests/test_finra_fetchers.py b/openbb_platform/providers/finra/tests/test_finra_fetchers.py index 212fb4317c0..19f8f292963 100644 --- a/openbb_platform/providers/finra/tests/test_finra_fetchers.py +++ b/openbb_platform/providers/finra/tests/test_finra_fetchers.py @@ -1,3 +1,5 @@ +"""Tests for the Finra fetchers.""" + import pytest from openbb_core.app.service.user_service import UserService from openbb_finra.models.equity_short_interest import FinraShortInterestFetcher @@ -10,6 +12,7 @@ test_credentials = UserService().default_user_settings.credentials.model_dump( @pytest.fixture(scope="module") def vcr_config(): + """VCR configuration.""" return { "filter_headers": [("User-Agent", None)], "filter_query_parameters": [ @@ -20,6 +23,7 @@ def vcr_config(): @pytest.mark.record_http def test_finra_otc_aggregate_fetcher(credentials=test_credentials): + """Test the Finra OTC Aggregate fetcher.""" params = {"symbol": "AAPL", "tier": "T1", "is_ats": True} fetcher = FinraOTCAggregateFetcher() @@ -30,6 +34,7 @@ def test_finra_otc_aggregate_fetcher(credentials=test_credentials): @pytest.mark.freeze_time("2021-10-21") @pytest.mark.record_http def test_finra_short_interest_fetcher(credentials=test_credentials): + """Test the Finra Short Interest fetcher.""" params = {"symbol": "AAPL"} fetcher = FinraShortInterestFetcher() diff --git a/openbb_platform/providers/finviz/__init__.py b/openbb_platform/providers/finviz/__init__.py index e69de29bb2d..c89b671ab79 100644 --- a/openbb_platform/providers/finviz/__init__.py +++ b/openbb_platform/providers/finviz/__init__.py @@ -0,0 +1 @@ +"""Finviz provider.""" diff --git a/openbb_platform/providers/finviz/openbb_finviz/models/__init__.py b/openbb_platform/providers/finviz/openbb_finviz/models/__init__.py index e69de29bb2d..3370d9d3dc3 100644 --- a/openbb_platform/providers/finviz/openbb_finviz/models/__init__.py +++ b/openbb_platform/providers/finviz/openbb_finviz/models/__init__.py @@ -0,0 +1 @@ +"""Finviz Provider models.""" diff --git a/openbb_platform/providers/finviz/openbb_finviz/models/compare_groups.py b/openbb_platform/providers/finviz/openbb_finviz/models/compare_groups.py index a360a412647..4c53fde9cf2 100644 --- a/openbb_platform/providers/finviz/openbb_finviz/models/compare_groups.py +++ b/openbb_platform/providers/finviz/openbb_finviz/models/compare_groups.py @@ -191,7 +191,7 @@ class FinvizCompareGroupsData(CompareGroupsData): @field_validator("market_cap", "volume", mode="before", check_fields=False) @classmethod def validate_abbreviated_numbers(cls, v): - """Checks for abbreviated string values.""" + """Check for abbreviated string values.""" if v is not None and isinstance(v, str): v = ( v.replace("M", "e+6") diff --git a/openbb_platform/providers/finviz/openbb_finviz/utils/__init__.py b/openbb_platform/providers/finviz/openbb_finviz/utils/__init__.py index e69de29bb2d..e5a38b98d21 100644 --- a/openbb_platform/providers/finviz/openbb_finviz/utils/__init__.py +++ b/openbb_platform/providers/finviz/openbb_finviz/utils/__init__.py @@ -0,0 +1 @@ +"""Finviz provider utils.""" diff --git a/openbb_platform/providers/finviz/poetry.lock b/openbb_platform/providers/finviz/poetry.lock index 9fd2f04e188..63b6484b547 100644 --- a/openbb_platform/providers/finviz/poetry.lock +++ b/openbb_platform/providers/finviz/poetry.lock @@ -860,13 +860,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1659,4 +1659,4 @@ testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "306b01fa966bc45551da0f17a2f1e5fa1968887aa1c3053f2f7e3d1205e0499b" +content-hash = "bc7b5321316f41e8aef2c0faa24ca338dffdf77dfafc5672d4d8066cf6c17501" diff --git a/openbb_platform/providers/finviz/pyproject.toml b/openbb_platform/providers/finviz/pyproject.toml index efe3856b34b..9e4f7c54d13 100644 --- a/openbb_platform/providers/finviz/pyproject.toml +++ b/openbb_platform/providers/finviz/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-finviz" -version = "1.0.3" +version = "1.0.4" description = "Finviz extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_finviz" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" finvizfinance = "0.14.7" diff --git a/openbb_platform/providers/finviz/tests/__init__.py b/openbb_platform/providers/finviz/tests/__init__.py index e69de29bb2d..05531f1aa14 100644 --- a/openbb_platform/providers/finviz/tests/__init__.py +++ b/openbb_platform/providers/finviz/tests/__init__.py @@ -0,0 +1 @@ +"""Finviz provider tests.""" diff --git a/openbb_platform/providers/finviz/tests/test_finviz_fetchers.py b/openbb_platform/providers/finviz/tests/test_finviz_fetchers.py index 70c33e716a1..02b935c9c3a 100644 --- a/openbb_platform/providers/finviz/tests/test_finviz_fetchers.py +++ b/openbb_platform/providers/finviz/tests/test_finviz_fetchers.py @@ -15,6 +15,7 @@ test_credentials = UserService().default_user_settings.credentials.model_dump( @pytest.fixture(scope="module") def vcr_config(): + """VCR configuration.""" return { "filter_headers": [ ("User-Agent", None), @@ -30,6 +31,7 @@ def vcr_config(): @pytest.mark.record_http def test_finviz_price_target_fetcher(credentials=test_credentials): + """Test Finviz Price Target Fetcher.""" params = {"symbol": "AAPL"} fetcher = FinvizPriceTargetFetcher() @@ -39,6 +41,7 @@ def test_finviz_price_target_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_finviz_price_performance_fetcher(credentials=test_credentials): + """Test Finviz Price Performance Fetcher.""" params = {"symbol": "AAPL"} fetcher = FinvizPricePerformanceFetcher() @@ -48,6 +51,7 @@ def test_finviz_price_performance_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_finviz_key_metrics_fetcher(credentials=test_credentials): + """Test Finviz Key Metrics Fetcher.""" params = {"symbol": "AAPL"} fetcher = FinvizKeyMetricsFetcher() @@ -57,6 +61,7 @@ def test_finviz_key_metrics_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_finviz_equity_profile_fetcher(credentials=test_credentials): + """Test Finviz Equity Profile Fetcher.""" params = {"symbol": "AAPL"} fetcher = FinvizEquityProfileFetcher() @@ -66,6 +71,7 @@ def test_finviz_equity_profile_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_finviz_compare_groups_fetcher(credentials=test_credentials): + """Test Finviz Compare Groups Fetcher.""" params = {"group": "country", "metric": "performance"} fetcher = FinvizCompareGroupsFetcher() diff --git a/openbb_platform/providers/fmp/__init__.py b/openbb_platform/providers/fmp/__init__.py index e69de29bb2d..a49b8af8321 100644 --- a/openbb_platform/providers/fmp/__init__.py +++ b/openbb_platform/providers/fmp/__init__.py @@ -0,0 +1 @@ +"""FMP Provider.""" diff --git a/openbb_platform/providers/fmp/openbb_fmp/__init__.py b/openbb_platform/providers/fmp/openbb_fmp/__init__.py index e8602091d5e..d822dcbee4f 100644 --- a/openbb_platform/providers/fmp/openbb_fmp/__init__.py +++ b/openbb_platform/providers/fmp/openbb_fmp/__init__.py @@ -40,6 +40,7 @@ from openbb_fmp.models.etf_search import FMPEtfSearchFetcher from openbb_fmp.models.etf_sectors import FMPEtfSectorsFetcher from openbb_fmp.models.executive_compensation import FMPExecutiveCompensationFetcher from openbb_fmp.models.financial_ratios import FMPFinancialRatiosFetcher +from openbb_fmp.models.forward_eps_estimates import FMPForwardEpsEstimatesFetcher from openbb_fmp.models.historical_dividends import FMPHistoricalDividendsFetcher from openbb_fmp.models.historical_employees import FMPHistoricalEmployeesFetcher from openbb_fmp.models.historical_eps import FMPHistoricalEpsFetcher @@ -108,6 +109,7 @@ fmp_provider = Provider( "EtfSectors": FMPEtfSectorsFetcher, "ExecutiveCompensation": FMPExecutiveCompensationFetcher, "FinancialRatios": FMPFinancialRatiosFetcher, + "ForwardEpsEstimates": FMPForwardEpsEstimatesFetcher, "HistoricalDividends": FMPHistoricalDividendsFetcher, "HistoricalEmployees": FMPHistoricalEmployeesFetcher, "HistoricalEps": FMPHistoricalEpsFetcher, diff --git a/openbb_platform/providers/fmp/openbb_fmp/models/currency_snapshots.py b/openbb_platform/providers/fmp/openbb_fmp/models/currency_snapshots.py index 97ea456eb4b..6276e23ed73 100644 --- a/openbb_platform/providers/fmp/openbb_fmp/models/currency_snapshots.py +++ b/openbb_platform/providers/fmp/openbb_fmp/models/currency_snapshots.py @@ -2,7 +2,10 @@ # pylint: disable=unused-argument -from datetime import datetime +from datetime import ( + datetime, + timezone, +) from typing import Any, Dict, List, Optional from openbb_core.provider.abstract.fetcher import Fetcher @@ -11,7 +14,7 @@ from openbb_core.provider.standard_models.currency_snapshots import ( CurrencySnapshotsQueryParams, ) from openbb_core.provider.utils.errors import EmptyDataError -from openbb_core.provider.utils.helpers import amake_request +from openbb_core.provider.utils.helpers import amake_request, safe_fromtimestamp from pandas import DataFrame, concat from pydantic import Field, field_validator @@ -85,7 +88,6 @@ class FMPCurrencySnapshotsFetcher( **kwargs: Any, ) -> List[Dict]: """Extract the data from the FMP endpoint.""" - api_key = credentials.get("fmp_api_key") if credentials else "" url = f"https://financialmodelingprep.com/api/v3/quotes/forex?apikey={api_key}" @@ -99,7 +101,6 @@ class FMPCurrencySnapshotsFetcher( **kwargs: Any, ) -> List[FMPCurrencySnapshotsData]: """Filter by the query parameters and validate the model.""" - if not data: raise EmptyDataError("No data was returned from the FMP endpoint.") @@ -143,7 +144,7 @@ class FMPCurrencySnapshotsFetcher( if len(temp) > 0: # Convert the Unix timestamp to a datetime. temp.timestamp = temp.timestamp.apply( - lambda x: datetime.fromtimestamp(x) + lambda x: safe_fromtimestamp(x, tz=timezone.utc) ) new_df = concat([new_df, temp]) if len(new_df) == 0: diff --git a/openbb_platform/providers/fmp/openbb_fmp/models/equity_quote.py b/openbb_platform/providers/fmp/openbb_fmp/models/equity_quote.py index b5511730755..3830466770a 100644 --- a/openbb_platform/providers/fmp/openbb_fmp/models/equity_quote.py +++ b/openbb_platform/providers/fmp/openbb_fmp/models/equity_quote.py @@ -1,8 +1,14 @@ """FMP Equity Quote Model.""" +# pylint: disable=unused-argument + import asyncio -from datetime import datetime, timezone -from typing import Any, Dict, List, Optional +from datetime import ( + date as dateType, + datetime, + timezone, +) +from typing import Any, Dict, List, Optional, Union from warnings import warn from openbb_core.provider.abstract.data import ForceInt @@ -12,7 +18,7 @@ from openbb_core.provider.standard_models.equity_quote import ( EquityQuoteQueryParams, ) from openbb_core.provider.utils.errors import EmptyDataError -from openbb_core.provider.utils.helpers import amake_request +from openbb_core.provider.utils.helpers import amake_request, safe_fromtimestamp from openbb_fmp.utils.helpers import get_querystring, response_callback from pydantic import Field, field_validator @@ -63,22 +69,22 @@ class FMPEquityQuoteData(EquityQuoteData): @field_validator("last_timestamp", mode="before", check_fields=False) @classmethod - def validate_last_timestamp(cls, v): # pylint: disable=E0213 + def validate_last_timestamp(cls, v: Union[str, int]) -> Optional[dateType]: """Return the date as a datetime object.""" if v: v = int(v) if isinstance(v, str) else v - return datetime.fromtimestamp(int(v), tz=timezone.utc) + return safe_fromtimestamp(v, tz=timezone.utc) return None @field_validator("earnings_announcement", mode="before", check_fields=False) @classmethod - def timestamp_validate(cls, v): # pylint: disable=E0213 + def timestamp_validate(cls, v: str) -> Optional[dateType]: """Return the datetime string as a datetime object.""" if v: dt = datetime.strptime(v, "%Y-%m-%dT%H:%M:%S.%f%z") dt = dt.replace(microsecond=0) timestamp = dt.timestamp() - return datetime.fromtimestamp(timestamp, tz=timezone.utc) + return safe_fromtimestamp(timestamp, tz=timezone.utc) return None @field_validator("change_percent", mode="after", check_fields=False) @@ -115,7 +121,7 @@ class FMPEquityQuoteFetcher( symbols = query.symbol.split(",") - results = [] + results: list = [] async def get_one(symbol): """Get data for one symbol.""" diff --git a/openbb_platform/providers/fmp/openbb_fmp/models/etf_holdings.py b/openbb_platform/providers/fmp/openbb_fmp/models/etf_holdings.py index f2dd9a40662..6c6566828de 100644 --- a/openbb_platform/providers/fmp/openbb_fmp/models/etf_holdings.py +++ b/openbb_platform/providers/fmp/openbb_fmp/models/etf_holdings.py @@ -137,7 +137,7 @@ class FMPEtfHoldingsData(EtfHoldingsData): def replace_empty(cls, v): """Replace empty strings and 0s with None.""" if isinstance(v, str): - return v if v not in ("", "0") else None + return v if v not in ("", "0", "-") else None if isinstance(v, (float, int)): return v if v and v not in (0.0, 0) else None return v if v else None diff --git a/openbb_platform/providers/fmp/openbb_fmp/models/etf_holdings_performance.py b/openbb_platform/providers/fmp/openbb_fmp/models/etf_holdings_performance.py index ef7411940c4..0a6f18b8339 100644 --- a/openbb_platform/providers/fmp/openbb_fmp/models/etf_holdings_performance.py +++ b/openbb_platform/providers/fmp/openbb_fmp/models/etf_holdings_performance.py @@ -54,7 +54,7 @@ class FMPEtfHoldingsPerformanceFetcher( # Split into chunks of 500 chunks = [holdings_list[i : i + 500] for i in range(0, len(holdings_list), 500)] # Get price performance for the holdings - holdings_performance: list = [] + holdings_performance: List[Dict] = [] for holding_chunk in chunks: holdings_str = ( ",".join(holding_chunk) if len(holding_chunk) > 1 else holding_chunk[0] diff --git a/openbb_platform/providers/fmp/openbb_fmp/models/forward_eps_estimates.py b/openbb_platform/providers/fmp/openbb_fmp/models/forward_eps_estimates.py new file mode 100644 index 00000000000..f0e2c5cdf60 --- /dev/null +++ b/openbb_platform/providers/fmp/openbb_fmp/models/forward_eps_estimates.py @@ -0,0 +1,153 @@ +"""FMP Forward EPS Model.""" + +# pylint: disable=unused-argument + +import asyncio +from datetime import datetime +from typing import Any, Dict, List, Literal, Optional +from warnings import warn + +from openbb_core.provider.abstract.fetcher import Fetcher +from openbb_core.provider.standard_models.forward_eps_estimates import ( + ForwardEpsEstimatesData, + ForwardEpsEstimatesQueryParams, +) +from openbb_core.provider.utils.descriptions import QUERY_DESCRIPTIONS +from openbb_core.provider.utils.errors import EmptyDataError +from openbb_core.provider.utils.helpers import amake_request +from openbb_fmp.utils.helpers import create_url, response_callback +from pydantic import Field, field_validator + + +class FMPForwardEpsEstimatesQueryParams(ForwardEpsEstimatesQueryParams): + """FMP Forward EPS Query. + + Source: https://site.financialmodelingprep.com/developer/docs/analyst-estimates-api/ + """ + + __json_schema_extra__ = {"symbol": ["multiple_items_allowed"]} + + __alias_dict__ = {"fiscal_period": "period"} + + fiscal_period: Literal["annual", "quarter"] = Field( + default="annual", + description="The future fiscal period to retrieve estimates for.", + ) + limit: Optional[int] = Field( + default=None, description=QUERY_DESCRIPTIONS.get("limit", "") + ) + include_historical: bool = Field( + default=False, + description="If True, the data will include all past data and the limit will be ignored.", + ) + + @field_validator("symbol", mode="before", check_fields=False) + @classmethod + def check_symbol(cls, value): + """Check the symbol.""" + if not value: + raise RuntimeError("Error: Symbol is a required field for FMP.") + return value + + +class FMPForwardEpsEstimatesData(ForwardEpsEstimatesData): + """FMP Forward EPS Data.""" + + __alias_dict__ = { + "number_of_analysts": "numberAnalystsEstimatedEps", + "high_estimate": "estimatedEpsHigh", + "low_estimate": "estimatedEpsLow", + "mean": "estimatedEpsAvg", + } + + +class FMPForwardEpsEstimatesFetcher( + Fetcher[ + FMPForwardEpsEstimatesQueryParams, + List[FMPForwardEpsEstimatesData], + ] +): + """Transform the query, extract and transform the data from the FMP endpoints.""" + + @staticmethod + def transform_query(params: Dict[str, Any]) -> FMPForwardEpsEstimatesQueryParams: + """Transform the query params.""" + return FMPForwardEpsEstimatesQueryParams(**params) + + @staticmethod + async def aextract_data( + query: FMPForwardEpsEstimatesQueryParams, + credentials: Optional[Dict[str, str]], + **kwargs: Any, + ) -> List[Dict]: + """Return the raw data from the FMP endpoint.""" + api_key = credentials.get("fmp_api_key") if credentials else "" + + symbols = query.symbol.split(",") # type: ignore + + results: List[Dict] = [] + + async def get_one(symbol): + """Get data for one symbol.""" + url = create_url( + 3, f"analyst-estimates/{symbol}", api_key, query, ["symbol"] + ) + result = await amake_request( + url, response_callback=response_callback, **kwargs + ) + if not result or len(result) == 0: + warn(f"Symbol Error: No data found for {symbol}") + if result: + results.extend(result) + + await asyncio.gather(*[get_one(symbol) for symbol in symbols]) + + if not results: + raise EmptyDataError("No data returned for the given symbols.") + + return results + + @staticmethod + def transform_data( + query: FMPForwardEpsEstimatesQueryParams, data: List[Dict], **kwargs: Any + ) -> List[FMPForwardEpsEstimatesData]: + """Return the transformed data.""" + + symbols = query.symbol.split(",") if query.symbol else [] + cols = [ + "symbol", + "date", + "estimatedEpsAvg", + "estimatedEpsHigh", + "estimatedEpsLow", + "numberAnalystsEstimatedEps", + ] + year = datetime.now().year + results: List[FMPForwardEpsEstimatesData] = [] + for item in sorted( + data, + key=lambda item: ( # type: ignore + ( + symbols.index(item.get("symbol")) if item.get("symbol") in symbols else len(symbols), # type: ignore + item.get("date"), + ) + if symbols + else item.get("date") + ), + ): + temp: Dict[str, Any] = {} + for col in cols: + temp[col] = item.get(col) + + if ( + query.include_historical is False + and datetime.strptime(temp["date"], "%Y-%m-%d").year < year + ): + continue + results.append(FMPForwardEpsEstimatesData.model_validate(temp)) + + return ( + results[: query.limit] + if query.limit and query.include_historical is False + else results + ) diff --git a/openbb_platform/providers/fmp/openbb_fmp/models/key_executives.py b/openbb_platform/providers/fmp/openbb_fmp/models/key_executives.py index 2329c7a7603..ab0f11d3283 100644 --- a/openbb_platform/providers/fmp/openbb_fmp/models/key_executives.py +++ b/openbb_platform/providers/fmp/openbb_fmp/models/key_executives.py @@ -1,13 +1,18 @@ """FMP Key Executives Model.""" -from datetime import datetime -from typing import Any, Dict, List, Optional +# pylint: disable=unused-argument + +from datetime import ( + date as dateType, +) +from typing import Any, Dict, List, Optional, Union from openbb_core.provider.abstract.fetcher import Fetcher from openbb_core.provider.standard_models.key_executives import ( KeyExecutivesData, KeyExecutivesQueryParams, ) +from openbb_core.provider.utils.helpers import safe_fromtimestamp from openbb_fmp.utils.helpers import get_data_many from pydantic import field_validator @@ -24,9 +29,12 @@ class FMPKeyExecutivesData(KeyExecutivesData): @field_validator("titleSince", mode="before", check_fields=False) @classmethod - def time_validate(cls, v): # pylint: disable=E0213 + def time_validate(cls, v: Union[float, int]) -> Optional[dateType]: """Return the date as a datetime object.""" - return datetime.fromtimestamp(v / 1000) + if v: + v = v / 1000 + return safe_fromtimestamp(v) + return v # type: ignore class FMPKeyExecutivesFetcher( diff --git a/openbb_platform/providers/fmp/openbb_fmp/models/market_indices.py b/openbb_platform/providers/fmp/openbb_fmp/models/market_indices.py index 7d860c4955d..15e4bb6719c 100644 --- a/openbb_platform/providers/fmp/openbb_fmp/models/market_indices.py +++ b/openbb_platform/providers/fmp/openbb_fmp/models/market_indices.py @@ -1,5 +1,7 @@ """FMP Market Indices Model.""" +# pylint: disable=unused-argument + from datetime import datetime from typing import Any, Dict, List, Literal, Optional diff --git a/openbb_platform/providers/fmp/openbb_fmp/models/market_snapshots.py b/openbb_platform/providers/fmp/openbb_fmp/models/market_snapshots.py index 89bdff1f42e..a1a00e372e4 100644 --- a/openbb_platform/providers/fmp/openbb_fmp/models/market_snapshots.py +++ b/openbb_platform/providers/fmp/openbb_fmp/models/market_snapshots.py @@ -1,8 +1,11 @@ """FMP Market Snapshots Model.""" +# pylint: disable=unused-argument + from datetime import ( date as dateType, datetime, + timezone, ) from typing import Any, Dict, List, Optional, Union @@ -13,6 +16,7 @@ from openbb_core.provider.standard_models.market_snapshots import ( MarketSnapshotsData, MarketSnapshotsQueryParams, ) +from openbb_core.provider.utils.helpers import safe_fromtimestamp from openbb_fmp.utils.definitions import EXCHANGES from openbb_fmp.utils.helpers import get_data from pydantic import Field, field_validator @@ -87,14 +91,20 @@ class FMPMarketSnapshotsData(MarketSnapshotsData): @field_validator("last_price_timestamp", mode="before", check_fields=False) @classmethod - def validate_timestamp(cls, v): + def validate_timestamp(cls, v: Union[str, int, float]) -> Optional[dateType]: """Validate the timestamp.""" + if isinstance(v, str): + try: + v = float(v) + except ValueError: + return None + if isinstance(v, (int, float)) and v != 0: try: - v = datetime.fromtimestamp(v) - if v.hour == 0 and v.minute == 0 and v.second == 0: - v = v.date() - return v + v = safe_fromtimestamp(v, tz=timezone.utc) # type: ignore + if v.hour == 0 and v.minute == 0 and v.second == 0: # type: ignore + v = v.date() # type: ignore + return v # type: ignore except ValueError: return None return None diff --git a/openbb_platform/providers/fmp/openbb_fmp/models/price_performance.py b/openbb_platform/providers/fmp/openbb_fmp/models/price_performance.py index 9a90bd7c7ea..aee89b084fb 100644 --- a/openbb_platform/providers/fmp/openbb_fmp/models/price_performance.py +++ b/openbb_platform/providers/fmp/openbb_fmp/models/price_performance.py @@ -9,7 +9,7 @@ from openbb_core.provider.standard_models.recent_performance import ( RecentPerformanceData, RecentPerformanceQueryParams, ) -from openbb_fmp.utils.helpers import create_url, get_data_many +from openbb_fmp.utils.helpers import create_url, get_data_urls from pydantic import Field, model_validator @@ -71,14 +71,23 @@ class FMPPricePerformanceFetcher( ) -> List[Dict]: """Return the raw data from the FMP endpoint.""" api_key = credentials.get("fmp_api_key") if credentials else "" - - url = create_url( - version=3, - endpoint=f"stock-price-change/{query.symbol}", - api_key=api_key, - exclude=["symbol"], - ) - return await get_data_many(url, **kwargs) + symbols = query.symbol.upper().split(",") + symbols = list(dict.fromkeys(symbols)) + chunk_size = 200 + chunks = [ + symbols[i : i + chunk_size] for i in range(0, len(symbols), chunk_size) + ] + urls = [ + create_url( + version=3, + endpoint=f"stock-price-change/{','.join(chunk)}", + api_key=api_key, + exclude=["symbol"], + ) + for chunk in chunks + ] + data = await get_data_urls(urls, **kwargs) + return data @staticmethod def transform_data( @@ -88,7 +97,8 @@ class FMPPricePerformanceFetcher( ) -> List[FMPPricePerformanceData]: """Return the transformed data.""" - symbols = query.symbol.split(",") + symbols = query.symbol.upper().split(",") + symbols = list(dict.fromkeys(symbols)) if len(data) != len(symbols): data_symbols = [d["symbol"] for d in data] missing_symbols = [ diff --git a/openbb_platform/providers/fmp/openbb_fmp/models/price_target_consensus.py b/openbb_platform/providers/fmp/openbb_fmp/models/price_target_consensus.py index a2b58c79fcc..c087bed700f 100644 --- a/openbb_platform/providers/fmp/openbb_fmp/models/price_target_consensus.py +++ b/openbb_platform/providers/fmp/openbb_fmp/models/price_target_consensus.py @@ -1,5 +1,7 @@ """FMP Price Target Consensus Model.""" +# pylint: disable=unused-argument + import asyncio from typing import Any, Dict, List, Optional from warnings import warn @@ -12,6 +14,7 @@ from openbb_core.provider.standard_models.price_target_consensus import ( from openbb_core.provider.utils.errors import EmptyDataError from openbb_core.provider.utils.helpers import amake_request from openbb_fmp.utils.helpers import create_url, response_callback +from pydantic import field_validator class FMPPriceTargetConsensusQueryParams(PriceTargetConsensusQueryParams): @@ -22,6 +25,14 @@ class FMPPriceTargetConsensusQueryParams(PriceTargetConsensusQueryParams): __json_schema_extra__ = {"symbol": ["multiple_items_allowed"]} + @field_validator("symbol", mode="before", check_fields=False) + @classmethod + def check_symbol(cls, value): + """Check the symbol.""" + if not value: + raise RuntimeError("Error: Symbol is a required field for FMP.") + return value + class FMPPriceTargetConsensusData(PriceTargetConsensusData): """FMP Price Target Consensus Data.""" @@ -49,8 +60,8 @@ class FMPPriceTargetConsensusFetcher( """Return the raw data from the FMP endpoint.""" api_key = credentials.get("fmp_api_key") if credentials else "" - symbols = query.symbol.split(",") - results = [] + symbols = query.symbol.split(",") # type: ignore + results: List[Dict] = [] async def get_one(symbol): """Get data for one symbol.""" diff --git a/openbb_platform/providers/fmp/openbb_fmp/utils/__init__.py b/openbb_platform/providers/fmp/openbb_fmp/utils/__init__.py index e69de29bb2d..9d4fc004b59 100644 --- a/openbb_platform/providers/fmp/openbb_fmp/utils/__init__.py +++ b/openbb_platform/providers/fmp/openbb_fmp/utils/__init__.py @@ -0,0 +1 @@ +"""FMP utils.""" diff --git a/openbb_platform/providers/fmp/openbb_fmp/utils/helpers.py b/openbb_platform/providers/fmp/openbb_fmp/utils/helpers.py index 26d59ac562c..c37c5718cdc 100644 --- a/openbb_platform/providers/fmp/openbb_fmp/utils/helpers.py +++ b/openbb_platform/providers/fmp/openbb_fmp/utils/helpers.py @@ -17,8 +17,7 @@ from pydantic import BaseModel async def response_callback( response: ClientResponse, _: ClientSession ) -> Union[Dict, List[Dict]]: - """Callback for make_request.""" - + """Use callback for make_request.""" data = await response.json() if isinstance(data, dict) and "Error Message" in data: raise RuntimeError(f"FMP Error Message -> {data['Error Message']}") diff --git a/openbb_platform/providers/fmp/poetry.lock b/openbb_platform/providers/fmp/poetry.lock index 1f872410758..45aff8d211b 100644 --- a/openbb_platform/providers/fmp/poetry.lock +++ b/openbb_platform/providers/fmp/poetry.lock @@ -697,13 +697,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1416,4 +1416,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e5a1c1f22e0b8e42343cef04f6f23281c7d6441df13f2be91584098c856ab1f0" +content-hash = "ca421fe0dbae56150a2fc3a7978ad65f3dd4e70025bc4da4a7f1338b8eca522c" diff --git a/openbb_platform/providers/fmp/pyproject.toml b/openbb_platform/providers/fmp/pyproject.toml index e9ac8ffb1b1..bed4c2ffe21 100644 --- a/openbb_platform/providers/fmp/pyproject.toml +++ b/openbb_platform/providers/fmp/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-fmp" -version = "1.1.4" +version = "1.1.5" description = "FMP extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_fmp" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/providers/fmp/tests/__init__.py b/openbb_platform/providers/fmp/tests/__init__.py index e69de29bb2d..78e9c51c609 100644 --- a/openbb_platform/providers/fmp/tests/__init__.py +++ b/openbb_platform/providers/fmp/tests/__init__.py @@ -0,0 +1 @@ +"""FMP tests.""" diff --git a/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_equity_forward_eps_fetcher.yaml b/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_equity_forward_eps_fetcher.yaml new file mode 100644 index 00000000000..560c0de0adc --- /dev/null +++ b/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_equity_forward_eps_fetcher.yaml @@ -0,0 +1,269 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://financialmodelingprep.com/api/v3/analyst-estimates/AAPL?apikey=MOCK_API_KEY&include_historical=False&period=annual + response: + body: + string: !!binary | + H4sIAAAAAAAAA8WcTY8cxw2G7/4Vgs7eQZH1xcpNBwEJYARBcgxykKOFY8CSjUh2YgT573k5293T + 02RX1SARsrJ80NR2dVfzIV+yWPPnr169+hf+vnr1+tOvH7798YfXv3n1+s2bP3zz+uuXf33/7vOz + /hsHlqfQnmJYP3n+9Pn7D/j0/R+ff3n++PPzNz/+AwNziiwllthqPBn42++/+5uOFAoxUyEqcjLy + zS/f6cDcpJVw/TkOfPvt95/fv3uZmkprITWOjbM/bpmZhCrmJmZhf+DLxFRzaC2mksS94DJtDngG + qTHYJ9ZR66SFQi015iTNG7ZMmTNTSVliNs/6++fPv/v41x8/LCtNWOhKIrG0cjp0nTylJliayoFO + xy53EAWDSglVzGv503fv3v7zp+ePn5ZbiCUQtdyIzVVvQ5dbiJIpUcavmDW/jX25hViJuMVcUjUr + 9dOnlzFyqcn5cJmsXWBUzdw/BrzcuFxS4LZe4OPPH759/vubj+9++PXT57cHG9QlCd7AT293l8Wo + gjH//voBnuoMTwkcYS0kSTXrduApwhj0NWc+G7nwRJxjmuAp5xw5wxjZruQdT6XE2GKQEIwl3vGE + dy81F9ylfbE3nmKFXWfYX3RB2Uy6pkyUYIHuxZYpEwcpWWqTc8Nf5qWWYHQwfjlHb508hiilJcIv + jHjiBIdYcHE292l44lawPBg7wVPmXFif39yB4UmdceYSHHe38lQvYt/dxpNcOOVqX8fKU71k3Pdq + JSOeqjfuiFN+FKcyhRNzqaExpzQIT8AoxKZeUMx7u8MpRQQo2EMT67LvcIpMAosBUNZz3eGUKBaY + TAjVmMEdTrEw8ATFzb3gataVakqIdz7t66TwCZQRZtna0w4nDuC3cm2WdINT1EhGanxjnGKtCUQX + 62mOOIFohDH9zzzOEScWBLJGmWz4NjhxayVmvJwyDE8Mi4AoiIggHZxqxvvpEZW8T1ec8Cra+vJH + OJEbx448UXwUqDwDlLqWBsNujk8/AIUQAY/dRIox13ugYIsFL67U2gcKnrVCa0pxpMAdUBH3CKEU + 8YK7QHEL8A9CTqzdA6XyCBQXdqPdBhTVptaXHDO5AUUJakfUf4yAapCFBfqpdtDb5maOQR/ZxsYj + T6FClsLTBBrzVCJ4DpBOnaEbT7gJqiXZRTI8KU3CFKxu2fFEkDUeb8t8AM6q75WncpllaZuiy1Kk + R1lKUyxhETILHJycEbKyFDSGIS8JVn/csRQFaj5BqUjrs4S4RFwRTc6C2C5OCN4YaDqBbmUJ0gRD + IwJPh6WQoXU0hemzhB/E48q5G5xgyHgMPIPNXI4sQWI2QNw61G1zJ8UdiNpsxLAU4DsQxsSGWsNS + jpEoAxBj1JalkiuUOLUeogtLGekCMlGq56lTgVjLVtTsWXJJ3FhyGXFgilN5U+RHYYpzMKWUsHAF + SUIfJgQQJDDIz5GhDmDKcL4TiRPBDgrXyu1EwN0SJ1WiCPbxJMPacnJVowlpRKcQ0ZCJV6SVbFOd + u7ypxSskjV2At6wlNaix5OB7YElCVfWLn3PqbjExtHxdwWEZAh4OscZda8NS0PyYtVYzZCmGjPcS + sQqdFGtlKQmCUoHM6LCUkJl3KhHlAgt0nNsNJ8YTzlYivlR44jmiCGYhQsj1+kQllRQlaq7Vz50g + HWstCBJZ3CixEYVcCJk8rLucVBhWCwPthJiTYZBdojhjanhBxLEOUQHqrWZNenpExQynT8COekTh + tip8Euz6vGSwyH94BRgNVuacvVt00gSrkVMrOxDVIC00xauhkw0tyy1IBgucxExwqrXVpEpzWIcA + dqphW6QeUNCtVtTsgcLzFi96vdx7viAl2GTvCCiK3kCTOz1cjKApoLS+ppZNVpwdQxScBF6KDu0D + hRChmqs4VrYHSrSyDZMVK5UOcg8KRfDKYuyXyoE7kiwVam5ovBk2waGyrRffqT3YtOZE+P85TzBn + eNaKn1HihFwNsggxz9Zdjjg1ofjytKP4JIBZY7dTRzI0JUG0id6dWpoY2hoiA4pzRBMgLVoM8RZz + pSlfwHvqhCfQUtkpoN5ogtfP0zRNVfYoPUpTmKEJLpPUMzDbBPmeJvhBDepMTmH7jia8C+iFBOXv + W/VKUwZGWruVM+jWog9GpZZydBTFDqYaS0A8AUtuDHuZE9eBiEFuZ935jiU4DOYInxs6RYiCPB1O + E1HuPIYsk0ITaZFOxjWIotks6GC7dAeUdOMi6cZQGG44aclTXZKT4VmUQopImRLZRNWgpMIiN9UO + pyjFC6fivJANpXhBwpvPE6d4uW2TjUDa8q8uSPzolhO1KZCyFsw0gtgXcgCpwKIbwi1Z13YPUoaU + koqAF9zNmhUkLHAEnADuRA6ufpobrDVlppNxC0gQjdwU4E6BHL4ZlEDF+IyvIMVaELrAiRswV5AS + FC+As1u8BiRVyIGc1MCABM6DFiatSDAgJawvvOAMSE3r/Zl6QzeQsNw14uE7oW4FCdksoBd3M2mx + hUvDW+6CFAo7y7yCxBe4n9m9pm19/7cCj6aaITiXUqF4a7C58YEkDAsC/VRsZnxPUlGr100Y66zv + SIK2FFxRzgjZFI9WiwCcU/LZkSSk9UZi771sJMGYcWeJozWqPUnSGC4jwpt2SIKyw5RV7NbNkaTc + tHZcg00qDEkCM8YKZ6uYjiTVpNlXdBINSxIeV4sAEyRRa7DsGsN4k0n31JFnB2cB9iTF4myl70nS + nL1HEsc6G5SmSHoYpKkuCGi6qt0jIZ0WFFaQVDs1gTy3BZ57kICchhv8OSlkLyCFrHoD5nACyApS + EN3tRIbbrYsDWzx0QBbeqTsgJCFiwrK7HUWI0QKXob1RHZAQPCpUWLKWfAApStYWoVxspncEKVes + B5w8zH4AUoKBaZk7pGEVDyICAqHBpMfND9AbRWuOwQppAxLEe2mtse072oHESRwdvYHEl5i9dpQb + SFRoq1qMQNqI7MekR6t4NNUBgWgOTa4pDY1iEnQMcmcJYVB0YFKjFm4n0WFLk6rEq7d2ZPZdmoTg + Fq+uulvDQ8jSXedarG3tUCpawEi1+ZSvKAWYCSPi2AryDSXgAYcMC7WXOqIEg0fy1mpn5IoSvDx8 + le4Uj1BKiB0JF52oOBDUmhYG87ggjkWGB8mq8cYoURYgl2x70g6lUKrbZ7ShRFoBPEWJLvDewS0k + OCi5MvBIUnsUpKnOB1YVk3X3flQO58S6aS7N6Ri5BylGRq6CJc7d6h3EndZy00lrwU7cgUn1f06v + yb24o6ANfP4u1AKvAhJgg3bzfweS7sIELfH65cIlJolu0YaJ0p22D+WC4N+pbq/ijkOIyPjJ3t9R + 3EFbtYwA2ysMrCBxwNiKZZwASSgkOLjY0YwrSAFqobnbebuYJGzr73cxCRKhJ+6opTQL0pcRd1Nt + D5S0joBEZZwlYeGiboQXKzzuQCJEmqJ9OvGskLDYFyhC7gCF0u96qNBPUBylnnWWL4YNgkSQ/fdA + QoKMDInzya1t5owYrSlcL0tC5IAS0272objDUyJwSOsotmVm3WWGYQrucgCSKsBSmxSb7R9BglAt + 2phgt/ksRxEuECG72LU2HCmfMAlxOipXjuiSUkfZUa9viBCrJvmZ3Eh6tAmPpnodKGoHVypRrB4+ + EBSS2nvTvogBQXBRUIpNQjc9uvZgq2XZpuk7gopW5sGZ+DXtlSBkH3DLfNZLu2Yq1zylBb+2sSUp + mqJk7eg+JyiJZicwo2F6hPCtxewaOi2qK0ERjAvr/umIoALtF5h4giCoDQTCZq9pCYIuRjDS4veQ + oFAhS7Rzwi7SjaDo7H/vCLKmtCdoFqCpZiEKjwI01dqgm/cZbiw7CcA9QFoHg0lBMw/qC1rJa9py + n6x2uA9BVDJerlPePYQg5KhVjyh0tVwJMBJcjHw2ljkh5LXAQI6Q34UgaD0tMLBTQbqFIC031+R1 + ehxDkFanE1x1B7UV3UBaJxEnZz8mRSTa7lGclgEDEKhI166UCYCwQiUgWI7LCyEWZMig2AsjK0BO + 3/GOH6dL7MYPzyo4P1QZgB7eM5pqZUC41uoqbG+QCxGSCOj0rH63z0/Iuk0LZWaPt+35YWSbTTcv + z3ryVqesexNJt0tPxi0eOUFRQVF4Lm/jR1sYEuJe84PeMiMimfp3JGCdABRx/0GbwK3aOfCj9QRt + XHO6FI/8cGvQb3pKYlSfg3cqOepZuyE/mSA1tUF53PxdVZNG73jlEZ9rbaZqKD+lJ1y8raBlpnBx + rGOFJ1y2kwZDeL5Q9JnqXICEilD6es61Dw80FFwNRPTpWYtlVWOD3UEhOUcgd+hAMSZk9BDb/aY6 + TbiCnsdwRMIOHZIYAG0o/vbPKlUBhFZNnAblGzqM68CtZq/Ra0MHaU/OpWrlboQO3L6Wadg2BR7R + IYTFqn16nfO3y/QRkhAhyvEUR3S0MQqY14ljfXhuPDQ54fuIThJ1uNrG2EHH1gr37HSqB+ESp9mZ + K2c/2uYdppoVIlJpqAWh033T1f+3jKFYWpsr3rGT9BgEMztH0fbsVCQ8JMW52h06RCpiauN++5zm + OxhS/PLzMiMjnAjiU7cXNeBK0HZdzabbJlqq6qQni2NiPfsLMXTOwuqZRCACtftwQE1RXYc3YYPY + ERrtp9JTdranykADWrF28GTDeAPHA68i4uws3KBxzgvuqekcjsDvTm8CTbVy06O16zDXmAAnk6Me + zxp2csO9Nh036DuFpCsFSid3qUnwmNpdeUbDak0xiX+i4C7VITU4r1Vyl+lcj3WcTbgmOnqQsJ5N + t+Q5eu6EvMmOaQ7DJ+uJkmFjT9JKoTvtMckJEbmf9xCGmRL06zecyQ0z8fpdGd7shhnOCX7FW8Md + M70iGz4+bzHFh24A8Zhx4fqvm3nCVA8CaWOw/rHe8FBjk6ANW805UXnc7SlwmsnpnL9jJtC1IW9Q + H0Diz3o6yf+qkq2+hqDVGOK8I9GuYUY7aXtfv3CNMsgdusU1jTINHvc8fGz5VNFTa52K8y2n0i9k + cZ7yWFlD3IKfT7Z6aZgJMWh53E5umQkpI9HtVrGXdwuJK+70e2Z6LQf4+LwwHS6bxh4y82UymzC1 + R6r9unrM0vEypi4Nhy8Y2M9sCLl51CbqQWYDqR3g1c/6rNdZC+k30kTb2LhnRo8xg+nYPciacP96 + +LOb1RCWonL1z7quSZQio4MGzCCjCLr500nxV01YM4Kgd2/HjAZyC/m42D0isy+qRyuT900WhhnW + BoPr9CNm8OgvA718f2UmODvjO2ac9uIdM7MZzdQxhvooMVOboRBbV00wAoaQk7fSG7ho/VZTTedS + 6mVWKOd05aWLSwMpQXHp0aKgKCvdnpwsmqF0i89NtIrkH2VdYpn2lmXqlMOWeFaSXBv9RqBoiwNr + 4B5wom1ArnOx7QO67+mtqy05V6R2yVtc2zwghf0V3mHSDy34mAHved1ZhyQJdf4g3ZdIZwhmOwNN + Rn7ycjC7Dw3ySX295+Nelg9ZTMWfwSnv2LQ17nTQalONuTNqMagW8+mgRaXEmt0n3DETc3n5Xq9z + ZpBUt+wNMbudyZ/OJDGs3Ty9gYsey7lOHeaG7GT3ghYZaFlxb/KIjKQW3Kf+fxIz1bomj/Iy1QPa + ogaZEIabnUnLvoL0o5/903WXQ0/IdLdqnmpL17S+37X2hLt7Sf97zDxlqdpj6Y9aJtTeBASIk0Hr + fFXbGuvJoGW2FrUQ4ow5gPNU9Bhsd+A6bdIK8gQ6TznFMsUOaVJf0gw8jBQKrmAi/ddkMbj3udHz + BOPvFJr14/Oa2dMDwuyRPc6v/vIfzlxfWN1UAAA= + headers: + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Headers: + - X-Requested-With, content-type, auth-token, Authorization, stripe-signature, + APPS, publicauthkey, privateauthkey + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Access-Control-Max-Age: + - '3600' + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json; charset=utf-8 + Date: + - Sat, 30 Mar 2024 22:46:13 GMT + Etag: + - W/"54dd-RwVP7Yt3i1Q5RjCW+0M4GjjHSss" + Server: + - nginx/1.18.0 (Ubuntu) + Transfer-Encoding: + - chunked + Vary: + - Accept-Encoding + X-Frame-Options: + - SAMEORIGIN + X-Powered-By: + - Express + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://financialmodelingprep.com/api/v3/analyst-estimates/MSFT?apikey=MOCK_API_KEY&include_historical=False&period=annual + response: + body: + string: !!binary | + H4sIAAAAAAAAA8WdTw8kt3HF7/4UC53tRhX/MzcfFCRAkkOcW5CDZC0UAdbKyK6dGEG+e96b6e6Z + 6aome4LIWsg6SK3hDLt+rPeKRfpff/Xhw3/jfx8+fPX5Lz9++9MfvvqbD1/94+/+9l+++vX9n373 + zZeP/GdBQvuNlN9E2f7Nx89ffvgR//a7f/7454+f/vTxH376TzyYQss1tiba+8mDf/fD9//OJ3OI + uUrCB+vJk7/98/d8MEkrcv9zfPDrb3/48t0396GDqKrkkLU2/7l15KAhVGm9dIn+g/eBg5RWc8vS + /A+8D6sFT1QJkmr2nloH1VpbbiohJjMxfOw+pNYYYy0NA5vf+k8fv/z9p9//9OM605pLzkVbjO38 + 0W3wUntqKYUu4fTZ9RuUkJKGJhLMa/nd9998/V9//Pjp8/oVSi2516Ilmk99PLp+hapJU8oRs3X+ + 7P0rlJ57jz3Fbt/3Hz+v70aXmpx/u73isKSK4HKe2IJl6QjA7b1++tOP3378j99++uYPf/n85etD + GPJx98HPXz997u3t4aH/+fUbTNUrTEVMSJKK9x3ND3plCjOGMMSrbsFM3QtTiBmNKafqwPfMFOIR + 9HWEhI3HF6YQhxKDRA2pjJgCmxxbM77kgCksDh1RheByn9oGzTHmHksScR9bh0w9IUYlNRsxR6Zi + IskVf8wHGqYQzRJ7L00N0EemIn5ILoBKzccemcoNMy5dnV9umCqaa8XSWOycG6ZENGTMV6mnTGlb + KtfPc6y0LxFgnlKFT0BM56tU6TWq8rtUlUtUIUVlvBAuyxOqoiJmU0oxnj25UoVPREyG4CzJL1Ql + LR1/NQ0nsOwBnjMzKQEcUpWwYKYQWvdz0DosfmxQAXt9SFWUgAFDrf6g65ABAY3loxc1EXWkSkoJ + GWlc9BzAbfBQSy8J6Wfwses3wFQnpArtycz2kapUS+nIfxLMNzBUIS0wt44JvH+FjKgIqWEebE7f + qcpLSbnbF/2gqi7i/fdbsCxhm4oZULF4Dx6BivFdoPIVoEJNnVkqOSngFajQMCOxQYVlIxxegAq1 + g5WGlXMCFIQNUBYs8278P4CKEDcduUesPH0BKkpvrSK+szvwFthNWovMzO5T26DAHHk28dcMgBLA + i7VDcjnPJ/dxe1QssuTpXM1tYwtis/YwZO/+BTryfBa+mTlOzFFaIeAHYu6h80Pk2xmhtyt9SF9E + kXq0bG9mAfVuFtsT8xK9/34LFSjDqzi5Dxqcyrs4pUs4pahUXpBp5scecKIQiZg4Rwe84oQUJneR + NsSpNSh7LJm1mfg60IQkmqpirTzBbluppaWcsVZXl7r7qBXGBy5JexnDhBANJUPlDrJTB0chIC3a + BebAUumxIulIHai4naVEOKXIwHHdx8cEKoQzGZ2xhLcHgYo30+aCD+4pQDuUPDdRkSg1yVC95yzp + Qlnq5Z49HS92ydpR0mV7Bf9PJL2t9OIlkuD3Q4GfjaeVht024oXFQA8+9k8Bfkcv1CSYklKvrTmi + +YWkIAjZVCD+T5DbkoRAlmDhLdZJPEgqkPHwBjRQI5JEkEQCMqIjTnaSYNcClXJSUys5kqRYNWrn + nxlJSDRYNMaP3oeHie/Fn2cDEnRb5VcYmaxd0mN5w3cQ6/OOIIUKVS09N0cx7CAJUg6WrwFIsnCd + PIepLxAc+/ua8XStHvG+0AtXeFLoD8yyKH7zhCfBqlag/rvVFC88aW9V4L2750+feCqVSzA+s588 + tk83cw7srqRhZkL858pHq6vMVkuO5Ra2nCZmgBN0IKVg6tYkPmii50MSzE5mPdCUhfxiXbCp+kgT + tWBqN/k7oQmfiM9D2OdpbQ+qu0INaswm7A1NLGyEDJEZB8+uNIE8rChwY+c0dRgep3z8gKkvuZVo + a7cbS21BHMlVlaeXctP7tT29xFJhKQxqpp0SsrtERERgrcdGxCtLCFTWt2GchizBvHb47Br8LLGz + VHMFmZRwwxpEgayEf+gS3VFX4yChI6agY9yH1hELiy2wLNnWlR8oQfPiWxXSO0EJEceAik6h54hS + VnpY/NVmiYm1dKSEEEe2ZnvHELa9IefNy+R4CJ9MKTxPTEhKIVUYSy+rrOlz4WbCIC+1hWXb84pe + XRKLRldRupSWtL2LklxCCatvDnjP3VrdA0opa8sJ9t6u6K8oJVoIEIdFc4QSlt+eWuyItCFKpbJK + l7tjxp9Rgnjj9+s6sksYK4bWm7McPKGU76VBpJzBrhMiDusQlmYrso4oYRUo3JwZbE9tvr9gEQJN + 3dYIDihFptfKspGZPYsS3oQ2zaOS326Li8BPhmiLaxalTCNbulv8Xl8KvFKudkHaUcpLS9XZ/dhQ + ygt8+p73ZyjF7D14RCm8i5L2SyjBOiOHIDOUswLdblyaFngXbdaSvqIUEAvIykj9JzXvNcI6N3+q + On78BSVEjHKhzmebvWtoN4hVaPfi77quzgHCLbZbyW+AEqQiRAUWA78qssYyVosaWqvxPOo3388U + x6LgtIgH6Rm5y6PTrBS5fyOsi88FXkmYQwj0KwIPzrQJwt9+AQelCvvcnXLfjlKCfqujrJSWmqIT + ABtKaUmIUJcQD6UrJKV3QbrUDsFilcIZwmdMiniK9RcUaT9/cvOaHSHGOq1TJX0CKVQEWO5Vz3jb + 5lrxBRssifUEzyAh3UApJG5lnIOkLTARdm1uftuiCS83IdtUxzDvIIXQCjyIpkGtbQ0Gik4MKWbe + 7OZSgkiQUga7u5svhErltts8IyUoY5Xc7GuzGGGqg95y3QwjrSVmjZiF84wUF5hSt6SwrRtLL8Wt + pa9r7QIfrS4e/1eMwrsYXeqA6BGZNyHFWDf/SlFvLOtgfic9RZ0bkpDZUocWKSgmqOLtTrofIj6t + ZJZlh9UGpLXAKmSwtbQnhlKlXgvIJCOGgsot6Vrb+GBI6QGRdpONt+MWbcC3whznMt+hvTV45das + 1Dlu0EJi47di8gbV6k27M0PjR13oeoDvSUzXIQ/g3ChKLIRi3s8tUoQDio61faJIYwlWGeytRMvz + y/plKLrU8dAgwLBU1mh96IEi6HuWj6vtE3ilCGsZ0nQJfgF5351l8QyhKpNuh4CMgLwKrTGugfcm + ERKn+YBsiTcKogSWe9yUF0tERsOvGFAU2ZLTaxpkjfug8IkJS1W8AFHAuMC3Tkt2Pcd+q/vMMxF+ + C/xZd3oNHIZY9UdOt/sSliFB1iza+3kmCkspzdncfvTjLTV3Wx18YgiLT7jqjS5Zo3d3ZfVSk0MX + aJLCHZ1J0xBeg+DNabV66ZWhmEph5dvvdNszUUFY3Va9SSYCHFlhU876+tZFL+K1Yr3tfl1jy37K + DNmcDegnhtiLwCag4mu+NUAKfiWQFVtnP2YiKJpK12arWkeIoOZqCZEVgQlEeLtYVW4bVFOKSq6l + s5P4ii1qfC34M92ODVIxnRFhc74dCwhKdzoZnygq2dv4e1CU9h84Y+jnyUOXOhugbMEPV+iZmmO7 + MATEeQfEfeJqvy/1bdzMGmCZuDEgZ6jtdrvWzn0S2yz9wpBQsoiII9EfDIEyLBew5W7u2xmKGJD+ + 2iVtY4jWQaPa2TgydNsqgCWx+dswlHNLEY7E1keODCn7e2FIbBetYSiXBoJYVZszFDNUX8HKMO1h + ZWcIJ8rJhc8MDUp01HoDevbFcAbPpR2jdzeM9FIzA9Q0VjJhb8cYnpaLhM5mzvF2ESIKPOIT/R62 + XcRx0IyVvo9L3GxyCy2yYWAET4ihSOle9+iTiMvcGGNvnwviHkERhKWY/dMcW+wkCrjimAZjhSjO + tDoFTWuFClJQ78nmCmOFYkuS8fygSrD5v8aGlVLDoEiwu8AQlU1G834g2DZqCGTL87oc8sfoTMXi + vPq9F2jpripz4HF7HI7w9HfhudS5AC1N38wm6Ak8glyC2VIbLi/wsB9BQ4UMGdcR2CykKXpbdS+Z + JxW4JLbUDTMP68s85dT9UbfMo3TU7OocwIPlAdY/cfPqHJ6QlUIHZunc8m+ZJ1ZkxJysWTCZp0jO + iFynxmYyD+Yjc9kbSLLdA7H6jCw1sEu7B8prC9QVD9TxJbJXk3mCZ8SOs7XwxM5V56NuhjIbrPou + PZd6FRKWOkgAtheM6amw6Gw97LZH44We3DsPLGXntM0LPeyfhkYRv2z2oEdhGzL9z8nW0aajMCAs + v7cD8Ug9jXm2SfBbELbX2qTcjj35h5m2VAfbBtUZ7HG2Iz1sBImUbtMCQgCRMJjspZnQoy3AKEFK + z88eaYjsvY7V1owNPcgnyCjUrPMqHJtQq3Dv4JQeXVxjtOPjbsxu+CQ3pXj4XHI9+m7bnF7qT7hJ + BRb17UbLKz4FjqFLqDLZCcp4sV2523IS77ujTQhUROF4RxVuVhM1u2/kn07FVmjFFEZ9PsqtbuUz + Q3zo3+Er8qg5QRtnDMTOkw/bB1mdGXiZLXoLdFAHZ2GWfJhRpFYFb1N82L2OlyJ22bP4VKxCyFJD + i7R+A8iBlIRfdoCP03nyaD5d3L6FDZ+9GeUXwkcu9SSknpjY2YszxqcmZbsmt76G+MB6dCpipxny + BZ9euczB906MT4e8h1mJzl7DMz6Jx7Y7YtUlY5NRDI4au++OdgXF069sXh1VDeCa2aARbcfsEZ8I + 144oa9YhmOwjmZtPCPXZRqqyTzjziPwcHzaIYNXI9jCJY3zYaIG/21K7NT48PgZN4OzhPWWfQTcC + ss/I+PzS2UcudSKkKL0irNSK6EP2SbdaLd7CuKEHjrYyuJJtEXrFRzX0jtQ3tj6h8YRmLyc9OI+6 + AfJdSDxqOMAH8dYKBIdfD9xGJNOdVzcMNn9gFWtkkWx6kAjfKkckbaek7tQNMB+CSZ5mH6wVJbfm + +EubfXholr0cF8Qb5Jhwc9ROkJN92BuHZeHc+uji7BA8ZR9HeDzwCVfrBn6aMvi828gjlzoQuEuD + QIjB6u1XfDIrwr3Reg/xSTFGJKp0WmTeFuWKVAb1flad21fkUnlrxuke67YcB8DYufU4wAcunv31 + wT8j+1AwUkFs99PnFj2cta7O0YkDPq2xiacXnRYOFDPHvek0+Mx1dPxBhujZlkANPXcbGvqoxrB9 + gcye6pqStWmGnsj+eqwzTkHnQc9g41QXx4Bu8MijqjCF51LVTd8tu8mlxgMsoA1iKznlk1d4UkNO + gThyGv9f4cGsQpWFftZvvSkKfCB19tk9Pw8fgiBFzrAi5QWexpNCgcdnRvC0qDe/MHI+eIIH0Ep1 + LrF5godHz3h5yKzxQNlWG3NRe5TD0JNvy0lSW8w90gN7ghnOanW0pacJ+7OKzX2WnoLXwfm2L8XS + kwVyWpxrAp7ocRtNd3ycvt8HPv2qdLt0ruHdXmy51HEQeDA0sUlgknkSy0w8WHXas32fsQjTI3RI + k8zDZnHQ089q0buYEd4w0Jwbq17gyYwQZFBfB97H5EHLznq0y+s2YMqFvYAn9bsteJE54fGbZfXA + DjBMCLJw4fy3skJSSrOr0wGdDrKZ0GwyPpKDeVP85GpzmQUntVs5X+ZN2MpdVZ69sD2xz2lnCI5T + 3nkC5+pO6c90IkguNRow7bBPvNpF4BUdWBms13SK4wsUYggl354cFqyVNwXQD8xOqSIDCEZtZ3uq + 2zJIZZ/xMwZ5p9KO09KMukaZlXi4vTvtjDs6SISh8lTHrGCAJQlyqTgtSUdy4P8gllKy55kO4CB3 + 3s+8TgUb93KR9voVtwPtESG1neGP4PQWamHl5bzDYCjWhlrtKjLiPWiQkXeRudReEGAkWBSLp1s3 + GzIRS3VzD+a/IMPrwKKyR2q4Q6rCsMxwJuMiNTCQwiN+Z4dWtwXwljWxsA56RHkLQWSRbajUIvcu + bg0X58io8tojqMjpFk/B90dOqrZH0zDTApRSK7ZD88gM28CFRcoZM8iGJeLp0THtdfR667JuYXQ4 + 6D58EZ6W5XHFU2RkcQ4y7tTI4naWbtjszT5Tbi61hb59m5xc6iy43YlQeKhlYnF4RxubhJ3D+q/c + JCauypN1I25AF9ZB0DoRaQh0fMN+cvPbhk3nXWZuP+ODGu5Z8LioX4DbxkM0Np5z8XvjVmokIh09 + X8N5Rg0Pg4Xgfa8jNQVBy4LJ9GIR2iCJ3sQZajAjKXrXu1pqFBkRr2100HsdvsNtIq+7lynu1Hhc + PKgZQXORmUtVgbeLApe6CRSrCxZCzbb8eiCm1CiNGyJjXxN4n9x9q2xEDA/aIUp6mXSBsoic6u2O + yBEymti4CUs96gJFRLbQ9aSBYWcms42tONWqZ2Z4nRDvmpmpM8wsp6xduHNRasy88dGWLI+ppsP+ + SHQaLI7QRCqumLP9mgaa3HgQKzrF8CM0qSuv70vOBWF/5VTj8mVSzbtHEORSHwGVLA+AOqf1D+Cw + yV94vcgYHOQu4TVPJ/uID4mmjeWgOtkIVZoQPFX8e9weEq1ywxGIDfoIKmDgdQnOa3t2NYH9ejn4 + NmpLbdAp0bvT9KjQBCmaFxdMt3HwFFtn42Br6D52zbEoawzTTRyWixP7nOfYJGrSAME8bSC4tZ7y + ksCRQnN28Z6wcTPRhs3lDdCfIdtQ0lyChkX7gNC0ZY1XaJTv83budlwKwErEywwQA0NoKm9Sp58a + 736yHQDx6emWF33GO+cm+ix37qSeKcJ1vEbrFs/k4Bq1qUX/cItRZzB3rrY06owdn/yV58lrlUcp + 31XctGcNepVNF45ftcTg9SdXGxpi8G5vP93rCtiIGfVKi38MYSPGv6f3r0bMpYaBXipPm537+y10 + mRJSmxYCeMVh7dMbE3l7RXM/7QUY+B5p7rd75oV9/LBaJ0+t0ZtTuF8xOOCFiYoXWPsPrTGLCavu + 7zvwwitT/BGPvPCyIH/YAy88RBPcsQ0vuZ/8EsMLWy2K+z0NL+BK/Hl+8GL/zwueeXEvsdp4uXwB + 9jvbnL/6t/8Fvv2Rcv5kAAA= + headers: + Access-Control-Allow-Credentials: + - 'true' + Access-Control-Allow-Headers: + - X-Requested-With, content-type, auth-token, Authorization, stripe-signature, + APPS, publicauthkey, privateauthkey + Access-Control-Allow-Methods: + - GET, POST, OPTIONS + Access-Control-Allow-Origin: + - '*' + Access-Control-Max-Age: + - '3600' + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json; charset=utf-8 + Date: + - Sat, 30 Mar 2024 22:46:13 GMT + Etag: + - W/"64fe-nzsUq//kV6VdcUG7pCMU7V7pWvE" + Server: + - nginx/1.18.0 (Ubuntu) + Transfer-Encoding: + - chunked + Vary: + - Accept-Encoding + X-Frame-Options: + - SAMEORIGIN + X-Powered-By: + - Express + status: + code: 200 + message: OK +version: 1 diff --git a/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_etf_holdings_performance_fetcher.yaml b/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_etf_holdings_performance_fetcher.yaml index 5b3be161508..5f2bdcb6659 100644 --- a/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_etf_holdings_performance_fetcher.yaml +++ b/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_etf_holdings_performance_fetcher.yaml @@ -9,58 +9,95 @@ interactions: Connection: - keep-alive method: GET - uri: https://financialmodelingprep.com/api/v3/etf-holder/SILJ?apikey=MOCK_API_KEY + uri: https://financialmodelingprep.com/api/v3/etf-holder/QQQ?apikey=MOCK_API_KEY response: body: string: !!binary | - H4sIAAAAAAAAA52a23LbyBGG7/cpUL7w1S5qzofcDQGIhIgDBYCUqFQuGJtlK2tLLlFaV5LKu6ch - ipRMzIygWdfWrjE+8GN3//13D/7+WxT9F/6Nog+b3W778OFv0YeFMW3cXlcfft8f3G6+b/fPq8iU - WZMn8D9tXqyyJkrqZnH4dTe7m9v+1x1+/ulxd/Ojf0CE0ESSw/Pd1839dlc9fv/n9h6OBUIKjp8P - f25vvnx9WGzvP21vHzZf+r8Y0xhR8Xz+fXP/5/Zhtfn22B8pSjWlSsT8+fjxx+fNw/bz09+KCPsD - kT8w+wBn//vdQjor16eQM9OUdbWOpnWRRmVe5dUUIKOiS08xly3DlGBBEcID5OORAxojRjnVykON - YmKHFlwAMqcxI0HUZnoKfZY3bReV5jxruzzxxTYxlCApVhjRIfTxyAVNJHxuIdzQOpaY2aEJZkTC - lyJFEHRiTelk82P3cHe7jZK7Hz+29/Cf+x9vpvOkXPOrtXZASiQ4I9TNyGMhlJWRCsIVZEWMZBDj - ZDUErEso29xEadZns2mjyTKrzCqrumVjonZRV23dZGlk0maY4AQxxhTkKhp8Cccjx9dAiGaCYt/X - wBi2fw1MIc05iUnY1zArBkWdJYWJyqdStpQxIRIxjAQZUB6PXMFmQiDlCTaLBZdWSqKl0kLiGIdR - mrWxZTQ83mvXx5cyLqNqsXo7reeaIY0dpJRioZWndFmMHGlNBCJCIhIjHUSaFamNFB7XjanSes/b - q1VUZZc979uss+tz7ixhggQVzKPNNNaU2Fk55lxKFOMwbYaY2Vj3oUyarJfprDNFG+VV8jbmerWm - qavxQo/iTHMfpqB2SkoIVtB2aRhlaaY2Snj8uveMiiQoJqbUhUjAHrx4Bysic1gLgrVCXLGYqCDG - M3sk4XE9zjVNynRWzlxk4C80tAsfGXWSUYYY7ws2iGw2KW1ks2U6Meu+y2TN6ARFfJJeOTUH0pMw - b/SwixEhgTXFcViCtm1jZYTnB1MIeOOl9UyWi8ItN1JSwnyYSNrlBmvBCWVgKYIwp6arTxH7Z+2h - DC0xXLZUKKgpjPTQFRyPXFmrOcbMk7UYlNXuCjChHEkmYxXm9dOFNaLpskqzLFo0WZLXy/aVuo6S - nwlCq9RteJVgVPlMfqwkt+NirRnFLNZh8tOu7Am8byS9uj6RjgYF686IcFUqR5gjrv2gjhTGWoJG - 49Bppi6sPqi+/7aJypvbm9svUfHw+U2+yfp6eq5dakspYmDrfXySu/j6qYiSmIX5vDw7RctXpprV - WZQVWdLBNG6vUvi8UiUYqWGVHo9caQsdAgvipXV4d4xBkRWRMQ5TpCQd4CZ1tnytuvGQFWsCNBwx - PWA9HrkiqzQojsfBY3DwjsgiDv6dqvg47b2P9WyVWx1C3XTLyhwkuO+n4/WIUAXF5NIjirFk3Atr - VyPNtYLpIGZhYpRdzU8pM5Bds6ohst5tA9Fg8NYYUTZEPRy5NKlfOgnkg2XU7m81FpwyGthV28yq - SPB40uTpNNvPK2PsEQH3w7irmSoulPD2Uqrtmas0IhrJmIYlbjW1DmTV9mc0vfv2OcpvP72NpojQ - TDrQhBYUEW/jpMy+KFJcC8FRfFTr97HN6iQe7g/qZNYms/y4EjzFm4IPmOCzSw7f67C17A9cacoI - Fsdp0YqKmN3kCgHipRGcB6FW2ZUZxBCeRTBmRm1kTiGLJZYIM4icHu7+CiEp155NCRFSeBooiqW2 - aw9HStJA4ZnaM3VaP5UgcIIAJdnIWUWgSbVwLXQ5FUz69rk9oL0aOYLvjuHQ9cjq2u6AVjf/2YEH - am++/TV+s6lWk2sXInxGKbFnUQ+I1B5DJhHhhMQ0zAOZJreub/vnL0v6MTP1xbxJLpwzNQO59d1E - IKcXgK+GaqViFRZDk3Z4KDsmbXLTL+Sfh5JFcQr4pDsFKvgUDRvk84ELVoBlP2akFZYfq+5kQQuD - mEY0dD9bLq9OScsku8yqpw2t1cxyGCv1giLOB5THI1dhIkSwZw8NmETbMSmMb0SFGve0XVkHzrxN - ajA866PxGb9GqFKwYS47AE2PUO0lZdqxcceMsn4VHWZ4ks3u68f64St8jBPY/iT6GP1y5sQb/jGn - ixIOH4aI2NtGqLb7gtPf/D7E1B7LuijW0co0aXa8EbXcFA4DuV6sL2Yu48oYFdxfmVTaA0mo5FJS - CHQQ5TypYjMozjnIazs1XQaJWrUDOrNET//Abx7aAsHAhFPX2oDIfsnqsehAyh2XCmBgNQqeSMCK - 269P4PlzIA/uYGRnKdct5i4R0mCaFPfWJnWoEIyvXFIZi7C1l7GvvUw/flWDtdc41Cptxco5UBOY - QZG3iRLlWB6AgSKCxjwMtU2uAXV1itqaqjNJs7w+TtTQZUZVqSzmfOEaUbTmTPtuT4DTtfICr6Ap - uKUgTFN31ohCW+leWdoxhARxaBmuhgJhFIR5xZYw+wANlSC0lDEPq86ysxbnU5IWMJ906/56s2sy - U+b7YO57aHb5JvJkfjklhdvFS479MT2uKQfEGGMdup2ulvYrsf5Cc2GS/OzFBY6r0fKSa/caHkml - mVeOCLHrLmYCxlEVeiu2bO2yu3+tqN2vRkCcXm2F3mady+SicnVTsLlC+ZaZwIrtUwumsv8R0zDW - s7ydWRdBJi/6s6ip16aAXB4X0bTjE+GMKIMmgbyZi+39pV/2ahJ8GWhae3/56+b27jB7ftyvhcqb - 2+1u1DKeMOm5bCAcKaW8HQYfjweXDYxAldIwfzRtV411n/C4ud3863HzcPcybo8CnZRpKYlzCyY5 - YcKzrgVQx9slGCHGAFSG9Ziysu5NSqhMU5j1qzYzLnfPL4qpdF03CCrwG+F0rBWU4EqR0Jujcl5b - ITd/3h1ujsZtTapZxa9cLYVxJJjX4mKH1CqYW1l/xR1EV9hXX0U+yfr++fLOzJhrBRAfyWauPKVM - cYG9RgEje56CNOv+9U0cxHh2eW29Qbm53/7cbkFxtg+bb7uRUSyvEa1cqyEJ7VJ63kQAQjsflRqL - 0NVeW1qtXptnTWPe9SKQopPmwrkKwv1FA/HRIcdyVqBeUF96y/v4OrO08XVft7ub3fi7hEk5TavC - eZspMRhZr9lBrs2skhKyk4TRzbvKRje/u3vY3m7+fWgVowgbvF4lLkKNCEXe1TNSdonhkJ8Yxyqs - /FpHO2wfv39/5+L5fMHUynV3AN2BK9/tew9o1xfO+9iH6ssksZqbSWbAmTZZNn9+p3SkihIO2SRc - UaQgMFBLfkq7yvD+HQoJrieIspza38bLK7NsluX468oJnTOydqkM4Rgx7NVQxO27O8o4wyy0z0/r - ZviW0+v7H6uJWbb9/Ks6jLjlTffDkasiKYEh34vqeIGCCKIkiWWY5JSNtSGWeWPauni62Hselt8O - JlJ81ThdDdPs+BntgNRekYQyhGSswnJ1UrSVnopTwLYuJ03W1E+E/bsSo9bpv/5Zp6sAxZXwulLk - nKgI0iLUehPFILusYZzXdZdVv9jvMWXpqkfCtDdH7XBC0piEFWJnXaJ3TbYyRf6+e7zFgibnrgFR - C6m1LzmtZOhNpt/+8X8LG5B3LzUAAA== + H4sIAAAAAAAAA51cW3PbRpN9/34Fyi/78hmZ+2XfQJC6rEmKIWlJ9tY+wBQsoQwRKpC0rWztf98e + 2oQTzfQomSROUmyb4mHfzunpwX//K8v+F35l2Ztqt6v3b/4zezNbna3f/PvHi9vqsT6+1mz6btd9 + 3mdl1z+drM2u2Trr+5W0wlJDiZAn2+awa56ccTCdLLuHqq9388Pjp7qH3yC5MkIZ9tP6rW7uH/aL + ut/U23117366yY0+mR+r/ku9v67ag7MwxoiinBrFcmF+/pbD0121r+/cz2aEibdEvKX6Ddj+798B + tEWxmL5EWzw9tXV2ud34QAnXhnNKiA90MCFAKaVSaaI4jlTnypogUmqZUpIqSmwudBLS+fW4eIl0 + fn05viwQp7oPq87Bc8TDOpgwrIYoxlXEqSoH14WhSsm5odQKng/v8M+gFrOPc8+pj9Uf3TbfdI+I + ZxmnXFKitO/ZkwlBqyURRlCFo5W5xNBC1BBuCRUyt2loZ5O159hZva+yRVvtP3f94y6MmBP4e0YJ + 8xEPJgQxk8xoTSKhLHMiRRgxU8IqpZWmEO5JiIvr86uXiEd9V92h3oXk4/KMEso8rIMJwWqU0JZa + HKrIJbNhqJRzoQWxUuSUJkE9v7o69wtU+/RQfar3WCQTbd9xIm0gkn+aEKyCSfCL1DhYlise9quS + lguupLE5SQtkhzUFKoV/IVDBhEElVjOtaAyqlGG/KkEk0xT+fE55EtTyauU12bLb7TdddvPQtfWu + gg4ULsuMUUUAmKQe5sGEhTIzRMSqMsu5DtcpaONaWQAmc66SIK9XU69MretdW4VdawxgWUJaCg/m + YEJgcmGY5VTGcLKhi77AqZhgXGsDDSoJ5vxseuu12Xr/uW2+h4EqQSmZQnfx/TmYMH8SyFUTwUlz + i4SwsIQzyhxz0jIJaDEbe8l697Xabuq77MgXs3H9tdnUSPchkJ4E6JI2fuqeTJh/CZXgo0hJBtyc + hnEbLgizgtCcpTHGxWTxEveifto1ZRcGqikXAgiw8f07mNA2q+DzDn00CFRTBCgz1FqmCcnTStT0 + 0uNQ02Z7V2eLafkS5eWEELKyH1Za+Q1WQilmETJhrFHKRtgTzaUNZyu3VgHphqKWBLEYjyZ+DHef + MPJPNBNhEjGYMIwCipKIZqo04b7KrZJO53DgGUkoy1XpsaWy2UGrWT3v9jVGD117k1BlGffQDiYE + rZZQRiH0YnCFDDcaroSkDBixyNPycz17v/L6zNtZ96mBlvp+hXQbzSSQ8JDWGUxYkjIK/YZHuDCA + pYhvJbfaMTWTk7QQ/r28mr1E+/v7Ygovz5B6JLRkoGa48qAOJgwqMUAQRYQeOqgcg6oJVDtNUqX6 + 5Xz9/iXUy+3+0CDkUCgK7wpofAYxmBCgkHBC82i6Mh1W6pxaoCdCG5NIIIpZ4VFDN5FoXF+F9+mb + qsV6KjcMwjFEDQcTghhUNwg2Hm01TCNRTI2lIByUzGka5nJWrjxyWHaPm2qHjZwYAY06h4rrU//B + hJUnbgWzKoqVKhnEygCp1MBNCKi+JKwQxuVLqBDGdYsAFdJQoCuE+E4dTBhQY6wrXVGgAgEKuhfK + GpE8T1Ou61uPP6zr75UL3d2+PzzCZ0DC2ECVISZcjE8mLIyBSIDKiVJDysKZyyBDlIYKBWGc1mmL + 2Xlg7nRfb7F0pVRBTpKAej2ZMJzAt4gxJoaTqDAzZMpN2KTWLDdplXjm1eEj4d9m63rzsO3a7v45 + jFhaSamruz7pH0xo71GQAjrSe0hubVjsQMwAKCcLc5E2cbpcLb3RxI/e03yts9Whv282VRvpQxMV + IlKDCQGtoNsaEclfhxnx8g/NATwsF0mQL668WL7otvXzt7p1QKERbat9021R2NwcB9bK5xmDCYtu + RoEr8DhuEW5GjCvXy0AfJvbf6bL0BPy0esyW9a6u+s0DdgQCZYVAYzABAXQyYaEtBDg6HtkMqdIc + yKfWWpGcpEX26N3ci+xR131ptvfZRdfewX8xtmGN1FOAFShfJxMW11yDbosB/lXbvCMfppmyVuYs + DfD1cu3597ru9/X3bAGf8rHa1Ie9y2YENriCM5B6xE/nwYTAhgIEzCQa1hrhHRR4B9AWQdIqdjH2 + hhbFYd89QgZvsnHlDgv6blPvds7tYW9LN3YJyobBhMB2zNDE6BbAFmF3U+PyBlAnU8vlxO/Jyxp6 + cu0a1t/yuJbGKHCr9g/9BhPatajgMjJxBegsLJjcoSmBKsl5KvTV6L0X6at91X86bL7skDJmpIRy + RIkNjF1PJgwrdXXuFbA03KGptm7ATEE1mbR2VYwvvQiH3tTdvzKG5ECHBCKZfpoQvJDtIHajZRu6 + GAJXEausZjbXadO5d9PCUxHwGqYhDNABEmSagwnzqmRcxpNXIZMrqilITma5ST0zmI2nH1+inHXb + u7qt//g7HAS+ZeY6r/T55mBCcVNQAyzCsAE4wrBBPEpitdQ8FfiimN+8BL6AaM6Kdt9l83r/reu/ + ICENcSXccbX0z3UHE9aX3Wg8Nt8BzMjcjipBLKhRAsIjTT2dX069E4Xzpq2ru2y1aeotmsNcSwlK + ONSaBhPmZc6E+y1RxNjprtTAMylQ2ZylIV7NF96ocvW87Z52z5g01lS5qNU+1MGEQTUC4jXuW6w6 + S2E44UKy1OWTYjXzT7HhtRPFzObXPtg50UTaP6vgAexgQsBC36Q6Ns1yYBGmJbkbZwGBTZXH5Xju + ubWs7lwEQzPaNffbVybvTPMj7/ETeDAhuCUxhMWZtRrYhIcb2ArwFZo6oF2MvfyFl/6iIrJivPQB + a8Y4gU7L/DI9mDBHM6EEs9EElgoJa8GEFIJpmcu0BJ4Vy5eIZ1XfN91+77en334dmP5JNgIjAqJB + WEA2nkyYrwVhxEbpluRIseaCWs4VNCidxi1nk6nHt2bww6u7btp86pETNGk05+EzpcGEoLXCVbc4 + WCShObdAYgjRqYFdrjweDS8hXMvtN7kRJffVwmBCMHLgDRa+iChK5HwFuLfQhBujc5qGshjNR16N + bvpP20/Ycagl0FEI9cvzYEKAGqqBXsW9SRBFCPKfCGOYztOoVbm88cpU2Xff7nb7vvlSvzL0YEwb + UwKD8iN4MCGgodpoI6KEMgba1UGdBnnxwV9yXVTPQChfQQv6RZIPwXntYMIKs4W/jHwFbvhYH+AS + qH3WuFPxJMTluvBbcAM/GdO9FLSYS83A0txgwpACXYCYjANFeq47TnVbPiZxSHu1nH54ifPqP5Z1 + 07bP2XHC0x0n1GGhAESCXwBjDAiFkwnDDLmtSdS5QiPiiGrgKJxTntPEcC79trsoSngVE0Rcu2mK + CajAkwnrOloDKY7jxEQgECptlCvINg3n/Hbh9Vh4LVvVj80GVPBhs+/6XYA6z6cEKjDwWKg3HuS5 + klbd4mMcKFJSDwcpYciI3nerMcotXuYmbTZbTrxZdNltgSq37ZFIZZNt3d8/Y0fCELN6Dcj8eB5M + CGgJ1YbrKJcSHKnN8E1LEPvKJC6szJbXXnUGFvnVnbO8eqDm5ADQY+GPrwYTlsKKgvi1UbIRw0zg + /a1KHXAsr7yB9LJ7qvtfiBtM7kNKKquCC5ODCW9KTiVHITOkVBMpoSnBN5rIO2Zzf+V3dgzuPhvV + X+sePgF2EwNqpnApG7iJcTKhiB3Tt69AxhATbTi1LE/L5ptx4TWnm67/clch0QwNn5uL4M7vYEJw + AkTwTmSJEGASRB8cq5Z2hTpVHyyWgW3up6pHNpOY4wsiGMGDCfOndg4VUerMbdih1jC386ts6srv + +Lb0ls3G9Xf01gWTjHLoCtr352BCcGoHUkQHONyE2aNVhghBqMpVGqkaF6sLD2bX9eNq94ABNcQi + O/knEwYUpL+1caA6LPlAwXNoPYQlVqSz9dwL27Ou3zdb7L4FF1baCVQbH+dgwgJXMOgXsaVtAKrC + 7cYyqoBkU5KrxPHjePXuJVLHju/q3RfsuJNpZSEPA4fbJxNaiiyU3Ghf5So8l7FUKWbcuYFNC92r + 8ZnHJa7au2zcPTZbR6DO+uPnyabgZEwVWImcFQ0mBLkgCshflC1zGU5aY7mQUKFV4rbZrLzwCMVx + KWnz0Dy9TqOAzlCQPCIwhTuZsLgmxAgW17kc2bEzCtgGJBNJTOBl4BbRstvtshUIA5w+GeY4UkjT + n0wIVohN9muYGoaKDOEMt0pJLlRu0nrPovjgDeEW1fPmoUbu1bgNIqaCd8MGE4bT3dmLSyAeLsnw + /QguOdOpE+V3F/6xbl993mcXdbP9A/jhb+uHOhDAhGh3Vq38TjuYELCMKXcHNap9OLIyaRgwYgMt + KPmmrn+Zpnis+2ZTgdZr680e/jdbdN+AI2P3awiTILTdPMKv1CcTAh1IpbubHkVOw/UKaJhQFopW + rtMK1jt/I+ddfeib+2zcZ4v6yWmh8F6dZZpeu7Lj4R1MmKsllFn7CqtCjsW0geIPb598TflyfOsl + 8OV4cnubTatPXV9ByUIln5BAAMZQhAO7hCcTVp/dYnvsdgZARrY0tKLwD3SsXKbRjun7qbcpOz20 + h7Z+hFZc7B/a2u0dIT3JLa3SoOgbTGhKSyAgcQaCTCS1VMDkgD+nrrcXgav3u31ffay3NUBdTMvw + GSD4FgpneJvwZEJbsFGuhsXwMuTBClq4x09QaVMZ11nh9+CzClS9O/UrOx8oqB6nVeEr9oAOJhSo + 0kbEj/yYDVNL19IMAbmQeqo9W879xwwAg+63SACDptYkfDl7MCFANQVNRF9xKIpTUuhXPFXMn0/8 + Fnw+gf5btfuHEj7m3xhRccWOz8cIrGkgiMGtbjUnjhhJWU6NEfCzUjnHeOzfux9X++quQ3ZBQckR + MQ0ecQ4mBKeEDmLig1aG6HoNzdo1c5mTtFQtL9beuUEJH29/ZBePj4ctFGM3Zsb2MhTk58Lto3qw + BxNWkfVRJ0RhIxfKlFUgEqS2iSLhrPAXvMdNBR3o7lO1+XIaqWMDHG3Cg8fBhCDmnBMio3NHhsw1 + lOHm+CCKxAuvk1svgSff6xZabni8yt2abfgq2WDCKrJRkgkVbbUsHM5Kuz8K9Dl1c3+99s6x1311 + d9wxOk41wlLBGM7tfwVnVYMJK1LAlGTseQMAFtm1URrIp3v71LtV5ercI8xl59aZs/O+Ozxhx/VU + uauAoQA+mbAepJi7XBcHi7jWHZ9Sxmwu07Z7y7U/gSy7+23zR7Xd/3maseraw4+KhRxrW3e5JHyJ + +2RC8Ftm3X5RFD/yiB+ga4orkNC5TuvBE49p/BCDHVTorOixi4PMSLdWAj/Y9/bJhKAV1ljCo+cH + TCLlinMjNXzFied/o3deVxpVX6AnXRzuH+pdkERCP2AMCAbxW9FgwkuW1jL27CaAihwJKaKIYyos + 54lZPPbWmuGlY/D+Np74OCmTVAAYE1qm+mnCWq4E3SATYQoJrEq427FJMK+X/rz5uu4bqMvuUsIz + qD70dhEX8kNwkDOYMMBKS8PigJHzXGlBRgP9FKmAy9If5JTdpnpbdm2VTQ5991Rtms9umAN8CxjH + LvQYkfMRIaNxuZgT4WfwOTQQbnFxZKCbUhuHj4yxgJS6tVmlfm02/DP460nhHYwV+xbsTYWxDsAI + 2jO8PncyYZ627hzvFajhMY57vpE1AsQCT9P3txPvgOF2U7dRGmmB0NlRcGQ1mLBqBSLDvjKdRE7s + pSRAWJQrVmleLeYrb4kMXvuAPEME2odivwcvmwwmDKWCzNRxYoXsfUrQupaYYf/sn0EcXV56O5+j + psOvrFui2K1bpvExnkxY0Gq37RZnyihGbrikkidKIP8m89X8r1tU2OKFYW67L3iV5mRC4Gqn5+Pb + Nb/Y1Qu4UOi5O+bPE297jqe+0B13bQtced3XyLkfk0o7PmhCWu+nCcEqiHIlNI41TBUlsW6mRUzy + uObMy9Hz6dWomJ5dvZ+Pl5eTYLa++3DO7Y+bFD6zGExoTQLtoGWUGv/qRH/F6y7SGALaOLUoffTg + ftxtqhY7LQBaa8g5Dd0vGExowirzyswigtJaK9xGTRLI2dirSrNue9+NR9io0XK9CD5rYDBhznSL + C6/4EhlIQY+WTHH38KY0mbde33hP5loD9X+7/uYOu/Z1X21+PGCi+7z/VmG3KoybeSJ3dk8mBD2n + 7pnF0cZDTZhJCAWCSCplE6c0NyNvfHFT9Vu3Ddd3u2zsnlD2te4xSsGFYDy4+DiYsGolJdMsflxA + ZZhTcOMUkDseSSzNl9OZ14wu2/bw2GBjdAHtwI0PAyOMwYRlsHt0XPx5AxTZ5QXWBaGtEknizcgT + 8DdVew+9Z7vLRl0HAr5o28Y9LBJzLxVMB0etgwlLaHez19J43UKIBoNOBJWLs8QtlNXl0tvYXjV9 + c9hlt7NX7lq41QszCg7VBxMCWdPjbYxoRBPsOTEM2DU0JPl3tM+//uf/AaS/SugyXgAA headers: Access-Control-Allow-Credentials: - 'true' @@ -80,9 +117,9 @@ interactions: Content-Type: - application/json; charset=utf-8 Date: - - Wed, 14 Feb 2024 22:54:36 GMT + - Wed, 17 Apr 2024 16:43:17 GMT Etag: - - W/"352f-DpJzehE7HALHT2ijZ/TGcQU1YpQ" + - W/"5e32-2V5eXB4F7xydvsbJCpdYbUQZt7g" Server: - nginx/1.18.0 (Ubuntu) Transfer-Encoding: @@ -106,31 +143,143 @@ interactions: Connection: - keep-alive method: GET - uri: https://financialmodelingprep.com/api/v3/stock-price-change/PAAS.SZN,HMY,AG,CS.SZN,BVN,HL,AYA.SZN,ELD.SZN,SIL.SZN,MAG.SZN,FIL.SZN,HBM.SZN,SSRM.SZN,GATO,DPM.SZN,SVM.SZN,OLA.SZN,IE,CDE,FVI.SZN,EXK,SEA.SZN,NGD.SZN,HOC.L,NEXA,GGD.SZN,VZLA.SZN,ARIS.SZN,ADT1.L,MUX,DSV.SZN,CASH&OTHER,DV.SZN,KCN.AX,ABRA.SZN,APM.SZN,SCZ.SZV,AOT.SZN,MTA.SZN,NUAG.SZN,USA.SZN,FISH.SZN,ASM.SZN,GSVR.SZN,MND.SZN,MKO.SZN,LGD.SZN,FWZ.SZN,SMT.SZN,TAU.SZN,KTN.SZN,SSVR.SZN,BCM.SZN,MGG.SZN,GORO,MRZ.SZN,BLSN9G6,284380Z.SZN,TV.SZN?apikey=MOCK_API_KEY + uri: https://financialmodelingprep.com/api/v3/stock-price-change/MSFT,AAPL,NVDA,AMZN,META,AVGO,GOOGL,GOOG,COST,TSLA,NFLX,AMD,PEP,LIN,ADBE,CSCO,TMUS,QCOM,INTU,AMAT,CMCSA,INTC,TXN,AMGN,MU,ISRG,HON,LRCX,BKNG,VRTX,ADP,REGN,SBUX,ADI,KLAC,MDLZ,PANW,GILD,SNPS,ASML,CDNS,PDD,MAR,MELI,CSX,ABNB,CRWD,PYPL,CTAS,ORLY,PCAR,NXPI,CEG,MRVL,ROP,MNST,WDAY,CPRT,DXCM,DASH,FTNT,ADSK,ODFL,MCHP,ROST,PAYX,KHC,AEP,KDP,IDXX,LULU,AZN,FAST,MRNA,GEHC,DDOG,CHTR,FANG,EXC,TTD,CSGP,CTSH,EA,BKR,CDW,VRSK,CCEP,TEAM,XEL,ANSS,BIIB,ON,DLTR,GFS,ZS,MDB,TTWO,WBD,ILMN,WBA,SIRI?apikey=MOCK_API_KEY response: body: string: !!binary | - H4sIAAAAAAAAA31Wu24dNxDt/RWCai/BeXBIplMkQQ5sSUDgBDIMFwlSxkiRFDGC/HsOl0veO7Rv - JKjQYHfJ85gz8/HV1dU/+Lu6uv7zy+df//j9+rur6zePH65f9yLdoRBD0pKOSmqVLYdYNdXx1GOr - WZAorEdNWo2CmczHrJWUA1EpdtS+/PVbe7eGJFXz+N4H1CwFskSjJq0mNbDGROMurUaFA0pcxsux - VTMHJcnj6M+//N0ejfjv39ffwnzz4CBTqDHyArlKrePoDpklSOUJZse8kYZMlOUc9SYRN5dxnQM1 - l8AWi4O9aQy1RnG4t5yC1pod8I0rVIinK+3AN9NQYuZx+Y58yzlQiSVdJOD7n58cA5BJZGBI3QZQ - PJKJk11Ai04IOwPZAp+5Yyeg4rkmnSNAA1O2+bldzWhBZ2kHn3BwJRokd+w5cMx5fK5DpxK0KI1i - R45Dg7afi8jfvFuA48NeeqicY/ZuZ3hbY5w37dKXUCzX8XaXnnNzvI3GGNpbsMQ6Eeyo4G+iFGcP - dUNIKIXTKO74BVeSkz6H9BGna0oiwxKH+CUGfDXKRQoebt4/OxI2CqLTWZ0FwudZZkN2GkrIghY/ - Z4E4jP93AqT1p9LozwM/mgQfmwDa/RulTDbY6+iNgL7yjJ+9SLieyaT0gL9UD/CjehH8D/ceuiB3 - dLptLyHaTE9uG21Oil9nAGitVMXh3xIIIamDuGEAQfPXMru3a10RoupDr/U5mdkopm8VDwqW6kHB - qF6k4PbOcyBIfN/8GwfGzWbIHuJbicmlH8GYhtY8J8BCpZgW+JRDIfb2Z0ZP5Tg/2Ds9tlOis/+m - JRAbL/5H8ODa5kN/qyVEMyoX0d+/vF3mHQ706DGLuPAS/hQ4m89+MJ1Ypqhdf4iqpSzZ18DCFdGl - 35ZAH01YBwEtJu10oZ4UEkyY59sHARAuk45HDwIM2Rv5/xLw+Ta8WyhQXUKwTbVSvQFaBnJ0I7/1 - hajTX5F0dV516C/Qqoqzv2BwSE3jjA4/pcDn+8fQXzgtkw/pif0jr+hzs59elv/p/uXGJwDiUotH - z0ghKjNw+kwHguLAw9SYaHNA9viDnTjSsvC4d3fw2LJqjqTVqy+Y/BptmfyGyW+6qI+oZFNZmn9U - L+K/uXtPYZ2BvEYgNiI9bTqdgNxiwgUgYY8r881u/xqqlTToHPKnNtTE9z9Q8SlQ95HQZid+ztFj - lYAPxYu/FDv2UbwI/fGnlzX7v9r7Ktapah54aTtKWnyP6EckOec3mGxlNvQADzdlYt/6EeZFdKpP - v9TKPFuiy4/VOBVLa/PXfRXz6w/Fyzvv29uncPMVAZznNpeObigaEaunYf3YxcKGwE59xPdpmz32 - 3vY9W3u/mWkG2pH95Daarj7izCI79a35GfvxEGnMftwyluJnPzoxpFTK5d5/eP7RLz4IvnPwOAvi - +9DDrXIsHnk7P0qa5x+DH2MjYSHz6AUBaTSXxA4f+3ktq/iV4DOeOnfxqyIQbNG+IiWIZIk+jE4F - +Q39q0//AVuAvzfrDQAA + H4sIAAAAAAAAA31dy24kR3bdz1cIWk8l4v3wrprFbjVEsntISt0twwsbXnrghb3wwPC/+5yIzIi8 + N5UFQQsFyGLd17nnPiL0z3/56af/xb8//fTzf/3j7//2n//x8z/99PPz28f3n//aT+0NJxez5BD9 + ehTbkVtqstVuP/bMM7vY4ut65HkUlxR9CetR4pHzS3XGl/XsH//97zi0ZqnRJbd93A+cBbeE4tL4 + PJ7Fuhiftr8af7TPy/hAX+P2u4an1ZUlpFy2P/P3f/2f9pHehrwUF2LG+f/99c/Ev16/Pmnxk4vb + J3Xx/RJMyUJ6fN1qzSZCE/+Cv5VMFvJfwlJLCFL+S128q2WTtclvl5KNHZ/XZA347jUMS3T5LSSt + ZvvALn+ueckmpe0rdvmttybgx/E17an8L7/frlJ+v9jkh9LbEQzrStm+SFeA59n4uW5/uxib8yZX + U0B1cIo8nKIrIMcl+50QTTILLdfhd00DgZ/o41BzU4HNBj5Qitk+s+vAFhv8Ev1UdteCM8llWCZ4 + 78+94PmPF6kFu/gSk/KCVIUT4CAkvx01FdgK7dnxi00FcNkI42xnXQXOLDHjm+1VALXUWLJQQV6c + C0L+6pdSUlbSw3egPjcMsrpACdFB2TGE8xB4fnxXLuAW548u4I0VLoAodjUmY4QTeBjclxHxTQPR + LMW4sAnbNQDXNPj1ASpNDOAFfm4I11SQLFyoShywGT9Y0/C1NQ6AAzWXgSyrEmwuiwEylXP7//7p + i1ZBtmb79K6CsPjkBuI1FQR8sxSE/DYvNg4bNvFDWpwJbvuxFQThKd7GAWTdimnBv1GIb3MFNqQk + nMAbYpJXXuAM9BfhbBIIcqkWkeFyOlXApy9fPkkcNItL49vFNSZqDXZEbQtvKCD48X37UaBb7BVg + aX9Ag1SAW0wAQu8VAE2ZUqKAQR8Xh5gfX6XpJPAPeydhEMC45OLK9qNd+gR1LNkBbu5Kr4UPXkY/ + hDcmb2er8LXGgWKb8EgVwvrMdkCEo/DR2fFxq/A14Nsq4Qs+cHyVJnxkOjbDn1bhSyRWDt9ZhYeH + Le5U8Icvb4fkn3yQoQ80yDNM19wPC1eR/ZDoi/Wb6rfkX1IdFu6SI/cFO5JaFzzgm9skBEfeiNZF + ifwF9kXkS6uDSSzFmih9PnlYPQb8cyr8+9vTVYM+Ms74k/3IANCNHWHaxI+QYTpfT/6AHpuqgL2L + r/CjGblr9kc+AHwL3LtY4rypwvEvML4xLgsCkGMCDJlJnlb4z3ColBTyVWQnZNpYzpXw8vHp+0EJ + bkT0lvms8VX4vllCxpmxQgswRYYlt2/RtJBBFF1Swe8QO96K7Ffg1RFoKrxgydVK78fHRXAnJb9F + 2glwdil/NDkzI4DQnSrg+nyT8oclTq6zJT8H/ieA72LL4rO1ggAjVECKgsC+gJ9DWG4ONMI/IgoE + A8xkLxM4tyhwxc081GEi4xN9VNgHHQP6i5NhAFSAt6UaTuX/+vhVQR+sIGLANAjy2QkHgKg1jZTe + Ux8tM4zaMz/w0CvqQ0AxfmipBwC0hACQiQ9x7ZwVed/DFX210vqVIrphipX3ucig8gDyU9mfPr9o + 9LMuy6wP7wW4iKxPUg+OLEwP4Af2Cu7fvn8c5K0LX6C2KnHfOcBknh/XQA1kI8xgWJNeho87Ffqs + iNKsulbHh+cvoD3l3O7X24dHLXzcxdp6BLfP0RsJ/x5hCe63l/9CQutmNuwAaGF/G1X510IH9YSo + /8BSfcxOAmBB5i/jbMU/KNUqB4AtlpzdqBM2DwhgxIBFsKJTNTy8PXzRanBJMT8YCBRa1j9u8bZO + tNr8oswiblUBKonqhrJWFUDaHCX+8beBvFIDdYETFBECVKoFdZAlMHwUdDxYlQVtTmFBuo3nHOD9 + +bc3hQDWFqkAA1qWwfOGM48WgDcjLwwItJPW9kAg2QleQiB/uU6TNRUgtcFaA1OaX1iARbKS/cHX + MkoMhYAAQCepn6dXgcXWU+H/9vDlWRN//JaE/8CMaKT5gXV2UpsOf2AAyBwCA8DpcoxZWh+4hGpg + 0pgGbOxrVFH6QfRMDxaiG8ZEjdL/UeEvASAtiz/UR41ZBX8u/+eX99+08SeH3IyPmgqSFQkCMGq1 + RhjfgScYRf1RJGeApVTAEnxOAgQ9C2cXRAKIrEOLbIBAbQiyGSZb4QeoR90nURBGI/mG357Kf32+ + KgLMXG8kAQ5EtlmoPHelgLL6ZJNAQdCagBQsvJ+SwYyK/yAPwC6y/M88kx2QCB9wU8s9B0ZynVQk + ANSAOj9MVN26H8RvfEaw507w8PzwdtUgGGaG3kDQmyFZV0IhiQsyD6DUdioILgAA+KwqgS6tKpw/ + 2tMAQjgPR+sY6Fi9p4lIa2qIxg/4XSsBKDUOXrTVARmFUUX9d94AQRA8/EkDREKgB2LXIcIKAsjw + adRhK/55lmGSBQEtUtVBcAE4FZ9kGoROXC2yDXpBFLuSnVQA3CokVQp5YKpxRuYA1AaVOS3f6X+8 + fz8QIQirC2BU1kGSYAQ3HEBhAKLCCgxADZJjUdJbHkoMvJDH2VFjd+EtywcnMmBAXWlVBQBatCDX + DfDZCqAMZmDivdbP86eD7GFW5pvssVgnZYdN7Ww5d+MD7YypsvtzQVlfD75vWf/PlmrPflCmFaaH + 0wUzUK0LD5qQhiut+A/cAfJWyYAzIAJGAzae059nif4waNR2R1YF+RGBT88ts0nXEh3rhjLs1O1u + yA+CNHxA6bPrXvLrF3avfRF5H/VczlWY3bLGjaYqn4dz4ytbiXtgjRHlFFL0qeif315l04cuabOE + fnYwvJGol8CPZndobX6gxlKwD5aGBKkSn1t23Zye+AopihWoz44xyJzs+uB3xy/2pMeTasevbi1f + h2QYiUunov/y5eDy8DM583DksrLmpzbgCaLtc2HfR7J+WAnFqHL4CtPlILCOv4oSWkjORkgGYMmc + j8goaRSCW8kPWha9l4wP9QKYAHjqecA/vT6ojgfy+xwxbIyvTNBpwiNgc5jctAmKtMbewl74AKgA + TsqKxxGb/PjB7vRghnY2Vfq8I3MwFgTQI0NwIKXYPpmdjSZK6YOFPtge8ued3g+/vnw6YP0M0uH2 + IEGq4VNYSJmoEI+9CDHxQXmSrDkAHuqwKpu95EB5lttdA4CMamSzt7CjXovM9bYQB02QCsiefCnd + Ify/v75/P/h+VfM+IEotMTmV7jkAKoOHdPlJ+FIRsIfAt0kNOy7NWQe367me3S0v/R/pirEjyx1C + iS9GukBECgHVHA604h44MLAopTsTz9vXg/3zLLDWI3ihCbMgWV0Auc3AawXyO3atFd9BwWzmLK+r + gEk7zkZCj2EEVZIDL46r7LR2z3mF8yPV8WLGN8Y7mfTAnnwbDd1BgNdHlfJZzKkIIAkIMVrV+WHi + K5rxgRiXJFygNG4mQYDMLlnvBPqD7yEEZAwUMItQ5LwHDgVu6+bMeJ338Pv4KsseUH1iizHnIPD2 + 4TcZBQahKCd+/SSEIFMAsDJnNyy2JkSH2lUo4MI+l5EKwJmtXpZ9bBsBViTfZUNfhQDCB3RGQUBg + XNSk5r0xVPaXkBdPxb/ePh+mHnEMcrf8F0sd2WUredm4lx1vxvWgrNvAx4DJHdodJcp6Dw6BkjeX + scywVf0os0azuYmfEpv7swHVjR8re/CS93AEgTKocIZ6Kv6vT9cHnQFLkBkQWGdKls7PBrVLQny2 + WEu2wvaeeyCTLY+eR2YRs1cACl6UZarpa1holSTMHxjSrMGFAkrN7JipihfkMiM3oli7w3pvT38o + 9/dJ2Z/WIdwp/08gcJO3bzkgwVdk34czy/HNZsHLnqGc/HA6b2TPC7yu+NlH7DQA/oPkPhyo1/xs + Ttuh/a3tSaSFm56K//X68k2Jj4pH0z84p2x5gO0wfoXooGbssO9FB++GF6pqD/G7Swhbxwv5RQkO + bZQwpy/NzzkUDmmy5rXlBQIANuKV/wdGRbxn/E+fn246+p2R+c+CW0w83JodJUQrxXfsFibZ7aRO + kOpVz++CbO+RrSQDxiEqVDXvB1A42fXj/oBRuw5QqZG4bw2yGFcFzoddby9fZa+XXdg5ZVgjH4Tu + sO2UEQmC+YBnmlnKrFkPVhqDzS43xxB1tNP7uBdom4KTlrcMezNjsHlIIuksTsF+6+pGo/Z8UIBZ + 8gF7h/m8Patdr0LPknGf2eeZOLUmvZBU0DtWgWak+B70rLviaEGs3D+27CjsDg2AXc69kXaGhMM1 + HaEAVBPk5jLqkdk5p5r7NGvaxwFXasCeTzXwcHtR9mdJPVdrVgeIeY4At2YHEpXc9krcbEsC9Sz3 + rOYkftS8qAa8jH12sXOWLmCgvjxbr5sHsFugqh9QsNZVFvJbUC58zXPhv94OcZ9m16HLHgEeTuHe + nwY+GYMZbrK2uUCNggp7R7NOcO2NHk9uISe9nOqYFJT4pS7sBkr7A0RIOqz0/3F6Kv/z9VU3e1Cn + yeDPJB9zMW8Nfq46iuAPbfqxFx4KCXVqaQt+hzpSuz6wTBK+xA0ZJylPhjpQ3kjQ92yuVj98aY18 + BB2C0d0pep8fnw6MD4AqbQ/Yxl+UtgcTjXZ2pnoshBbm0vNJF72X4pMEIw8I8EscaVQR+a0ZWI0c + dNvCnq21yvPhSuAQsxYcU37f6us7kf92XPOoTgY+klmpyvjA7zQV1RVAE/oYslRB5UJaUe5PAEd+ + nE2qXvUgn5gdlWiOAbmSGvbDpyYiblUfS55QZOxzfg7wT/c4/4eXD4r0uJ3Ot9QXnZpxcgNjWKFz + XtY7s5Lt7s/Ea7JkPfhBNl+F/VnLk8pKB+B8VW55ooLk4FDILs9WyfvZud1fv9004vs5Pts8v7Jc + VIZH+T/0s6b8nGSdGxMrMD3eLFSjNLht+5Ritu257hZVZ9/41hMRYqvD1eXXw1PBv/44LnZXkyTP + Y3t3bp1sTQ4gQ5wd7xXwYPGs/L2mWc2vyR4xW0daWzlegehlsJVu8UyOWAa89ZFO4NhpjvC3Li83 + w7wE++3w3Ozv17cD4Im+Pv87R7nQDGsWO0Tqzu65bCAIvqvkt6NkGVke7EVtc6IOA48WVq80W5aL + LaACIJM1S7ODznKlYe7SrmhfK1lzvLfZ9+X16Ydub8zebRPfskOVpMsTEqskOZZLMXqvJ3IVdNTB + I9aNV9usjotOVrF7E7lNkESys82eWYF9CmWZmlrdPqIS4k5NvFPePehEDxYZswx5x8BVK/1I9NbJ + sQ4712HW8lt9D1auKjyWNzbL9h5Xz5waaCNVg2+O+dXa3QEhSkkle7a8AECqvYPCnncagnPnGy0v + 379+PijADkTamB5bBLK/E7g8XbQDICQVzQ1sXB9CP5oq9/m55Oi8bO7BT2C96Ys9HSJQADqyznEg + f+DDqsNtQbyWO2n+8TDT2pm5Sx6YgYpwfQ5ZSxmTtc7vUfX4IiscWBRxOlykS46KO5XpqB3wA8qe + OP9KR3zPDuAs3OKfHa5MT52uHHc7PZX/+fX3J53udgRuU0DZ9azsymlQPuD7yoUWNl3iIHAd/SLv + PXmFfm1FyAkVJI6VihUaCK7V+2q6xQW+6ecb1U2wnPcy/FEis147t//rF73NaX2Q0rNG2k3Pm/Qc + +9oiMh5jJqld1shaZvD00dh0CAZpfd5tKMLv4eIGREpk+9ga3ZMadsENzAMRJeq7mDhhzsCOc9u/ + HJfZoxnYtWU9A0nrXL1tsrLM8nKPAV6CtF2F/BVcsA6MW+XPDKcsSJ5Dgpjr4U0jXGOrcoellnbN + RoK+L2x1Vl3iABwjedud8u7b7aqTnrNqkZsDY3PY4chgIpLhF15YGQVmBz2kHWeSpHr8ZWazvfCe + 81+rurqIrtkY6XEf26RP9bQd+85VNbVRFQOKkHJOZX/4+no0/dxMGuVNClYaHn9ud/FgJTyuFtnS + ZMYPUV1kwA+S8kvZKzPtYHB9pMfOd5IJH3YnoTxs8Re2l32UVBelFif9sNx5dXP7/nDYY0SsHnr6 + Vl7fsQipXYLqHNCE5IT4cD2ErpS+sH6efZmexhAJKuw5jp4lZTc8b+NNZ9iaepHbACFIv0eeP8e6 + 2/Xtl4PMYXjUVtqknR42rGe1FeUkl1cXsppjZl76kTyHt5HcnFms1U3kIsAw26zqU0zC6S/c0EpV + 9bL1aZd9nJ4q4OP7y7uKeIivNxloTt3IBysfFGy1eua26F54Mp/i9eYmL23FJNCOF+NKGlSqSU+i + 4ObwtDt9bEHpJeCBhkauMqgFHl+MORX8env7VQ+wapUEnzcK/GFhL/CerFphqByuyRKHWw3TngPo + PYws4p2FOxxJ1nbs+Oa57dhlr20FWjI8ZGZOHpIM9+DhX6eif7l9fNKilzkE3wLd5qB2NcljeREk + Crs3J5XRzoFssODZ0vIc61hV3/AyhgvC8KmSDgwbr30cXikPenyL+nWJLowEuBo+pdR29u5E/vPD + L4cdht2doE0Je/q6EXxj58LOOsDl1R6hgcz1QhX3pEO71bPm46BtSQ5vLa9FzesdvZPJC1VFtXLa + 8BaZU7OcGnmFEXXEqeyvhyt7tgklZAfFT+qy8oVtCHVnr68ujEJm62S65LLyfc+5nLI+13LmenqH + e7ZYrIh60IGYJ63eapvA9q5it6iVCuvyfAfzvl5/HBqZu/t5M9HpxQWzlJpJfgTqc/kFX8+XomLA + cL14Xshb0Q8Jrki2A60WxXT5110VOS8kQpyRPmArq/5ZSK/z68zWr41Ik6dK+PWXB4X7pkaBfox2 + B84lQSChzDZVuD90BUOoG6tsUrtRjg4XqM7KjdUGiU4yXTYz445U9RoHgIo/LQHgEurC6zIq7W2n + p9Jf1Y01Lj2rndW+vKi7G6ZOUPTdzIXLN/KyOoWf912H8GRhqrHn+etFAMCltUHmBYof6y9ndVM7 + RqZq1cYHW0c8hnLH8LfDZT2jKH67usz5hEA+FJPRq2VlEF03m/Cr7MBudWPtwqXEJJcXKTvqGQl+ + zK61KOFtZuJT97Vc4rjCqgEm/APo6e5U959v3w/BX4O6p4Ba1swvsdV3vqi9Ve4Yebmv3NrwRk/w + AIg+zpXELr/h7gHCRk6x8XfYQBXys4Pm542SrakL/FM3FVAOFDLoOxc1nn57+k25/m7zedq/+Ki3 + F9rKthn5ZoV/lBsuyxdb2vpCSIcEAGAGKRD9PS7DRDcSZc//YPFOUB9r2HHQTzWAGCM/H67s+dR2 + 8dy5Dq7qpQ7DVwQk/eHt9CoH2ACE6qUHEPjmt1pl5yLMqIXHDMuy311UX597xlHe1PC8Kp/l6lom + 9Ae9w8CKwczCeY1/B1gw/Oqn0n+8Hnsc3qmldcsdpZls1uwPTI4C/XhdzcjVVUviYPRrLcicVq5u + 80pOUqurAC+uSwnbV3Z7d0y0C59Z5OvNbS70ZE6k4Sun4j+/vhwuKuV82FwvIP665CvsPuUgIJBP + lRjpAray/DdSA9AeV81l7mtvDoU5LelQz66dkXUPu5awrLqyhg8ko1Tt7XF6qoJPjyr5s9UxU9iM + ACfvbLC5bcusUZuwyN8hq+39zMu9qtVhSf+ykN+3IbBI/Zxflamm+Cdnq+zycBV9PTyV/Hb7cmhu + 12Rl+uNqRZILHC13K+JrGbxynufl7aOtzQHeVgT2ZzbH5j5Ll5wktKi9Nd+ek5CBrw431OuHp5I/ + /PL+qkDvcDmLriiTnm2XuNT1PJdbJEjYg+qz028UXLxnR0RuLjGPWKOuaLFmSfMH4xYeHAgpyut4 + bzIr3s/WbkZKPDf9x6u+tMC3aAb+bEUPakaBeijE/W4G0azsmbNko4N3MfM4W8c5HElmubfjW8NW + PtBiI34wWrmtXbiDX5TT8/pSRMZQ8yxDvz8V/PG7Zvpz2j5C3TgrwR4VYbCjAbFOMpBt5SQDbKWU + eVNx1LnGBrmpyd0kX3db3z2F8WkKtbC3xJjnst86vedUUW/pI9h8udfNfn+/HQ2eJMohA88mXpOc + E0Mvt1VcQBQMN1y7O9ar3XTyMdZLwtztjveoBFZz8ymhJPGdE4tc1WNEcEXWuElN7ufxqegPb58O + 3Y3d21td9iS+28Zyk/VyQReGsy4L6TMr7MG7uvjEk1Tz3PrsWLUEtoz28l9ahaJWtepiyPGl2Tmm + NHOVt0tfyfx5NeTOk0TvuqsL/lXUk0TkCUXdyOcMZ+ZBv0EgL7Go2p5NsOR0e68sBRgqO9q84+ll + O5/BkFKU2zowh3G7Lb/e3kOJEaza1/Eu8J0nZJDz9tbjVcW8S6q3ydjzqsEXeSN6ULcuP2dTVfZ3 + qLuU1WNkdKcY5HY+e2qed7aCiPtLe7fMCQ/wf/YgH3c3nZ0rvav/B9Q5fNUnnVP8D7++ag+AbqUH + cEzh1P5Ca/E4fT2FkZ3lBkNbuIqHdT1osFY50OHTa1U+y4BsV+0uHFuohP2DYWt7I3J1JqgHuThS + uNPde7h907Bng7qMzLrdOWl8cpwkX6QqTGCDunTgIzuavZKN3kd8mmztURNu+lJHOfzZaITY3NeP + adZ7a3HreV9dPURk2e1CCXKnq/X7q+7qtzfopPCmNV2zdQfnV72ddlNDbWm2C+Zz3X74fgvHvQIQ + 4w5fVdid1EXt5yYu1uj1XPY2Y5qbVZvdG5tKd16ieXg8wH6IMtm3dxRmHbrKmXfNuq2rySeBXJQL + yu1eSVI9zTYpLSVHuafLCDFeslxAOhBWPkYBnhRCVu0NIJzPczl+8wBO8Gvw5x7w/niVU0x7aGzy + 9jUf9NqrgCux8hHG9jID/FBan+OxhAj3SgO8tV+TWlHltew073r9WH8wlckxe/bjhuzcBO8KKJ7P + YPiBWV0D4/RUAd8f9SOMYYbhBv2Fm+5S/gD2LD2AbXwzk/cKe2zD2sNkA7pCRSBnei60lzRl6iP5 + j1XYn732PAf2XfwE5ZWgGtvJWWrvTgRcX94OS4u7XectBHLc3SZYDctZenFyks0saeVbDJVb2pL5 + XdpleQF/lg+syqdoGpOoQRK/zBdBo+J9KBDIufQbpIiGdinU3rmZ/fnzBy1+ympBP8JVnZS+sZQi + 1zZ5QQG5UHZ3WPxFZ51yf57WbIT7s/hLSa7u8QdrzHJ379KW4er0HrP9Ot/jkaw/8Z2iO92d46sE + aXaJNsqPvC0XdvkNUEXJfd02fbdB3s2/OABYsocrGiyXfJT+b0lpnPCByAsCac7XO0xA/OKDFB+4 + y6vio7+w+kCi/sq9DsfT+4H5ZHN4jQrWVpurnrtBSWqgcgI/aOrW3s++yPRPUItZRQAxwdgs1/dQ + S/jdQlETP/B5NSulBxYvnB/rCAihPa93h/t/+niI/6qv5sX2/rUUn6NNpzMAsVrjH5JHmJ3xTQFA + qxDUZIt5zc480xkAhC1VoL88WgmAOFtpbz87lfyPg+BFD3Yi37WYg5SNx5Y8Kesa+m2DzAnL84Jr + TLt3JKbsnM6Kug8lWuadjb3ofOcABYf0/cwrYG4u16y9Pen1+O9TqZ9vCvBsG0kJsduzQ3M1vEvI + xpZcZKC9s9EPsIIW7uJilRn8ffduSB/le3FTx6++jUwrk70F4wMtUCLXzBc5Z9t8rXW301Px39+/ + Hd4erHO/cGP7dXfjyXZjQtBQsr6XxBstWd5LYWosZLIjnQ0l8JKfTHu8fHuY5rbFlfk+RnMQbjmo + ezkJ0A5tKcT3cK6lxHvF7rcPstFjuLemG/oI+PHJWzfbgnmrkKeTFuUC4CwmHG7jMhMYJ58hugTm + vKJGerAiL7aJxH/hbSNeChQquPChbhvVrVwyscwLtaca+Pz0rEdadV533vJeKV7dSk1c4xp3zGfa + c/PxhNnnK+o1joaPYfema9dAe5lT7m5esml1sUz7fG5rt+WwaoCsM8+Xqcdgk5d/8nnB/+3DYaqz + u0sweK+vaqejPS+qw4APkSb9Ap1znEvqXqdvOw2y68H/5YCxivgic7tkJRZcUh+CaSfg+kceitmY + v0t83O/cCd4+vx5uKOaq3iTgyHQ+mGQ3yaAYOde58ILx7vWKtfHDqzdOba7T6U0uXiqBVD2r16ij + 4dXF0VCIm8Psy8RVB8SHnHdYtIYCd4GAJlTCX/7l/wF2De6tjmQAAA== headers: Access-Control-Allow-Credentials: - 'true' @@ -150,9 +299,9 @@ interactions: Content-Type: - application/json; charset=utf-8 Date: - - Wed, 14 Feb 2024 22:54:36 GMT + - Wed, 17 Apr 2024 16:43:18 GMT Etag: - - W/"deb-ohIc7f5uvZzz1koNd5fmMzuDvvU" + - W/"648e-k76Hijq+oGLG6HSSxeTTBMtZTLg" Server: - nginx/1.18.0 (Ubuntu) Transfer-Encoding: diff --git a/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_price_performance_fetcher.yaml b/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_price_performance_fetcher.yaml index a5ed39c5832..8c7e1a8cf33 100644 --- a/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_price_performance_fetcher.yaml +++ b/openbb_platform/providers/fmp/tests/record/http/test_fmp_fetchers/test_fmp_price_performance_fetcher.yaml @@ -3,7 +3,7 @@ interactions: body: null headers: Accept: - - '*/*' + - application/json Accept-Encoding: - gzip, deflate Connection: @@ -13,23 +13,22 @@ interactions: response: body: string: !!binary | - H4sIAAAAAAAAA3WUvW5UMRCF+zzFautkNP/20K2ESENIVqEJEQWIkogCCiLEuzO+vr6JV2yxzZHv - er5zzvjxYrf7k7/dbv/z+enrj+/7N7v94XD3fn/ZVXqbCgEL2qpYU64QUD3MncfBmy6bFDEqscqy - yCQg5FJW0ZuIIBaGyLqqz7++pSwOZFbGbfTQ7idAkzo+l6aZg1kUGlM1jWmZNLaZsKmVGBiLjZGe - vvxu/ylsxYGLVUr97+X/nLi/ezgxgpL5xAhGNyxSJyMYSiUdg3QXApjqkHz1CysVVRtyNyGABOW1 - BQUcC4+rFwfYoDriuHdxwATMJYYr3QBKT5W4DP+6AVXze2ItZ+mPx+MpPftUgxyfOUjLGGzAW8Y9 - hujwFaK6j3MLfQW2GgNzjZ8BhX2MSiuoi9L2f4sWIMoxxU+YBzl0BN3phQlKIM70VgUCieMs/c39 - u48TfraojK6O7EOrhtg2bsNyqFxpWgBM/6XUoS30AaVEDKnTK+aozFt/2/wZkxBuvVno3aEQT8kz - ZZwoL0n07ltmURXH1x1e1Kum+0x+Fv9w8+nDhC9QYzNx4aeMnxQ3uxuVgkQ56X1CsTllhK/5W32N - tlS7AaYZddmqQ2vUtmW64F/lnrv59nLY6gmG0bz7WQegXPGZn8RUpL0zLmcNuL69vT6pf6BOBchn - iavM3U8Adt2eqkUzMA6euk/5zEWGcBo/1bAp/lyIqlKnzW8uFX15kfuSt9XnzeO1/DWgFtJxtPNn - ZbFxX3z+BxdaXH0ABgAA + H4sIAAAAAAAAA3WUP29VMQzF936KpzcXy/G/xGyVEF0obVWWghhAjFQMMFAhvjtO7nVKHnS4y1Gu + 45/PcT6cHQ6/4jscjt8fHz5/+3p8eTheXNy8OZ5vankVygsEI227pENiEGw1T111iUC8IO0aD61C + M6yyazY0AW8iWe7xx5cuOjB58yx4H1qBVrHMel0igUYunK0MjQuIOWbBgl2tXqGiWbb48OlnL8kF + JY5HmyX03+f/47+7uT/Fr1QWeoJWeGobfgGXWvO+ga/QRD0JBn0RMEXLiWz0CtU0oQY7xZ1mtMIj + sFvLXwd8pU5ZdWEv1oAQ58U7O3IFi5HWZ8lvb29X8gJkJU1J4xWRs4mJjjwDMtAFlLEl04auYKiW + vU50xlmtd8/9BppzHOT9z9pmAgckVRBhmmMb6OwMDTWd2chrlDQx82fBr+5ev/vHc5mWpOkewzg1 + vTTOAe2eh5VtSTwxOCGviS8IrmTp0UCXWKFGNut1TR2QbcZvS3yNguyr604t9uBpShu7xHpIbCGJ + Pu/7xdX7t6fGc8M18zFDL7asfEg6t2DQF4dIX8nOBn50q0XIFvwIs/ZV/hu/KvR858GBX4EYy7Lw + 3WKvMjvZMh8vBWhMPq/eQx8LyL1spWfpL6+vLxd6BBLOLnSfhyPW1Aa8g7viEnqPRJ6GPmwuOse2 + e0+AMbhZbnhv8X4YLvDcHxBss5UBqj2H+PT4DHxpGjFRzXlu9FZUYYCfffwDDUGZzesFAAA= headers: Access-Control-Allow-Credentials: - 'true' Access-Control-Allow-Headers: - X-Requested-With, content-type, auth-token, Authorization, stripe-signature, - APPS + APPS, publicauthkey, privateauthkey Access-Control-Allow-Methods: - GET, POST, OPTIONS Access-Control-Allow-Origin: @@ -43,9 +42,9 @@ interactions: Content-Type: - application/json; charset=utf-8 Date: - - Tue, 31 Oct 2023 12:26:07 GMT - ETag: - - W/"600-x3+R/EIjLOnwqmRci/IeiPVQcrY" + - Wed, 17 Apr 2024 16:43:17 GMT + Etag: + - W/"5eb-Y1janTBJnrcROzV/drQMXgAsvnA" Server: - nginx/1.18.0 (Ubuntu) Transfer-Encoding: diff --git a/openbb_platform/providers/fmp/tests/test_fmp_fetchers.py b/openbb_platform/providers/fmp/tests/test_fmp_fetchers.py index e1b25d3bebb..f64d4287579 100644 --- a/openbb_platform/providers/fmp/tests/test_fmp_fetchers.py +++ b/openbb_platform/providers/fmp/tests/test_fmp_fetchers.py @@ -44,6 +44,7 @@ from openbb_fmp.models.etf_search import FMPEtfSearchFetcher from openbb_fmp.models.etf_sectors import FMPEtfSectorsFetcher from openbb_fmp.models.executive_compensation import FMPExecutiveCompensationFetcher from openbb_fmp.models.financial_ratios import FMPFinancialRatiosFetcher +from openbb_fmp.models.forward_eps_estimates import FMPForwardEpsEstimatesFetcher from openbb_fmp.models.historical_dividends import FMPHistoricalDividendsFetcher from openbb_fmp.models.historical_employees import FMPHistoricalEmployeesFetcher from openbb_fmp.models.historical_eps import FMPHistoricalEpsFetcher @@ -76,6 +77,7 @@ test_credentials = UserService().default_user_settings.credentials.model_dump( def response_filter(response): + """Filter the response.""" if "Location" in response["headers"]: response["headers"]["Location"] = [ re.sub(r"apikey=[^&]+", "apikey=MOCK_API_KEY", x) @@ -86,6 +88,7 @@ def response_filter(response): @pytest.fixture(scope="module") def vcr_config(): + """VCR configuration.""" return { "filter_headers": [("User-Agent", None)], "filter_query_parameters": [ @@ -97,6 +100,7 @@ def vcr_config(): @pytest.mark.record_http def test_fmp_company_filings_fetcher(credentials=test_credentials): + """Test FMP company filings fetcher.""" params = {"symbol": "AAPL", "form_type": "10-K", "limit": 100} fetcher = FMPCompanyFilingsFetcher() @@ -106,6 +110,7 @@ def test_fmp_company_filings_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_crypto_historical_fetcher(credentials=test_credentials): + """Test FMP crypto historical fetcher.""" params = { "symbol": "BTCUSD", "start_date": date(2023, 1, 1), @@ -119,6 +124,7 @@ def test_fmp_crypto_historical_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_currency_historical_fetcher(credentials=test_credentials): + """Test FMP currency historical fetcher.""" params = { "symbol": "EURUSD", "start_date": date(2023, 1, 1), @@ -132,6 +138,7 @@ def test_fmp_currency_historical_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_market_indices_fetcher(credentials=test_credentials): + """Test FMP market indices fetcher.""" params = { "symbol": "^DJI", "start_date": date(2023, 1, 1), @@ -145,6 +152,7 @@ def test_fmp_market_indices_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_index_historical_fetcher(credentials=test_credentials): + """Test FMP index historical fetcher.""" params = { "symbol": "^DJI", "start_date": date(2023, 1, 1), @@ -158,6 +166,7 @@ def test_fmp_index_historical_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_equity_historical_fetcher(credentials=test_credentials): + """Test FMP equity historical fetcher.""" params = { "symbol": "AAPL", "start_date": date(2023, 1, 1), @@ -172,6 +181,7 @@ def test_fmp_equity_historical_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_company_news_fetcher(credentials=test_credentials): + """Test FMP company news fetcher.""" params = {"symbol": "AAPL,MSFT"} fetcher = FMPCompanyNewsFetcher() @@ -181,6 +191,7 @@ def test_fmp_company_news_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_balance_sheet_fetcher(credentials=test_credentials): + """Test FMP balance sheet fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPBalanceSheetFetcher() @@ -190,6 +201,7 @@ def test_fmp_balance_sheet_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_cash_flow_statement_fetcher(credentials=test_credentials): + """Test FMP cash flow statement fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPCashFlowStatementFetcher() @@ -199,6 +211,7 @@ def test_fmp_cash_flow_statement_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_income_statement_fetcher(credentials=test_credentials): + """Test FMP income statement fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPIncomeStatementFetcher() @@ -208,6 +221,7 @@ def test_fmp_income_statement_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_available_indices_fetcher(credentials=test_credentials): + """Test FMP available indices fetcher.""" params = {} fetcher = FMPAvailableIndicesFetcher() @@ -217,6 +231,7 @@ def test_fmp_available_indices_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_key_executives_fetcher(credentials=test_credentials): + """Test FMP key executives fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPKeyExecutivesFetcher() @@ -226,6 +241,7 @@ def test_fmp_key_executives_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_world_news_fetcher(credentials=test_credentials): + """Test FMP world news fetcher.""" params = {} fetcher = FMPWorldNewsFetcher() @@ -235,6 +251,7 @@ def test_fmp_world_news_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_income_statement_growth_fetcher(credentials=test_credentials): + """Test FMP income statement growth fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPIncomeStatementGrowthFetcher() @@ -244,6 +261,7 @@ def test_fmp_income_statement_growth_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_balance_sheet_growth_fetcher(credentials=test_credentials): + """Test FMP balance sheet growth fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPBalanceSheetGrowthFetcher() @@ -253,6 +271,7 @@ def test_fmp_balance_sheet_growth_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_cash_flow_statement_growth_fetcher(credentials=test_credentials): + """Test FMP cash flow statement growth fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPCashFlowStatementGrowthFetcher() @@ -262,6 +281,7 @@ def test_fmp_cash_flow_statement_growth_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_share_statistics_fetcher(credentials=test_credentials): + """Test FMP share statistics fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPShareStatisticsFetcher() @@ -271,6 +291,7 @@ def test_fmp_share_statistics_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_revenue_geographic_fetcher(credentials=test_credentials): + """Test FMP revenue geographic fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPRevenueGeographicFetcher() @@ -280,6 +301,7 @@ def test_fmp_revenue_geographic_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_revenue_business_line_fetcher(credentials=test_credentials): + """Test FMP revenue business line fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPRevenueBusinessLineFetcher() @@ -289,6 +311,7 @@ def test_fmp_revenue_business_line_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_institutional_ownership_fetcher(credentials=test_credentials): + """Test FMP institutional ownership fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPInstitutionalOwnershipFetcher() @@ -298,6 +321,7 @@ def test_fmp_institutional_ownership_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_company_overview_fetcher(credentials=test_credentials): + """Test FMP company overview fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPCompanyOverviewFetcher() @@ -307,6 +331,7 @@ def test_fmp_company_overview_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_insider_trading_fetcher(credentials=test_credentials): + """Test FMP insider trading fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPInsiderTradingFetcher() @@ -316,6 +341,7 @@ def test_fmp_insider_trading_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_equity_ownership_fetcher(credentials=test_credentials): + """Test FMP equity ownership fetcher.""" params = {"symbol": "AAPL", "date": date(2022, 12, 31)} fetcher = FMPEquityOwnershipFetcher() @@ -325,6 +351,7 @@ def test_fmp_equity_ownership_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_price_target_consensus_fetcher(credentials=test_credentials): + """Test FMP price target consensus fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPPriceTargetConsensusFetcher() @@ -334,6 +361,7 @@ def test_fmp_price_target_consensus_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_price_target_fetcher(credentials=test_credentials): + """Test FMP price target fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPPriceTargetFetcher() @@ -343,6 +371,7 @@ def test_fmp_price_target_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_analyst_estimates_fetcher(credentials=test_credentials): + """Test FMP analyst estimates fetcher.""" params = {"symbol": "AAPL", "limit": 30} fetcher = FMPAnalystEstimatesFetcher() @@ -352,6 +381,7 @@ def test_fmp_analyst_estimates_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_historical_eps_fetcher(credentials=test_credentials): + """Test FMP historical EPS fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPHistoricalEpsFetcher() @@ -361,6 +391,7 @@ def test_fmp_historical_eps_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_earnings_call_transcript_fetcher(credentials=test_credentials): + """Test FMP earnings call transcript fetcher.""" params = {"symbol": "AAPL", "year": 2020} fetcher = FMPEarningsCallTranscriptFetcher() @@ -370,6 +401,7 @@ def test_fmp_earnings_call_transcript_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_historical_splits_fetcher(credentials=test_credentials): + """Test FMP historical splits fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPHistoricalSplitsFetcher() @@ -379,6 +411,7 @@ def test_fmp_historical_splits_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_calendar_splits_fetcher(credentials=test_credentials): + """Test FMP calendar splits fetcher.""" params = {"start_date": date(2023, 1, 1), "end_date": date(2023, 1, 10)} fetcher = FMPCalendarSplitsFetcher() @@ -388,6 +421,7 @@ def test_fmp_calendar_splits_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_historical_dividends_fetcher(credentials=test_credentials): + """Test FMP historical dividends fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPHistoricalDividendsFetcher() @@ -397,6 +431,7 @@ def test_fmp_historical_dividends_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_key_metrics_fetcher(credentials=test_credentials): + """Test FMP key metrics fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPKeyMetricsFetcher() @@ -406,6 +441,7 @@ def test_fmp_key_metrics_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_treasury_rates_fetcher(credentials=test_credentials): + """Test FMP treasury rates fetcher.""" params = {"start_date": date(2023, 1, 1), "end_date": date(2023, 5, 10)} fetcher = FMPTreasuryRatesFetcher() @@ -415,6 +451,7 @@ def test_fmp_treasury_rates_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_executive_compensation_fetcher(credentials=test_credentials): + """Test FMP executive compensation fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPExecutiveCompensationFetcher() @@ -424,6 +461,7 @@ def test_fmp_executive_compensation_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_currency_pairs_fetcher(credentials=test_credentials): + """Test FMP currency pairs fetcher.""" params = {} fetcher = FMPCurrencyPairsFetcher() @@ -433,6 +471,7 @@ def test_fmp_currency_pairs_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_equity_peers_fetcher(credentials=test_credentials): + """Test FMP equity peers fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPEquityPeersFetcher() @@ -442,6 +481,7 @@ def test_fmp_equity_peers_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_equity_valuation_multiples_fetcher(credentials=test_credentials): + """Test FMP equity valuation multiples fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPEquityValuationMultiplesFetcher() @@ -451,6 +491,7 @@ def test_fmp_equity_valuation_multiples_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_historical_employees_fetcher(credentials=test_credentials): + """Test FMP historical employees fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPHistoricalEmployeesFetcher() @@ -460,6 +501,7 @@ def test_fmp_historical_employees_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_risk_premium_fetcher(credentials=test_credentials): + """Test FMP risk premium fetcher.""" params = {} fetcher = FMPRiskPremiumFetcher() @@ -469,6 +511,7 @@ def test_fmp_risk_premium_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_index_constituents_fetcher(credentials=test_credentials): + """Test FMP index constituents fetcher.""" params = {} fetcher = FMPIndexConstituentsFetcher() @@ -478,6 +521,7 @@ def test_fmp_index_constituents_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_calendar_dividend_fetcher(credentials=test_credentials): + """Test FMP calendar dividend fetcher.""" params = {"start_date": date(2023, 11, 6), "end_date": date(2023, 11, 10)} fetcher = FMPCalendarDividendFetcher() @@ -487,6 +531,7 @@ def test_fmp_calendar_dividend_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_equity_quote_fetcher(credentials=test_credentials): + """Test FMP equity quote fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPEquityQuoteFetcher() @@ -496,6 +541,7 @@ def test_fmp_equity_quote_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_equity_screener_fetcher(credentials=test_credentials): + """Test FMP equity screener fetcher.""" params = {"query": "midstream", "sector": "Energy", "beta_max": 0.5} fetcher = FMPEquityScreenerFetcher() @@ -505,6 +551,7 @@ def test_fmp_equity_screener_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_financial_ratios_fetcher(credentials=test_credentials): + """Test FMP financial ratios fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPFinancialRatiosFetcher() @@ -514,6 +561,7 @@ def test_fmp_financial_ratios_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_economic_calendar_fetcher(credentials=test_credentials): + """Test FMP economic calendar fetcher.""" params = {} fetcher = FMPEconomicCalendarFetcher() @@ -523,6 +571,7 @@ def test_fmp_economic_calendar_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_market_snapshots_fetcher(credentials=test_credentials): + """Test FMP market snapshots fetcher.""" params = {"market": "lse"} fetcher = FMPMarketSnapshotsFetcher() @@ -532,6 +581,7 @@ def test_fmp_market_snapshots_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_etf_search_fetcher(credentials=test_credentials): + """Test FMP ETF search fetcher.""" params = {"query": "India"} fetcher = FMPEtfSearchFetcher() @@ -541,6 +591,7 @@ def test_fmp_etf_search_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_etf_info_fetcher(credentials=test_credentials): + """Test FMP ETF info fetcher.""" params = {"symbol": "IOO"} fetcher = FMPEtfInfoFetcher() @@ -550,6 +601,7 @@ def test_fmp_etf_info_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_etf_sectors_fetcher(credentials=test_credentials): + """Test FMP ETF sectors fetcher.""" params = {"symbol": "IOO"} fetcher = FMPEtfSectorsFetcher() @@ -559,6 +611,7 @@ def test_fmp_etf_sectors_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_etf_holdings_fetcher(credentials=test_credentials): + """Test FMP ETF holdings fetcher.""" params = {"symbol": "IOO", "date": date(2022, 12, 31)} fetcher = FMPEtfHoldingsFetcher() @@ -568,6 +621,7 @@ def test_fmp_etf_holdings_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_etf_holdings_date_fetcher(credentials=test_credentials): + """Test FMP ETF holdings date fetcher.""" params = {"symbol": "IOO"} fetcher = FMPEtfHoldingsDateFetcher() @@ -577,6 +631,7 @@ def test_fmp_etf_holdings_date_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_price_performance_fetcher(credentials=test_credentials): + """Test FMP price performance fetcher.""" params = {"symbol": "AAPL,SPY,QQQ,MSFT,AMZN,GOOG"} fetcher = FMPPricePerformanceFetcher() @@ -586,6 +641,7 @@ def test_fmp_price_performance_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_etf_countries_fetcher(credentials=test_credentials): + """Test FMP ETF countries fetcher.""" params = {"symbol": "VTI,QQQ,VOO,IWM"} fetcher = FMPEtfCountriesFetcher() @@ -595,7 +651,8 @@ def test_fmp_etf_countries_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_etf_holdings_performance_fetcher(credentials=test_credentials): - params = {"symbol": "SILJ"} + """Test FMP ETF holdings performance fetcher.""" + params = {"symbol": "QQQ"} fetcher = FMPEtfHoldingsPerformanceFetcher() result = fetcher.test(params, credentials) @@ -604,6 +661,7 @@ def test_fmp_etf_holdings_performance_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_discovery_filings_fetcher(credentials=test_credentials): + """Test FMP discovery filings fetcher.""" params = { "start_date": None, "end_date": None, @@ -619,6 +677,7 @@ def test_fmp_discovery_filings_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_crypto_search_fetcher(credentials=test_credentials): + """Test FMP crypto search fetcher.""" params = {"query": "asd"} fetcher = FMPCryptoSearchFetcher() @@ -628,6 +687,7 @@ def test_fmp_crypto_search_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_calendar_earnings_fetcher(credentials=test_credentials): + """Test FMP calendar earnings fetcher.""" params = {"symbol": "AAPL"} params = { @@ -641,6 +701,7 @@ def test_fmp_calendar_earnings_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_equity_profile_fetcher(credentials=test_credentials): + """Test FMP equity profile fetcher.""" params = {"symbol": "AAPL"} fetcher = FMPEquityProfileFetcher() @@ -650,6 +711,7 @@ def test_fmp_equity_profile_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_etf_equity_exposure_fetcher(credentials=test_credentials): + """Test FMP ETF equity exposure fetcher.""" params = {"symbol": "AAPL,MSFT"} fetcher = FMPEtfEquityExposureFetcher() @@ -659,6 +721,7 @@ def test_fmp_etf_equity_exposure_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_fmp_currency_snapshots_fetcher(credentials=test_credentials): + """Test FMP currency snapshots fetcher.""" params = { "base": "XAU", "quote_type": "indirect", @@ -668,3 +731,18 @@ def test_fmp_currency_snapshots_fetcher(credentials=test_credentials): fetcher = FMPCurrencySnapshotsFetcher() result = fetcher.test(params, credentials) assert result is None + + +@pytest.mark.record_http +def test_fmp_equity_forward_eps_fetcher(credentials=test_credentials): + """Test FMP forward EPS estimates fetcher.""" + params = { + "symbol": "MSFT,AAPL", + "fiscal_period": "annual", + "include_historical": False, + "limit": None, + } + + fetcher = FMPForwardEpsEstimatesFetcher() + result = fetcher.test(params, credentials) + assert result is None diff --git a/openbb_platform/providers/fred/openbb_fred/models/series.py b/openbb_platform/providers/fred/openbb_fred/models/series.py index 35db3d0a2a5..7c1108e73f3 100644 --- a/openbb_platform/providers/fred/openbb_fred/models/series.py +++ b/openbb_platform/providers/fred/openbb_fred/models/series.py @@ -1,10 +1,9 @@ """FRED Series Model.""" -import json -import warnings from typing import Any, Dict, List, Literal, Optional import pandas as pd +from openbb_core.provider.abstract.annotated_result import AnnotatedResult from openbb_core.provider.abstract.fetcher import Fetcher from openbb_core.provider.standard_models.fred_series import ( SeriesData, @@ -19,8 +18,6 @@ from openbb_core.provider.utils.helpers import ( ) from pydantic import Field -_warn = warnings.warn - class FredSeriesQueryParams(SeriesQueryParams): """FRED Series Query Params.""" @@ -145,9 +142,18 @@ class FredSeriesFetcher( f"{metadata_url}?series_id={series_id}&file_type=json&api_key={api_key}", timeout=5, ) - _metadata = metadata_response.get("seriess", [{}])[0] - observations = observations_response.get("observations") + # seriess is not a typo, it's the actual key in the response + _metadata = ( + metadata_response.get("seriess", [{}])[0] + if isinstance(metadata_response, dict) + else {} + ) or {} + observations = ( + observations_response.get("observations") + if isinstance(observations_response, dict) + else [] + ) or [] try: for d in observations: d.pop("realtime_start") @@ -177,24 +183,18 @@ class FredSeriesFetcher( results = await amake_requests(urls, callback, timeout=5, **kwargs) - metadata, data = {}, {} - for item in results: - for series_id, result in item.items(): - data[series_id] = result.pop("data") - metadata[series_id] = result - - _warn(json.dumps(metadata)) - - return data + return results # pylint: disable=unused-argument @staticmethod def transform_data( - query: FredSeriesQueryParams, data: Dict, **kwargs: Any - ) -> List[FredSeriesData]: + query: FredSeriesQueryParams, data: List[Dict[str, Any]], **kwargs: Any + ) -> AnnotatedResult[List[FredSeriesData]]: """Transform data.""" - results = ( - pd.DataFrame(data) + series = {_id: s.pop("data", {}) for d in data for _id, s in d.items()} + metadata = {_id: m for d in data for _id, m in d.items()} + records = ( + pd.DataFrame(series) .filter(items=query.symbol.split(","), axis=1) .reset_index() .rename(columns={"index": "date"}) @@ -202,4 +202,5 @@ class FredSeriesFetcher( .replace("N/A", None) .to_dict("records") ) - return [FredSeriesData.model_validate(d) for d in results] + validated = [FredSeriesData.model_validate(r) for r in records] + return AnnotatedResult(result=validated, metadata=metadata) diff --git a/openbb_platform/providers/fred/poetry.lock b/openbb_platform/providers/fred/poetry.lock index 1f872410758..45aff8d211b 100644 --- a/openbb_platform/providers/fred/poetry.lock +++ b/openbb_platform/providers/fred/poetry.lock @@ -697,13 +697,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1416,4 +1416,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e5a1c1f22e0b8e42343cef04f6f23281c7d6441df13f2be91584098c856ab1f0" +content-hash = "ca421fe0dbae56150a2fc3a7978ad65f3dd4e70025bc4da4a7f1338b8eca522c" diff --git a/openbb_platform/providers/fred/pyproject.toml b/openbb_platform/providers/fred/pyproject.toml index 7ef38fef193..9c40534c1e6 100644 --- a/openbb_platform/providers/fred/pyproject.toml +++ b/openbb_platform/providers/fred/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-fred" -version = "1.1.4" +version = "1.1.5" description = "FRED extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_fred" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/providers/government_us/__init__.py b/openbb_platform/providers/government_us/__init__.py index e69de29bb2d..da089bdfadf 100644 --- a/openbb_platform/providers/government_us/__init__.py +++ b/openbb_platform/providers/government_us/__init__.py @@ -0,0 +1 @@ +"""Government US provider.""" diff --git a/openbb_platform/providers/government_us/openbb_government_us/models/treasury_prices.py b/openbb_platform/providers/government_us/openbb_government_us/models/treasury_prices.py index 15e7e1bb0d0..a4fcc6efcca 100644 --- a/openbb_platform/providers/government_us/openbb_government_us/models/treasury_prices.py +++ b/openbb_platform/providers/government_us/openbb_government_us/models/treasury_prices.py @@ -1,4 +1,4 @@ -"""US Government Treasury Prices""" +"""US Government Treasury Prices.""" # pylint: disable=unused-argument import asyncio @@ -38,12 +38,13 @@ class GovernmentUSTreasuryPricesFetcher( List[GovernmentUSTreasuryPricesData], ] ): + """US Government Treasury Prices Fetcher.""" + @staticmethod def transform_query( params: Dict[str, Any] ) -> GovernmentUSTreasuryPricesQueryParams: """Transform query params.""" - if params.get("date") is None: _date = datetime.now().date() else: @@ -66,7 +67,6 @@ class GovernmentUSTreasuryPricesFetcher( **kwargs: Any, ) -> str: """Extract the raw data from US Treasury website.""" - url = "https://treasurydirect.gov/GA-FI/FedInvest/securityPriceDetail" HEADERS = { @@ -110,7 +110,6 @@ class GovernmentUSTreasuryPricesFetcher( **kwargs: Any, ) -> List[GovernmentUSTreasuryPricesData]: """Transform the data.""" - try: if not data: raise EmptyDataError("Data not found") diff --git a/openbb_platform/providers/government_us/openbb_government_us/utils/__init__.py b/openbb_platform/providers/government_us/openbb_government_us/utils/__init__.py index e69de29bb2d..7267bae0ade 100644 --- a/openbb_platform/providers/government_us/openbb_government_us/utils/__init__.py +++ b/openbb_platform/providers/government_us/openbb_government_us/utils/__init__.py @@ -0,0 +1 @@ +"""OpenBB Government US utils.""" diff --git a/openbb_platform/providers/government_us/poetry.lock b/openbb_platform/providers/government_us/poetry.lock index 28867b4b6fa..66b30afa37e 100644 --- a/openbb_platform/providers/government_us/poetry.lock +++ b/openbb_platform/providers/government_us/poetry.lock @@ -682,13 +682,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1412,4 +1412,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "8f3447e01cd72ffec4124073365a6c63ca7e506cfd52f41229898de66b659e74" +content-hash = "359d61fc578ab8392f652c695d09f81e572886b70973b986dac03b5a24e5b654" diff --git a/openbb_platform/providers/government_us/pyproject.toml b/openbb_platform/providers/government_us/pyproject.toml index f7cf8a79133..ba618f38b98 100644 --- a/openbb_platform/providers/government_us/pyproject.toml +++ b/openbb_platform/providers/government_us/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-government-us" -version = "1.1.4" +version = "1.1.5" description = "US Government Data Extension for OpenBB" authors = ["OpenBB "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_government_us" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" random-user-agent = "^1.0.1" [build-system] diff --git a/openbb_platform/providers/government_us/tests/__init__.py b/openbb_platform/providers/government_us/tests/__init__.py index e69de29bb2d..6af19936d32 100644 --- a/openbb_platform/providers/government_us/tests/__init__.py +++ b/openbb_platform/providers/government_us/tests/__init__.py @@ -0,0 +1 @@ +"""Government US tests.""" diff --git a/openbb_platform/providers/intrinio/__init__.py b/openbb_platform/providers/intrinio/__init__.py index e69de29bb2d..a87030559a5 100644 --- a/openbb_platform/providers/intrinio/__init__.py +++ b/openbb_platform/providers/intrinio/__init__.py @@ -0,0 +1 @@ +"""Intrinio provider.""" diff --git a/openbb_platform/providers/intrinio/openbb_intrinio/__init__.py b/openbb_platform/providers/intrinio/openbb_intrinio/__init__.py index 49af00c352b..389dc782cb6 100644 --- a/openbb_platform/providers/intrinio/openbb_intrinio/__init__.py +++ b/openbb_platform/providers/intrinio/openbb_intrinio/__init__.py @@ -18,6 +18,12 @@ from openbb_intrinio.models.etf_price_performance import ( ) from openbb_intrinio.models.etf_search import IntrinioEtfSearchFetcher from openbb_intrinio.models.financial_ratios import IntrinioFinancialRatiosFetcher +from openbb_intrinio.models.forward_eps_estimates import ( + IntrinioForwardEpsEstimatesFetcher, +) +from openbb_intrinio.models.forward_sales_estimates import ( + IntrinioForwardSalesEstimatesFetcher, +) from openbb_intrinio.models.fred_series import IntrinioFredSeriesFetcher from openbb_intrinio.models.historical_attributes import ( IntrinioHistoricalAttributesFetcher, @@ -37,6 +43,9 @@ from openbb_intrinio.models.latest_attributes import IntrinioLatestAttributesFet from openbb_intrinio.models.market_snapshots import IntrinioMarketSnapshotsFetcher from openbb_intrinio.models.options_chains import IntrinioOptionsChainsFetcher from openbb_intrinio.models.options_unusual import IntrinioOptionsUnusualFetcher +from openbb_intrinio.models.price_target_consensus import ( + IntrinioPriceTargetConsensusFetcher, +) from openbb_intrinio.models.reported_financials import IntrinioReportedFinancialsFetcher from openbb_intrinio.models.search_attributes import ( IntrinioSearchAttributesFetcher, @@ -67,6 +76,8 @@ intrinio_provider = Provider( "EtfPricePerformance": IntrinioEtfPricePerformanceFetcher, "EtfSearch": IntrinioEtfSearchFetcher, "FinancialRatios": IntrinioFinancialRatiosFetcher, + "ForwardEpsEstimates": IntrinioForwardEpsEstimatesFetcher, + "ForwardSalesEstimates": IntrinioForwardSalesEstimatesFetcher, "FredSeries": IntrinioFredSeriesFetcher, "HistoricalAttributes": IntrinioHistoricalAttributesFetcher, "HistoricalDividends": IntrinioHistoricalDividendsFetcher, @@ -80,6 +91,7 @@ intrinio_provider = Provider( "MarketSnapshots": IntrinioMarketSnapshotsFetcher, "OptionsChains": IntrinioOptionsChainsFetcher, "OptionsUnusual": IntrinioOptionsUnusualFetcher, + "PriceTargetConsensus": IntrinioPriceTargetConsensusFetcher, "ReportedFinancials": IntrinioReportedFinancialsFetcher, "SearchAttributes": IntrinioSearchAttributesFetcher, "ShareStatistics": IntrinioShareStatisticsFetcher, diff --git a/openbb_platform/providers/intrinio/openbb_intrinio/models/equity_info.py b/openbb_platform/providers/intrinio/openbb_intrinio/models/equity_info.py index 6488dbd7025..21c8d7d44af 100644 --- a/openbb_platform/providers/intrinio/openbb_intrinio/models/equity_info.py +++ b/openbb_platform/providers/intrinio/openbb_intrinio/models/equity_info.py @@ -74,5 +74,5 @@ class IntrinioEquityInfoFetcher( data: List[Dict], **kwargs: Any, ) -> List[IntrinioEquityInfoData]: - """Transforms the data.""" + """Transform the data.""" return [IntrinioEquityInfoData.model_validate(d) for d in data] diff --git a/openbb_platform/providers/intrinio/openbb_intrinio/models/etf_holdings.py b/openbb_platform/providers/intrinio/openbb_intrinio/models/etf_holdings.py index 52d546bf002..6843380c2f8 100644 --- a/openbb_platform/providers/intrinio/openbb_intrinio/models/etf_holdings.py +++ b/openbb_platform/providers/intrinio/openbb_intrinio/models/etf_holdings.py @@ -10,6 +10,7 @@ from openbb_core.provider.standard_models.etf_holdings import ( EtfHoldingsData, EtfHoldingsQueryParams, ) +from openbb_core.provider.utils.descriptions import QUERY_DESCRIPTIONS from openbb_core.provider.utils.helpers import ( ClientResponse, ClientSession, @@ -25,6 +26,12 @@ class IntrinioEtfHoldingsQueryParams(EtfHoldingsQueryParams): Source: https://docs.intrinio.com/documentation/web_api/get_etf_holdings_v2 """ + __alias_dict__ = {"date": "as_of_date"} + + date: Optional[dateType] = Field( + default=None, description=QUERY_DESCRIPTIONS.get("date", "") + ) + class IntrinioEtfHoldingsData(EtfHoldingsData): """Intrinio ETF Holdings Data.""" @@ -145,14 +152,12 @@ class IntrinioEtfHoldingsFetcher( **kwargs: Any, ) -> List[Dict]: """Return the raw data from the Intrinio endpoint.""" - api_key = credentials.get("intrinio_api_key") if credentials else "" - symbol = query.symbol + ":US" if ":" not in query.symbol else query.symbol - URL = f"https://api-v2.intrinio.com/etfs/{symbol}/holdings?page_size=10000&api_key={api_key}" - - data = [] + if query.date: + URL += f"&as_of_date={query.date}" + data: List = [] async def response_callback(response: ClientResponse, session: ClientSession): """Async response callback.""" diff --git a/openbb_platform/providers/intrinio/openbb_intrinio/models/forward_eps_estimates.py b/openbb_platform/providers/intrinio/openbb_intrinio/models/forward_eps_estimates.py new file mode 100644 index 00000000000..294428c3055 --- /dev/null +++ b/openbb_platform/providers/intrinio/openbb_intrinio/models/forward_eps_estimates.py @@ -0,0 +1,229 @@ +"""Intrinio Forward EPS Estimates Model.""" + +# pylint: disable=unused-argument + +import asyncio +from datetime import datetime +from typing import Any, Dict, List, Literal, Optional, Union +from warnings import warn + +from openbb_core.provider.abstract.fetcher import Fetcher +from openbb_core.provider.standard_models.forward_eps_estimates import ( + ForwardEpsEstimatesData, + ForwardEpsEstimatesQueryParams, +) +from openbb_core.provider.utils.errors import EmptyDataError +from openbb_core.provider.utils.helpers import ( + amake_request, + get_querystring, +) +from openbb_intrinio.utils.helpers import response_callback +from pydantic import Field, field_validator, model_validator + + +class IntrinioForwardEpsEstimatesQueryParams(ForwardEpsEstimatesQueryParams): + """Intrinio Forward EPS Estimates Query. + + https://docs.intrinio.com/documentation/web_api/get_zacks_sales_estimates_v2 + """ + + __json_schema_extra__ = {"symbol": ["multiple_items_allowed"]} + + fiscal_year: Optional[int] = Field( + default=None, + description="The future fiscal year to retrieve estimates for." + + " When no symbol and year is supplied the current calendar year is used.", + ) + fiscal_period: Union[Literal["fy", "q1", "q2", "q3", "q4"], None] = Field( + default=None, + description="The future fiscal period to retrieve estimates for.", + ) + calendar_year: Optional[int] = Field( + default=None, + description="The future calendar year to retrieve estimates for." + + " When no symbol and year is supplied the current calendar year is used.", + ) + calendar_period: Union[Literal["q1", "q2", "q3", "q4"], None] = Field( + default=None, + description="The future calendar period to retrieve estimates for.", + ) + + @model_validator(mode="after") + @classmethod + def validate_choices(cls, values): + """Validate the model and set a safe default state.""" + if values.symbol is None and ( + values.calendar_year is None and values.fiscal_year is None + ): + values.calendar_year = datetime.now().year + return values + + +class IntrinioForwardEpsEstimatesData(ForwardEpsEstimatesData): + """Intrinio Forward EPS Estimates Data.""" + + __alias_dict__ = { + "high_estimate": "high", + "low_estimate": "low", + "number_of_analysts": "count", + "mean": "estimated_sales_mean", + "revisions_change_percent": "percent_change", + "mean_1w": "mean_7_days_ago", + "mean_1m": "mean_30_days_ago", + "mean_2m": "mean_60_days_ago", + "mean_3m": "mean_90_days_ago", + } + + revisions_change_percent: Optional[float] = Field( + default=None, + description="The earnings per share (EPS) percent change in estimate for the period.", + json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100}, + ) + mean_1w: Optional[float] = Field( + default=None, + description="The mean estimate for the period one week ago.", + ) + mean_1m: Optional[float] = Field( + default=None, + description="The mean estimate for the period one month ago.", + ) + mean_2m: Optional[float] = Field( + default=None, + description="The mean estimate for the period two months ago.", + ) + mean_3m: Optional[float] = Field( + default=None, + description="The mean estimate for the period three months ago.", + ) + + @field_validator( + "revisions_change_percent", + mode="before", + check_fields=False, + ) + @classmethod + def normalize_percent( + cls, v: Optional[Union[int, float]] + ) -> Optional[Union[int, float]]: + """Normalize percent values.""" + return v / 100 if v else None + + +class IntrinioForwardEpsEstimatesFetcher( + Fetcher[ + IntrinioForwardEpsEstimatesQueryParams, List[IntrinioForwardEpsEstimatesData] + ] +): + """Intrinio Forward EPS Estimates Fetcher.""" + + @staticmethod + def transform_query( + params: Dict[str, Any] + ) -> IntrinioForwardEpsEstimatesQueryParams: + """Transform the query params.""" + return IntrinioForwardEpsEstimatesQueryParams(**params) + + @staticmethod + async def aextract_data( + query: IntrinioForwardEpsEstimatesQueryParams, + credentials: Optional[Dict[str, str]], + **kwargs: Any, + ) -> List[Dict]: + """Return the raw data from the Intrinio endpoint.""" + api_key = credentials.get("intrinio_api_key") if credentials else "" + + BASE_URL = "https://api-v2.intrinio.com/zacks/eps_estimates?page_size=10000" + + symbols = query.symbol.split(",") if query.symbol else None + + query_str = get_querystring( + query.model_dump(by_alias=True), + ["symbol", "calendar_period", "fiscal_period", "limit"], + ) + + results: List[Dict] = [] + + async def get_one(symbol): + """Get the data for one symbol.""" + url = f"{BASE_URL}&identifier={symbol}&{query_str}&api_key={api_key}" + new_data: List[Dict] = [] + data = await amake_request( + url, response_callback=response_callback, **kwargs + ) + if not data or not isinstance(data, dict) or not data.get("estimates"): + warn(f"Symbol Error: No data found for {symbol}") + if isinstance(data, dict) and data.get("estimates"): + new_data = data.get("estimates") # type: ignore + if new_data: + results.extend(new_data) + + if symbols: + await asyncio.gather(*[get_one(symbol) for symbol in symbols]) + return results + + async def fetch_callback(response, session): + """Use callback for pagination.""" + data = await response.json() + messages = data.get("messages", None) + if messages: + raise RuntimeError(str(messages)) + if data.get("estimates") and len(data.get("estimates")) > 0: # type: ignore + results.extend(data.get("estimates")) # type: ignore + while data.get("next_page"): # type: ignore + next_page = data["next_page"] # type: ignore + next_url = f"{url}&next_page={next_page}" + data = await amake_request(next_url, session=session, **kwargs) + if ( + "estimates" in data + and len(data.get("estimates")) > 0 # type: ignore + ): + results.extend(data.get("estimates")) # type: ignore + return results + + url = f"{BASE_URL}&{query_str}&api_key={api_key}" + + results = await amake_request(url, response_callback=fetch_callback, **kwargs) # type: ignore + + if not results: + raise EmptyDataError("The request was successful but was returned empty.") + + return results + + @staticmethod + def transform_data( + query: IntrinioForwardEpsEstimatesQueryParams, + data: List[Dict], + **kwargs: Any, + ) -> List[IntrinioForwardEpsEstimatesData]: + """Transform the raw data into the standard format.""" + symbols = query.symbol.split(",") if query.symbol else [] + results: List[IntrinioForwardEpsEstimatesData] = [] + for item in sorted( + data, + key=lambda item: ( # type: ignore + ( + symbols.index(item.get("symbol")) if item.get("symbol") in symbols else len(symbols), # type: ignore + item.get("date"), + ) + if symbols + else item.get("date") + ), + ): + temp: Dict[str, Any] = {} + company = item.pop("company") + if company.get("ticker") is None: + continue + temp["symbol"] = company.get("ticker") + temp["name"] = company.get("name") + if query.fiscal_period and query.fiscal_period.upper() != item.get( + "fiscal_period" + ): + continue + if query.calendar_period and query.calendar_period.upper() != item.get( + "calendar_period" + ): + continue + temp.update(item) + results.append(IntrinioForwardEpsEstimatesData.model_validate(temp)) + + return results diff --git a/openbb_platform/providers/intrinio/openbb_intrinio/models/forward_sales_estimates.py b/openbb_platform/providers/intrinio/openbb_intrinio/models/forward_sales_estimates.py new file mode 100644 index 00000000000..c57ad52cfcb --- /dev/null +++ b/openbb_platform/providers/intrinio/openbb_intrinio/models/forward_sales_estimates.py @@ -0,0 +1,248 @@ +"""Intrinio Forward Sales Estimates Model.""" + +# pylint: disable=unused-argument + +import asyncio +from datetime import datetime +from typing import Any, Dict, List, Literal, Optional, Union +from warnings import warn + +from openbb_core.provider.abstract.fetcher import Fetcher +from openbb_core.provider.standard_models.forward_sales_estimates import ( + ForwardSalesEstimatesData, + ForwardSalesEstimatesQueryParams, +) +from openbb_core.provider.utils.errors import EmptyDataError +from openbb_core.provider.utils.helpers import ( + amake_request, + get_querystring, +) +from openbb_intrinio.utils.helpers import response_callback +from pydantic import Field, field_validator, model_validator + + +class IntrinioForwardSalesEstimatesQueryParams(ForwardSalesEstimatesQueryParams): + """Intrinio Forward Sales Estimates Query. + + https://docs.intrinio.com/documentation/web_api/get_zacks_sales_estimates_v2 + """ + + __json_schema_extra__ = {"symbol": ["multiple_items_allowed"]} + + fiscal_year: Optional[int] = Field( + default=None, + description="The future fiscal year to retrieve estimates for." + + " When no symbol and year is supplied the current calendar year is used.", + ) + fiscal_period: Union[Literal["fy", "q1", "q2", "q3", "q4"], None] = Field( + default=None, + description="The future fiscal period to retrieve estimates for.", + ) + calendar_year: Optional[int] = Field( + default=None, + description="The future calendar year to retrieve estimates for." + + " When no symbol and year is supplied the current calendar year is used.", + ) + calendar_period: Union[Literal["q1", "q2", "q3", "q4"], None] = Field( + default=None, + description="The future calendar period to retrieve estimates for.", + ) + + @model_validator(mode="after") + @classmethod + def validate_choices(cls, values): + """Validate the model and set a safe default state.""" + if values.symbol is None and ( + values.calendar_year is None and values.fiscal_year is None + ): + values.calendar_year = datetime.now().year + return values + + +class IntrinioForwardSalesEstimatesData(ForwardSalesEstimatesData): + """Intrinio Forward Sales Estimates Data.""" + + __alias_dict__ = { + "low_estimate": "low", + "high_estimate": "high", + "number_of_analysts": "count", + "mean": "estimated_sales_mean", + "revisions_1w_up": "analyst_revisions_up_1w", + "revisions_1w_down": "analyst_revisions_down_1w", + "revisions_1w_change_percent": "analyst_revisions_percent_change_1w", + "revisions_1m_up": "analyst_revisions_up_1m", + "revisions_1m_down": "analyst_revisions_down_1m", + "revisions_1m_change_percent": "analyst_revisions_percent_change_1m", + "revisions_3m_up": "analyst_revisions_up_3m", + "revisions_3m_down": "analyst_revisions_down_3m", + "revisions_3m_change_percent": "analyst_revisions_percent_change_3m", + } + + revisions_1w_up: Optional[int] = Field( + default=None, description="Number of revisions up in the last week." + ) + revisions_1w_down: Optional[int] = Field( + default=None, description="Number of revisions down in the last week." + ) + revisions_1w_change_percent: Optional[float] = Field( + default=None, + description="The analyst revisions percent change in estimate for the period of 1 week.", + json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100}, + ) + revisions_1m_up: Optional[int] = Field( + default=None, description="Number of revisions up in the last month." + ) + revisions_1m_down: Optional[int] = Field( + default=None, description="Number of revisions down in the last month." + ) + revisions_1m_change_percent: Optional[float] = Field( + default=None, + description="The analyst revisions percent change in estimate for the period of 1 month.", + json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100}, + ) + revisions_3m_up: Optional[int] = Field( + default=None, description="Number of revisions up in the last 3 months." + ) + revisions_3m_down: Optional[int] = Field( + default=None, description="Number of revisions down in the last 3 months." + ) + revisions_3m_change_percent: Optional[float] = Field( + default=None, + description="The analyst revisions percent change in estimate for the period of 3 months.", + json_schema_extra={"x-unit_measurement": "percent", "x-frontend_multiply": 100}, + ) + + @field_validator( + "revisions_1w_change_percent", + "revisions_1m_change_percent", + "revisions_3m_change_percent", + mode="before", + check_fields=False, + ) + @classmethod + def normalize_percent( + cls, v: Optional[Union[int, float]] + ) -> Optional[Union[int, float]]: + """Normalize percent values.""" + return v / 100 if v else None + + +class IntrinioForwardSalesEstimatesFetcher( + Fetcher[ + IntrinioForwardSalesEstimatesQueryParams, + List[IntrinioForwardSalesEstimatesData], + ] +): + """Intrinio Forward Sales Estimates Fetcher.""" + + @staticmethod + def transform_query( + params: Dict[str, Any] + ) -> IntrinioForwardSalesEstimatesQueryParams: + """Transform the query params.""" + return IntrinioForwardSalesEstimatesQueryParams(**params) + + @staticmethod + async def aextract_data( + query: IntrinioForwardSalesEstimatesQueryParams, + credentials: Optional[Dict[str, str]], + **kwargs: Any, + ) -> List[Dict]: + """Return the raw data from the Intrinio endpoint.""" + api_key = credentials.get("intrinio_api_key") if credentials else "" + + BASE_URL = "https://api-v2.intrinio.com/zacks/sales_estimates?page_size=10000" + + symbols = query.symbol.split(",") if query.symbol else None + + query_str = get_querystring( + query.model_dump(by_alias=True), + ["symbol", "calendar_period", "fiscal_period", "limit"], + ) + + results: List[Dict] = [] + + async def get_one(symbol): + """Get the data for one symbol.""" + url = f"{BASE_URL}&identifier={symbol}&{query_str}&api_key={api_key}" + new_data: List[Dict] = [] + data = await amake_request( + url, response_callback=response_callback, **kwargs + ) + if not data or not isinstance(data, dict) or not data.get("estimates"): + warn(f"Symbol Error: No data found for {symbol}") + if isinstance(data, dict) and data.get("estimates"): + new_data = data.get("estimates") # type: ignore + if new_data: + results.extend(new_data) + + if symbols: + await asyncio.gather(*[get_one(symbol) for symbol in symbols]) + return results + + async def fetch_callback(response, session): + """Use callback for pagination.""" + data = await response.json() + messages = data.get("messages") + if messages: + raise RuntimeError(str(messages)) + if data.get("estimates") and len(data.get("estimates")) > 0: # type: ignore + results.extend(data.get("estimates")) # type: ignore + while data.get("next_page"): # type: ignore + next_page = data["next_page"] # type: ignore + next_url = f"{url}&next_page={next_page}" + data = await amake_request(next_url, session=session, **kwargs) + if ( + "estimates" in data + and len(data.get("estimates")) > 0 # type: ignore + ): + results.extend(data.get("estimates")) # type: ignore + return results + + url = f"{BASE_URL}&{query_str}&api_key={api_key}" + + results = await amake_request(url, response_callback=fetch_callback, **kwargs) # type: ignore + + if not results: + raise EmptyDataError("The request was successful but was returned empty.") + + return results + + @staticmethod + def transform_data( + query: IntrinioForwardSalesEstimatesQueryParams, + data: List[Dict], + **kwargs: Any, + ) -> List[IntrinioForwardSalesEstimatesData]: + """Transform the raw data into the standard format.""" + symbols = query.symbol.split(",") if query.symbol else [] + results: List[IntrinioForwardSalesEstimatesData] = [] + for item in sorted( + data, + key=lambda item: ( # type: ignore + ( + symbols.index(item.get("symbol")) if item.get("symbol") in symbols else len(symbols), # type: ignore + item.get("date"), + ) + if symbols + else item.get("date") + ), + ): + temp: Dict[str, Any] = {} + company = item.pop("company") + if company.get("ticker") is None: + continue + temp["symbol"] = company.get("ticker") + temp["name"] = company.get("name") + if query.fiscal_period and query.fiscal_period.upper() != item.get( + "fiscal_period" + ): + continue + if query.calendar_period and query.calendar_period.upper() != item.get( + "calendar_period" + ): + continue + temp.update(item) + results.append(IntrinioForwardSalesEstimatesData.model_validate(temp)) + + return results diff --git a/openbb_platform/providers/intrinio/openbb_intrinio/models/historical_attributes.py b/openbb_platform/providers/intrinio/openbb_intrinio/models/historical_attributes.py index 47ce6983108..7c83c3b8d99 100644 --- a/openbb_platform/providers/intrinio/openbb_intrinio/models/historical_attributes.py +++ b/openbb_platform/providers/intrinio/openbb_intrinio/models/historical_attributes.py @@ -1,5 +1,7 @@ """Intrinio Historical Attributes Model.""" +# pylint: disable = unused-argument + import warnings from datetime import datetime from typing import Any, Dict, List, Optional @@ -62,7 +64,7 @@ class IntrinioHistoricalAttributesFetcher( @staticmethod async def aextract_data( - query: IntrinioHistoricalAttributesQueryParams, # pylint: disable=unused-argument + query: IntrinioHistoricalAttributesQueryParams, credentials: Optional[Dict[str, str]], **kwargs: Any, ) -> List[Dict]: @@ -73,7 +75,7 @@ class IntrinioHistoricalAttributesFetcher( query_str = get_querystring(query.model_dump(by_alias=True), ["symbol", "tag"]) def generate_url(symbol: str, tag: str) -> str: - """Returns the url for the given symbol and tag.""" + """Return the url for the given symbol and tag.""" url_params = f"{symbol}/{tag}?{query_str}&api_key={api_key}" url = f"{base_url}/historical_data/{url_params}" return url @@ -84,37 +86,43 @@ class IntrinioHistoricalAttributesFetcher( """Return the response.""" init_response = await response.json() - if message := init_response.get("error") or init_response.get("message"): - warnings.warn(message=message, category=OpenBBWarning) + if message := init_response.get( # type: ignore + "error" + ) or init_response.get( # type: ignore + "message" + ): + warnings.warn(message=str(message), category=OpenBBWarning) return [] - symbol = response.url.parts[-2] - tag = response.url.parts[-1] + symbol = response.url.parts[-2] # type: ignore + tag = response.url.parts[-1] # type: ignore - all_data: list = init_response.get("historical_data", []) + all_data: List = init_response.get("historical_data", []) # type: ignore all_data = [{**item, "symbol": symbol, "tag": tag} for item in all_data] - next_page = init_response.get("next_page", None) + next_page = init_response.get("next_page", None) # type: ignore while next_page: - url = response.url.update_query(next_page=next_page).human_repr() + url = response.url.update_query( # type: ignore + next_page=next_page + ).human_repr() response_data = await session.get_json(url) - if message := response_data.get("error") or response_data.get( + if message := response_data.get("error") or response_data.get( # type: ignore "message" ): warnings.warn(message=message, category=OpenBBWarning) return [] - symbol = response.url.parts[-2] - tag = response_data.url.parts[-1] + symbol = response.url.parts[-2] # type: ignore + tag = response_data.url.parts[-1] # type: ignore - response_data = response_data.get("historical_data", []) + response_data = response_data.get("historical_data", []) # type: ignore response_data = [ {**item, "symbol": symbol, "tag": tag} for item in response_data ] all_data.extend(response_data) - next_page = response_data.get("next_page", None) + next_page = response_data.get("next_page", None) # type: ignore return all_data @@ -128,7 +136,7 @@ class IntrinioHistoricalAttributesFetcher( @staticmethod def transform_data( - query: IntrinioHistoricalAttributesQueryParams, # pylint: disable=unused-argument + query: IntrinioHistoricalAttributesQueryParams, data: List[Dict], **kwargs: Any, ) -> List[IntrinioHistoricalAttributesData]: diff --git a/openbb_platform/providers/intrinio/openbb_intrinio/models/latest_attributes.py b/openbb_platform/providers/intrinio/openbb_intrinio/models/latest_attributes.py index ca635744259..55cf7bc685d 100644 --- a/openbb_platform/providers/intrinio/openbb_intrinio/models/latest_attributes.py +++ b/openbb_platform/providers/intrinio/openbb_intrinio/models/latest_attributes.py @@ -57,7 +57,7 @@ class IntrinioLatestAttributesFetcher( base_url = "https://api-v2.intrinio.com/companies" def generate_url(symbol: str, tag: str) -> str: - """Returns the url for the given symbol and tag.""" + """Return the url for the given symbol and tag.""" return f"{base_url}/{symbol}/data_point/{tag}?api_key={api_key}" async def callback(response: ClientResponse, _: Any) -> Dict: @@ -68,7 +68,8 @@ class IntrinioLatestAttributesFetcher( "error" in response_data or "message" in response_data ): warnings.warn( - message=response_data.get("error") or response_data.get("message"), + message=str(response_data.get("error")) + or str(response_data.get("message")), category=OpenBBWarning, ) return {} diff --git a/openbb_platform/providers/intrinio/openbb_intrinio/models/market_snapshots.py b/openbb_platform/providers/intrinio/openbb_intrinio/models/market_snapshots.py index 2cb54996683..3e8f24879f5 100644 --- a/openbb_platform/providers/intrinio/openbb_intrinio/models/market_snapshots.py +++ b/openbb_platform/providers/intrinio/openbb_intrinio/models/market_snapshots.py @@ -7,6 +7,7 @@ import gzip from datetime import ( date as dateType, datetime, + timezone as datetime_timezone, ) from io import BytesIO from typing import Any, Dict, List, Optional, Union @@ -16,7 +17,7 @@ from openbb_core.provider.standard_models.market_snapshots import ( MarketSnapshotsData, MarketSnapshotsQueryParams, ) -from openbb_core.provider.utils.helpers import amake_request +from openbb_core.provider.utils.helpers import amake_request, safe_fromtimestamp from pandas import DataFrame, notna, read_csv, to_datetime from pydantic import Field from pytz import timezone @@ -105,7 +106,7 @@ class IntrinioMarketSnapshotsFetcher( dt = transformed_params["date"] dt = dt.astimezone(tz=timezone("America/New_York")) if isinstance(transformed_params["date"], dateType): - dt = transformed_params["date"] + dt = transformed_params["date"] # type: ignore if isinstance(dt, dateType): dt = datetime( dt.year, @@ -143,7 +144,6 @@ class IntrinioMarketSnapshotsFetcher( **kwargs: Any, ) -> List[Dict]: """Return the raw data from the Intrinio endpoint.""" - api_key = credentials.get("intrinio_api_key") if credentials else "" # This gets the URL to the actual file. @@ -216,7 +216,7 @@ class IntrinioMarketSnapshotsFetcher( to_datetime( df[col].apply( lambda x: ( - datetime.fromtimestamp(x, tz=timezone("UTC")) + safe_fromtimestamp(x, tz=datetime_timezone.utc) if notna(x) else x ) diff --git a/openbb_platform/providers/intrinio/openbb_intrinio/models/price_target_consensus.py b/openbb_platform/providers/intrinio/openbb_intrinio/models/price_target_consensus.py new file mode 100644 index 00000000000..fcf1a99c4a4 --- /dev/null +++ b/openbb_platform/providers/intrinio/openbb_intrinio/models/price_target_consensus.py @@ -0,0 +1,182 @@ +"""Intrinio Price Target Consensus Model.""" + +# pylint: disable=unused-argument + +import asyncio +from datetime import date as dateType +from typing import Any, Dict, List, Optional +from warnings import warn + +from openbb_core.provider.abstract.fetcher import Fetcher +from openbb_core.provider.standard_models.price_target_consensus import ( + PriceTargetConsensusData, + PriceTargetConsensusQueryParams, +) +from openbb_core.provider.utils.errors import EmptyDataError +from openbb_core.provider.utils.helpers import ( + amake_request, + get_querystring, +) +from openbb_intrinio.utils.helpers import response_callback +from pydantic import Field + + +class IntrinioPriceTargetConsensusQueryParams(PriceTargetConsensusQueryParams): + """Intrinio Price Target Consensus Query. + + https://docs.intrinio.com/documentation/web_api/get_zacks_sales__v2 + """ + + __json_schema_extra__ = {"symbol": ["multiple_items_allowed"]} + + industry_group_number: Optional[int] = Field( + default=None, + description="The Zacks industry group number.", + ) + + +class IntrinioPriceTargetConsensusData(PriceTargetConsensusData): + """Intrinio Price Target Consensus Data.""" + + __alias_dict__ = { + "symbol": "ticker", + "name": "company_name", + "target_high": "high", + "target_low": "low", + "target_consensus": "mean", + "target_median": "median", + } + standard_deviation: Optional[float] = Field( + default=None, + description="The standard deviation of target price estimates.", + ) + total_anaylsts: Optional[int] = Field( + default=None, + description="The total number of target price estimates in consensus.", + ) + raised: Optional[int] = Field( + default=None, + description="The number of analysts that have raised their target price estimates.", + ) + lowered: Optional[int] = Field( + default=None, + description="The number of analysts that have lowered their target price estimates.", + ) + most_recent_date: Optional[dateType] = Field( + default=None, + description="The date of the most recent estimate.", + ) + industry_group_number: Optional[int] = Field( + default=None, + description="The Zacks industry group number.", + ) + + +class IntrinioPriceTargetConsensusFetcher( + Fetcher[ + IntrinioPriceTargetConsensusQueryParams, List[IntrinioPriceTargetConsensusData] + ] +): + """Intrinio Price Target Consensus Fetcher.""" + + @staticmethod + def transform_query( + params: Dict[str, Any] + ) -> IntrinioPriceTargetConsensusQueryParams: + """Transform the query params.""" + return IntrinioPriceTargetConsensusQueryParams(**params) + + @staticmethod + async def aextract_data( + query: IntrinioPriceTargetConsensusQueryParams, + credentials: Optional[Dict[str, str]], + **kwargs: Any, + ) -> List[Dict]: + """Return the raw data from the Intrinio endpoint.""" + api_key = credentials.get("intrinio_api_key") if credentials else "" + + BASE_URL = ( + "https://api-v2.intrinio.com/zacks/target_price_consensuses?page_size=10000" + ) + + symbols = query.symbol.split(",") if query.symbol else None + + query_str = get_querystring(query.model_dump(by_alias=True), ["symbol"]) + + results: List[Dict] = [] + + async def get_one(symbol): + """Get the data for one symbol.""" + url = f"{BASE_URL}&identifier={symbol}&{query_str}&api_key={api_key}" + new_data: List[Dict] = [] + data = await amake_request( + url, response_callback=response_callback, **kwargs + ) + if ( + not data + or not isinstance(data, dict) + or not data.get("target_price_consensuses") + ): + warn(f"Symbol Error: No data found for {symbol}") + if isinstance(data, dict) and data.get("target_price_consensuses"): + new_data = data.get("target_price_consensuses") # type: ignore + if new_data: + results.extend(new_data) + + if symbols: + await asyncio.gather(*[get_one(symbol) for symbol in symbols]) + return results + + async def fetch_callback(response, session): + """Use callback for pagination.""" + data = await response.json() + messages = data.get("messages") + if messages: + raise RuntimeError(str(messages)) + _data = data.get("target_price_consensuses") + if _data and len(_data) > 0: + results.extend(_data) # type: ignore + while data.get("next_page"): # type: ignore + next_page = data["next_page"] # type: ignore + next_url = f"{url}&next_page={next_page}" + data = await amake_request(next_url, session=session, **kwargs) + if ( + "" in data + and len(data.get("target_price_consensuses")) > 0 # type: ignore + ): + results.extend(data.get("target_price_consensuses")) # type: ignore + return results + + url = f"{BASE_URL}&{query_str}&api_key={api_key}" + results = await amake_request(url, response_callback=fetch_callback, **kwargs) # type: ignore + + if not results: + raise EmptyDataError("The request was successful but was returned empty.") + + return results + + @staticmethod + def transform_data( + query: IntrinioPriceTargetConsensusQueryParams, + data: List[Dict], + **kwargs: Any, + ) -> List[IntrinioPriceTargetConsensusData]: + """Transform the raw data into the standard format.""" + symbols = query.symbol.split(",") if query.symbol else [] + results: List[IntrinioPriceTargetConsensusData] = [] + for item in sorted( # type: ignore + sorted( # type: ignore + data, + key=lambda item: item.get("most_recent_date"), # type: ignore + reverse=True, + ), + key=lambda item: ( + symbols.index(item.get("symbol")) # type: ignore + if item.get("symbol") in symbols + else len(symbols) + ), + ): + _ = item.pop("company") + results.append(IntrinioPriceTargetConsensusData.model_validate(item)) + + return results diff --git a/openbb_platform/providers/intrinio/openbb_intrinio/models/world_news.py b/openbb_platform/providers/intrinio/openbb_intrinio/models/world_news.py index 3e82104b2c0..f08161e6f61 100644 --- a/openbb_platform/providers/intrinio/openbb_intrinio/models/world_news.py +++ b/openbb_platform/providers/intrinio/openbb_intrinio/models/world_news.py @@ -28,7 +28,7 @@ class IntrinioWorldNewsData(WorldNewsData): __alias_dict__ = {"date": "publication_date", "text": "summary"} id: str = Field(description="Article ID.") - company: Dict[str, Any] = Field( + company: Optional[Dict[str, Any]] = Field( description="Company details related to the news article." ) diff --git a/openbb_platform/providers/intrinio/openbb_intrinio/utils/helpers.py b/openbb_platform/providers/intrinio/openbb_intrinio/utils/helpers.py index 83126a65809..572a0ce6393 100644 --- a/openbb_platform/providers/intrinio/openbb_intrinio/utils/helpers.py +++ b/openbb_platform/providers/intrinio/openbb_intrinio/utils/helpers.py @@ -59,7 +59,7 @@ def request(url: str) -> BasicResponse: async def response_callback( response: ClientResponse, _: ClientSession ) -> Union[dict, List[dict]]: - """Callback for async_request.""" + """Use callback for async_request.""" data = await response.json() if isinstance(data, dict) and response.status != 200: diff --git a/openbb_platform/providers/intrinio/poetry.lock b/openbb_platform/providers/intrinio/poetry.lock index e75a154073c..b74f5ba7b11 100644 --- a/openbb_platform/providers/intrinio/poetry.lock +++ b/openbb_platform/providers/intrinio/poetry.lock @@ -722,13 +722,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1500,4 +1500,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "5e1871be66c01fed2ac9442effc275be6755eab8999aa1e176385660744c6e39" +content-hash = "568175cf150aaadfd77c05974f135022a7fd5556d70643ac2b57f36bcf39c731" diff --git a/openbb_platform/providers/intrinio/pyproject.toml b/openbb_platform/providers/intrinio/pyproject.toml index 591ccb04140..f40f325c206 100644 --- a/openbb_platform/providers/intrinio/pyproject.toml +++ b/openbb_platform/providers/intrinio/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-intrinio" -version = "1.1.4" +version = "1.1.5" description = "Intrinio extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -9,7 +9,7 @@ packages = [{ include = "openbb_intrinio" }] [tool.poetry.dependencies] python = "^3.8" requests-cache = "^1.1.0" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/providers/intrinio/tests/__init__.py b/openbb_platform/providers/intrinio/tests/__init__.py index e69de29bb2d..36c3ae93b8f 100644 --- a/openbb_platform/providers/intrinio/tests/__init__.py +++ b/openbb_platform/providers/intrinio/tests/__init__.py @@ -0,0 +1 @@ +"""Intrinio tests.""" diff --git a/openbb_platform/providers/intrinio/tests/record/http/test_intrinio_fetchers/test_intrinio_forward_eps_estimates_fetcher.yaml b/openbb_platform/providers/intrinio/tests/record/http/test_intrinio_fetchers/test_intrinio_forward_eps_estimates_fetcher.yaml new file mode 100644 index 00000000000..74c3c4f22db --- /dev/null +++ b/openbb_platform/providers/intrinio/tests/record/http/test_intrinio_fetchers/test_intrinio_forward_eps_estimates_fetcher.yaml @@ -0,0 +1,48 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://api-v2.intrinio.com/zacks/eps_estimates?api_key=MOCK_API_KEY&identifier=AAPL&page_size=10000 + response: + body: + string: !!binary | + H4sIAKuXCGYAA+yYXU/bMBSG/8qU6zby8WfcO3YBm/YBTENjmqYoajOIaNOKhm0M9b9jpyR22uOl + XIEoXMVvQgx99NpPfRfly6qYZVW+jEY/7qLxfLbIyttodBcVk2hkx+nnc3n07zgaRFUxvsqvTXpw + cPLRjMtsltvRYjHN37wvx7HJpnlhonffzk4+fCGfTo7PksOj87dfmebm5ri4MjeJ+WGUgGbRahBN + zNwmpISqIdFDRsxzv4rlOJumt3lmZrN32miRXxdz+4cdfrfvy6Z5OcmuO0+2YfvsKbPPzm/KKhrB + IJrlWRmNVKwTez0p3OiyuLhsrqfzP83lssrsCyfpJP9dZFUxN79Q3kyng8hMMc7LKh1fZuWF+Td4 + zMV6glSlk+x2mWYX8+bhOmYEz2Ug15v5avC0lGSQktymdMpRSrKPEm0oQZxIR2k9WlOCWMMDJRMD + TonERBG1zcn7gF85hdvUy4m7Nknut0kS4epkoT3UiesQKBD2DZugVLwHfZK794k9ghNF+ySF8AtV + D5tGKd02StAgKE30vjaKDRnsSIo+ghSgpCwNB8qOGk5Ji0kFtiez8AGHvcQkhkB3xwQoJoFi4ggm + GjNHqR6sIdGYqwdKNAYWokQ5QVa9vaAU2p7EzhqBU/K2J+mViTDWqRP11r2E7rLuQZK8oupDFTCJ + XlRAnEqAVTbnEsCdSohmh5KxUsFSKYU4XxILzCXM+wEj5eVyI08wUiZ/BqACKoF1ClcJHBRFO8UV + KL9TPHGVErKtFAvvUUrubaUCKoGRwlUCJwUoKUm70sccKOk5nwyC4oCASowLvnBQPCgTGChcJnif + TCgnE1RT3fEJ8IRCtKR0+GsU12yblHCL1sslFdql+M5CgZPydqnEVUrQbqcE8YRCuqMJHi6V3Y+2 + T5DoK6l+n+glBe1Bn4wFV577mXFbKmMRvBUKFhQKYFYLN1HJ+thpC5V0ntFB5eVyI0eFwuTyGaAK + GAVWKtwocFQULRWDTqfqYdMp3laKBh2dCIp86eU12i1Q5v0UA+XlciMXGCibPwNQAaHAQOFCgYPy + hMI5ul3uaEf9tEdKOFT8P+cTCSLpQ8B3KojRTkHdZQyV0DgqoZ8aFQsqBYYKVwrWpxTSKQXRwjcK + TyhAtCcUJHhCQThH1r6Ao9vZME4mTzBOXq43crX6aT76/G+VLrJmxtU9AAAA//8DAEWpGNevGgAA + headers: + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Sat, 30 Mar 2024 22:52:27 GMT + Transfer-Encoding: + - chunked + Vary: + - Origin,Accept-Encoding + status: + code: 200 + message: OK +version: 1 diff --git a/openbb_platform/providers/intrinio/tests/record/http/test_intrinio_fetchers/test_intrinio_forward_sales_estimates_fetcher.yaml b/openbb_platform/providers/intrinio/tests/record/http/test_intrinio_fetchers/test_intrinio_forward_sales_estimates_fetcher.yaml new file mode 100644 index 00000000000..5118ace74c8 --- /dev/null +++ b/openbb_platform/providers/intrinio/tests/record/http/test_intrinio_fetchers/test_intrinio_forward_sales_estimates_fetcher.yaml @@ -0,0 +1,52 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://api-v2.intrinio.com/zacks/sales_estimates?api_key=MOCK_API_KEY&identifier=AAPL&page_size=10000 + response: + body: + string: !!binary | + H4sIAKuXCGYAA+SaTW/bRhCG/0rBs0XszOzOzvqWHpIW/YhTNGiKohAIibWJ6AuWXNc1/N8ztB3a + Wi4pRRdboG6cXXEWwoN35p3VbVauN9W82JTr7PSv22yynK+KxU12eptV0+y0fh7/+onf/f8+O8k2 + 1eRzeanRN2/OftbnRTEv66fValZ+9+NikmtsVlYa+uGPj2c//WZ+OXv/Ud6++/T97xSsLk6qz7po + 9ENoIFB2d5JNNbcG0aAfmTAio/v+qdaTYja+KQvNVq80oVV5WS3rg739s35fMSsX0+Jya2cTbPZ+ + oHrv8mqxyU7hJJuXxSI7tcbrEcz9Jzd1dFql4hfV+UU7Oltet4PrTVEnno6n5b9VsamW+rr7hWJR + zG7Wm/GlxtcaXtdnm5SLzXhyUSzOyzFcd+68Wj2sptamy+tF92qcY96bY96bo2s1ykG9Oag3x/3q + 3cnLMsidDHKbwQ82ySDvYhC/MhiCQ2e9ixCMwg8EggEiiggM3oMPrg9AdI4R+XHHoEgccc6EB8MI + RwVjhyDuhNE2gogEwDa0BBEsChkXCSI7ZBLG5zhSECbuF0QMYJVIGCSQLg8WDgYSXwGQvL860jcA + iSl1BPTecUsdt8MPOAZrXCDZEkcRG5zvFUcKZE3zrWGxaHMX5KjFkUYEe7KI38AipFj0JFawxeJ2 + +JHFWhWt3y7UDDaA9LEI3nrbYD0sFn3OTMfLohsB7s8iJFl0SRZtgkXQbk47xJZzieOPfSOy4wdl + fMIRUEswc2+hZkZvhimNmEsIx4xjV9/o9jYxaRyf9Y3cSKNY8IAxjcEbtrGNBuMBXGxiNJ24Xhad + 12bT+EHCSDnw4T2jPSoYO0zMThjlaaqjPR8bDq2pjoojxThaArSMTrZNjDEeqZdH0KKvOYbpqinX + H+1gIN0rALLDxKTUMW1i0kBiQh1F1U1sq1ZLEAIX4RjQAUfiKGSd0tZrYixhwDBQFsHYoxbHDhOT + YjFtYtIsQqpSs9EzOIhYVJP8vP4240axxm/DGIxShr3KSIIW7DDbRpcTH+6oXxxG2+liUjCmXYzd + 5WL8k4uxVoKR2FJrXGzr/gUw1HPD2MVoBfb940Zib56mlMPiEfLAh4vjixdq29k52r1tTJrHZ51j + aMQRnaXEhEdfAm0bY9hLXKkVsx13MaS4BhhmpcbcuT5PnbQ4DYz+qGDssDH7w0jiHIjhuFSTEJKP + caQgX031MxujLAL1iyMbp93pMK9iMDfm8BmPvAIeO1xMShzTLibNIyZ4FCJ03tjYxRDalqkW9uBj + bTQYdhRqROFwD+wQWQxy3Cx2uJgUi2kXk2YRUoXakBjvfMSiVlXhmMWgx4/HjSJuF4tg63mjDJJF + p4768OnOi7NInSYmxWLaxNAuE9OwCOC59jESwahxSpgYPS1yfBUD7PwOHgMADfNm0OTIvofG5L97 + Ghrp7m8FrPxvM14V5wrI4mo2u/sCAAD//wMA/IR93/MoAAA= + headers: + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Sat, 30 Mar 2024 22:52:27 GMT + Transfer-Encoding: + - chunked + Vary: + - Origin,Accept-Encoding + status: + code: 200 + message: OK +version: 1 diff --git a/openbb_platform/providers/intrinio/tests/record/http/test_intrinio_fetchers/test_intrinio_price_target_consensus_fetcher.yaml b/openbb_platform/providers/intrinio/tests/record/http/test_intrinio_fetchers/test_intrinio_price_target_consensus_fetcher.yaml new file mode 100644 index 00000000000..c566eb27922 --- /dev/null +++ b/openbb_platform/providers/intrinio/tests/record/http/test_intrinio_fetchers/test_intrinio_price_target_consensus_fetcher.yaml @@ -0,0 +1,38 @@ +interactions: +- request: + body: null + headers: + Accept: + - application/json + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + method: GET + uri: https://api-v2.intrinio.com/zacks/target_price_consensuses?api_key=MOCK_API_KEY&identifier=AAPL&page_size=10000 + response: + body: + string: !!binary | + H4sIAKuXCGYAA1yQYU/CMBCG/wq5z2PpOgZs39AoEhEWI5HEmKaul9GwdUvbqUj4795AY2I/9d6n + 9/beO4KXtkQvWqsLFEVjHBrXOXSQvRzB62KPFjKYzfIlBFA0dSvNQRhZY6/m+fJmsFhdE9JGdc7b + gyht07XCdPXbuTNKU6I7Xe4g4wkLWQBV8wFZlEz7e43SEGCTcJJMAnBeGiWtEgrftfS6IRilYcID + 8I2XFT0dU1PjvLBYoPFCSd+PwhkfDVk85Bx6U6UvtjxMArBSO1SQma6qzr+j/St/IkF2BE1iX4vV + djz/WpPR//y/udu2wsHCFCFpFWqS7p43+f0je8jXm+ntfHv1FKejfmF6T5DRiTmL0hhOp1eywU/a + uCzxMsTpGwAA//8DAKUTUfuGAQAA + headers: + Connection: + - keep-alive + Content-Encoding: + - gzip + Content-Type: + - application/json + Date: + - Sat, 30 Mar 2024 22:52:27 GMT + Transfer-Encoding: + - chunked + Vary: + - Origin,Accept-Encoding + status: + code: 200 + message: OK +version: 1 diff --git a/openbb_platform/providers/intrinio/tests/test_intrinio_fetchers.py b/openbb_platform/providers/intrinio/tests/test_intrinio_fetchers.py index 634948f47c1..8ec7382d867 100644 --- a/openbb_platform/providers/intrinio/tests/test_intrinio_fetchers.py +++ b/openbb_platform/providers/intrinio/tests/test_intrinio_fetchers.py @@ -1,3 +1,5 @@ +"""Test Intrinio fetchers.""" + from datetime import date from unittest import mock @@ -20,6 +22,12 @@ from openbb_intrinio.models.etf_price_performance import ( ) from openbb_intrinio.models.etf_search import IntrinioEtfSearchFetcher from openbb_intrinio.models.financial_ratios import IntrinioFinancialRatiosFetcher +from openbb_intrinio.models.forward_eps_estimates import ( + IntrinioForwardEpsEstimatesFetcher, +) +from openbb_intrinio.models.forward_sales_estimates import ( + IntrinioForwardSalesEstimatesFetcher, +) from openbb_intrinio.models.fred_series import IntrinioFredSeriesFetcher from openbb_intrinio.models.historical_attributes import ( IntrinioHistoricalAttributesFetcher, @@ -40,6 +48,9 @@ from openbb_intrinio.models.market_indices import IntrinioMarketIndicesFetcher from openbb_intrinio.models.market_snapshots import IntrinioMarketSnapshotsFetcher from openbb_intrinio.models.options_chains import IntrinioOptionsChainsFetcher from openbb_intrinio.models.options_unusual import IntrinioOptionsUnusualFetcher +from openbb_intrinio.models.price_target_consensus import ( + IntrinioPriceTargetConsensusFetcher, +) from openbb_intrinio.models.reported_financials import IntrinioReportedFinancialsFetcher from openbb_intrinio.models.search_attributes import ( IntrinioSearchAttributesFetcher, @@ -54,6 +65,7 @@ test_credentials = UserService().default_user_settings.credentials.model_dump( @pytest.fixture(scope="module") def vcr_config(): + """VCR configuration.""" return { "filter_headers": [("User-Agent", None)], "filter_query_parameters": [ @@ -70,6 +82,7 @@ def vcr_config(): @pytest.fixture(autouse=True, scope="module") def mock_cpu_count(): + """Mock the cpu_count function so recording works.""" with mock.patch( "os.cpu_count" ) as mock_cpu_count: # pylint: disable=redefined-outer-name @@ -79,6 +92,7 @@ def mock_cpu_count(): @pytest.mark.record_http def test_intrinio_equity_historical_fetcher(credentials=test_credentials): + """Test equity historical fetcher.""" params = { "symbol": "AAPL", "start_date": date(2023, 1, 1), @@ -93,6 +107,7 @@ def test_intrinio_equity_historical_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_currency_pairs_fetcher(credentials=test_credentials): + """Test currency pairs fetcher.""" params = {} fetcher = IntrinioCurrencyPairsFetcher() @@ -102,6 +117,7 @@ def test_intrinio_currency_pairs_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_company_news_fetcher(credentials=test_credentials): + """Test company news fetcher.""" params = {"symbol": "AAPL"} fetcher = IntrinioCompanyNewsFetcher() @@ -111,6 +127,7 @@ def test_intrinio_company_news_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_world_news_fetcher(credentials=test_credentials): + """Test world news fetcher.""" params = {} fetcher = IntrinioWorldNewsFetcher() @@ -120,6 +137,7 @@ def test_intrinio_world_news_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_equity_quote_fetcher(credentials=test_credentials): + """Test equity quote fetcher.""" params = {"symbol": "AAPL"} fetcher = IntrinioEquityQuoteFetcher() @@ -129,6 +147,7 @@ def test_intrinio_equity_quote_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_options_chains_fetcher(credentials=test_credentials): + """Test options chains fetcher.""" params = {"symbol": "AAPL", "date": date(2023, 9, 15)} fetcher = IntrinioOptionsChainsFetcher() @@ -138,6 +157,7 @@ def test_intrinio_options_chains_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_options_unusual_fetcher(credentials=test_credentials): + """Test options unusual fetcher.""" params = { "source": "delayed", "trade_type": "block", @@ -153,6 +173,7 @@ def test_intrinio_options_unusual_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_balance_sheet_fetcher(credentials=test_credentials): + """Test balance sheet fetcher.""" params = {"symbol": "AAPL"} fetcher = IntrinioBalanceSheetFetcher() @@ -162,6 +183,7 @@ def test_intrinio_balance_sheet_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_cash_flow_statement_fetcher(credentials=test_credentials): + """Test cash flow statement fetcher.""" params = {"symbol": "AAPL"} fetcher = IntrinioCashFlowStatementFetcher() result = fetcher.test(params, credentials) @@ -170,6 +192,7 @@ def test_intrinio_cash_flow_statement_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_income_statement_fetcher(credentials=test_credentials): + """Test income statement fetcher.""" params = {"symbol": "AAPL"} fetcher = IntrinioIncomeStatementFetcher() @@ -179,6 +202,7 @@ def test_intrinio_income_statement_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_fred_series_fetcher(credentials=test_credentials): + """Test fred series fetcher.""" params = { "symbol": "$GDP", "start_date": date(2022, 9, 20), @@ -192,6 +216,7 @@ def test_intrinio_fred_series_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_calendar_ipo_fetcher(credentials=test_credentials): + """Test calendar IPO fetcher.""" params = {"status": "upcoming"} fetcher = IntrinioCalendarIpoFetcher() @@ -201,6 +226,7 @@ def test_intrinio_calendar_ipo_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_search_attributes(credentials=test_credentials): + """Test search attributes fetcher.""" params = {"query": "ebit"} fetcher = IntrinioSearchAttributesFetcher() @@ -210,6 +236,7 @@ def test_intrinio_search_attributes(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_historical_attributes(credentials=test_credentials): + """Test historical attributes fetcher.""" params = { "provider": "intrinio", "symbol": "AAPL,MSFT", @@ -229,6 +256,7 @@ def test_intrinio_historical_attributes(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_latest_attributes(credentials=test_credentials): + """Test latest attributes fetcher.""" params = { "provider": "intrinio", "symbol": "AAPL,MSFT", @@ -242,6 +270,7 @@ def test_intrinio_latest_attributes(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_equity_info_fetcher(credentials=test_credentials): + """Test equity info fetcher.""" params = {"symbol": "AAPL"} fetcher = IntrinioEquityInfoFetcher() @@ -251,6 +280,7 @@ def test_intrinio_equity_info_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_market_indices_fetcher(credentials=test_credentials): + """Test market indices fetcher.""" params = { "symbol": "$DJI", "tag": "level", @@ -265,6 +295,7 @@ def test_intrinio_market_indices_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_index_historical_fetcher(credentials=test_credentials): + """Test index historical fetcher.""" params = { "symbol": "DJI", "start_date": date(2024, 1, 1), @@ -278,6 +309,7 @@ def test_intrinio_index_historical_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_historical_dividends_fetcher(credentials=test_credentials): + """Test historical dividends fetcher.""" params = { "symbol": "AAPL", "start_date": date(2023, 1, 1), @@ -291,6 +323,7 @@ def test_intrinio_historical_dividends_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_company_filings_fetcher(credentials=test_credentials): + """Test company filings fetcher.""" params = { "symbol": "AAPL", "form_type": None, @@ -306,6 +339,7 @@ def test_intrinio_company_filings_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_insider_trading_fetcher(credentials=test_credentials): + """Test insider trading fetcher.""" params = { "symbol": "AAPL", "start_date": date(2023, 1, 1), @@ -329,6 +363,7 @@ def test_intrinio_insider_trading_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_key_metrics_fetcher(credentials=test_credentials): + """Test key metrics fetcher.""" params = {"symbol": "AAPL"} fetcher = IntrinioKeyMetricsFetcher() @@ -338,6 +373,7 @@ def test_intrinio_key_metrics_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_share_statistics_fetcher(credentials=test_credentials): + """Test share statistics fetcher.""" params = {"symbol": "AAPL"} fetcher = IntrinioShareStatisticsFetcher() @@ -347,6 +383,7 @@ def test_intrinio_share_statistics_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_equity_search_fetcher(credentials=test_credentials): + """Test equity search fetcher.""" params = {"query": "gold", "limit": 100} fetcher = IntrinioEquitySearchFetcher() @@ -356,6 +393,7 @@ def test_intrinio_equity_search_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_financial_ratios_fetcher(credentials=test_credentials): + """Test financial ratios fetcher.""" params = {"symbol": "AAPL", "period": "annual", "limit": 2, "use_cache": False} fetcher = IntrinioFinancialRatiosFetcher() @@ -365,6 +403,7 @@ def test_intrinio_financial_ratios_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_reported_financials_fetcher(credentials=test_credentials): + """Test reported financials fetcher.""" params = { "symbol": "AAPL", "statement_type": "cash", @@ -379,6 +418,7 @@ def test_intrinio_reported_financials_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_etf_search_fetcher(credentials=test_credentials): + """Test etf search fetcher.""" params = {"query": "factor", "exchange": "bats"} fetcher = IntrinioEtfSearchFetcher() @@ -388,6 +428,7 @@ def test_intrinio_etf_search_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_etf_info_fetcher(credentials=test_credentials): + """Test etf info fetcher.""" params = {"symbol": "DJIA,SPY,GOVT"} fetcher = IntrinioEtfInfoFetcher() @@ -397,6 +438,7 @@ def test_intrinio_etf_info_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_etf_holdings_fetcher(credentials=test_credentials): + """Test etf holdings fetcher.""" params = {"symbol": "DJIA"} fetcher = IntrinioEtfHoldingsFetcher() @@ -406,6 +448,7 @@ def test_intrinio_etf_holdings_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_etf_price_performance_fetcher(credentials=test_credentials): + """Test etf price performance fetcher.""" params = {"symbol": "SPY:US"} fetcher = IntrinioEtfPricePerformanceFetcher() @@ -415,8 +458,39 @@ def test_intrinio_etf_price_performance_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_intrinio_market_snapshots_fetcher(credentials=test_credentials): + """Test market snapshots fetcher.""" params = {"date": date(2022, 6, 30)} fetcher = IntrinioMarketSnapshotsFetcher() result = fetcher.test(params, credentials) assert result is None + + +@pytest.mark.record_http +def test_intrinio_forward_eps_estimates_fetcher(credentials=test_credentials): + """Test forward EPS estimates fetcher.""" + params = {"symbol": "AAPL"} + + fetcher = IntrinioForwardEpsEstimatesFetcher() + result = fetcher.test(params, credentials) + assert result is None + + +@pytest.mark.record_http +def test_intrinio_forward_sales_estimates_fetcher(credentials=test_credentials): + """Test forward sales estimates fetcher.""" + params = {"symbol": "AAPL"} + + fetcher = IntrinioForwardSalesEstimatesFetcher() + result = fetcher.test(params, credentials) + assert result is None + + +@pytest.mark.record_http +def test_intrinio_price_target_consensus_fetcher(credentials=test_credentials): + """Test price target consensus fetcher.""" + params = {"symbol": "AAPL"} + + fetcher = IntrinioPriceTargetConsensusFetcher() + result = fetcher.test(params, credentials) + assert result is None diff --git a/openbb_platform/providers/nasdaq/__init__.py b/openbb_platform/providers/nasdaq/__init__.py index e69de29bb2d..32980449cbc 100644 --- a/openbb_platform/providers/nasdaq/__init__.py +++ b/openbb_platform/providers/nasdaq/__init__.py @@ -0,0 +1 @@ +"""NASDAQ provider.""" diff --git a/openbb_platform/providers/nasdaq/openbb_nasdaq/models/__init__.py b/openbb_platform/providers/nasdaq/openbb_nasdaq/models/__init__.py index e69de29bb2d..cb477918ea6 100644 --- a/openbb_platform/providers/nasdaq/openbb_nasdaq/models/__init__.py +++ b/openbb_platform/providers/nasdaq/openbb_nasdaq/models/__init__.py @@ -0,0 +1 @@ +"""NASDAQ provider data models.""" diff --git a/openbb_platform/providers/nasdaq/openbb_nasdaq/models/calendar_dividend.py b/openbb_platform/providers/nasdaq/openbb_nasdaq/models/calendar_dividend.py index 1e96673b9d2..201e55714f8 100644 --- a/openbb_platform/providers/nasdaq/openbb_nasdaq/models/calendar_dividend.py +++ b/openbb_platform/providers/nasdaq/openbb_nasdaq/models/calendar_dividend.py @@ -50,6 +50,7 @@ class NasdaqCalendarDividendData(CalendarDividendData): ) @classmethod def validate_date(cls, v: str): + """Validate the date.""" v = v.replace("N/A", "") return datetime.strptime(v, "%m/%d/%Y").date() if v else None diff --git a/openbb_platform/providers/nasdaq/openbb_nasdaq/models/calendar_earnings.py b/openbb_platform/providers/nasdaq/openbb_nasdaq/models/calendar_earnings.py index 9c153700ca6..b84b8efc7f5 100644 --- a/openbb_platform/providers/nasdaq/openbb_nasdaq/models/calendar_earnings.py +++ b/openbb_platform/providers/nasdaq/openbb_nasdaq/models/calendar_earnings.py @@ -1,5 +1,7 @@ """Nasdaq Earnings Calendar Model.""" +# pylint: disable=unused-argument + from concurrent.futures import ThreadPoolExecutor from datetime import ( date as dateType, @@ -138,6 +140,8 @@ class NasdaqCalendarEarningsFetcher( ): """Transform the query, extract and transform the data from the Nasdaq endpoints.""" + require_credentials = False + @staticmethod def transform_query(params: Dict[str, Any]) -> NasdaqCalendarEarningsQueryParams: """Transform the query params.""" diff --git a/openbb_platform/providers/nasdaq/openbb_nasdaq/models/cot.py b/openbb_platform/providers/nasdaq/openbb_nasdaq/models/cot.py index f0ee0b72f1c..7fbaa956b5c 100644 --- a/openbb_platform/providers/nasdaq/openbb_nasdaq/models/cot.py +++ b/openbb_platform/providers/nasdaq/openbb_nasdaq/models/cot.py @@ -85,8 +85,7 @@ class NasdaqCotData(COTData): @field_validator("date", mode="before", check_fields=False) def date_validate(cls, v): # pylint: disable=E0213 - """Return the datetime object from the date string""" - + """Return the datetime object from the date string.""" return datetime.strptime(v, "%Y-%m-%d").date() @@ -95,6 +94,7 @@ class NasdaqCotFetcher(Fetcher[NasdaqCotQueryParams, List[NasdaqCotData]]): @staticmethod def transform_query(params: Dict[str, Any]) -> NasdaqCotQueryParams: + """Transform the query parameters.""" return NasdaqCotQueryParams(**params) @staticmethod @@ -103,6 +103,7 @@ class NasdaqCotFetcher(Fetcher[NasdaqCotQueryParams, List[NasdaqCotData]]): credentials: Optional[Dict[str, str]], **kwargs: Any, ) -> List[Dict]: + """Extract the data from the Nasdaq Data Link API.""" api_key = credentials.get("nasdaq_api_key") if credentials else "" # The "code" can be an exact name, a symbol, or a CFTC series code. @@ -174,4 +175,5 @@ class NasdaqCotFetcher(Fetcher[NasdaqCotQueryParams, List[NasdaqCotData]]): data: List[Dict], **kwargs: Any, ) -> List[NasdaqCotData]: + """Transform the data.""" return [NasdaqCotData.model_validate(d) for d in data] diff --git a/openbb_platform/providers/nasdaq/openbb_nasdaq/models/cot_search.py b/openbb_platform/providers/nasdaq/openbb_nasdaq/models/cot_search.py index 820a86eb55e..a642a3c3439 100644 --- a/openbb_platform/providers/nasdaq/openbb_nasdaq/models/cot_search.py +++ b/openbb_platform/providers/nasdaq/openbb_nasdaq/models/cot_search.py @@ -10,6 +10,8 @@ from openbb_core.provider.standard_models.cot_search import ( ) from openbb_nasdaq.utils.series_ids import CFTC +# pylint: disable=W0613 + class NasdaqCotSearchQueryParams(CotSearchQueryParams): """Nasdaq CFTC Commitment of Traders Reports Search Query. @@ -31,6 +33,7 @@ class NasdaqCotSearchFetcher( @staticmethod def transform_query(params: Dict[str, Any]) -> NasdaqCotSearchQueryParams: + """Transform the query params.""" return NasdaqCotSearchQueryParams(**params) @staticmethod @@ -60,4 +63,5 @@ class NasdaqCotSearchFetcher( data: List[Dict], **kwargs: Any, ) -> List[NasdaqCotSearchData]: + """Transform the data.""" return [NasdaqCotSearchData.model_validate(d) for d in data] diff --git a/openbb_platform/providers/nasdaq/openbb_nasdaq/models/historical_dividends.py b/openbb_platform/providers/nasdaq/openbb_nasdaq/models/historical_dividends.py index 2ca017a496b..41dfde661d9 100644 --- a/openbb_platform/providers/nasdaq/openbb_nasdaq/models/historical_dividends.py +++ b/openbb_platform/providers/nasdaq/openbb_nasdaq/models/historical_dividends.py @@ -2,12 +2,12 @@ # pylint: disable=unused-argument import asyncio -import warnings from datetime import ( date as dateType, datetime, ) from typing import Any, Dict, List, Optional +from warnings import warn from dateutil import parser from openbb_core.provider.abstract.fetcher import Fetcher @@ -20,8 +20,6 @@ from openbb_core.provider.utils.helpers import amake_request from openbb_nasdaq.utils.helpers import IPO_HEADERS from pydantic import Field, field_validator -_warn = warnings.warn - class NasdaqHistoricalDividendsQueryParams(HistoricalDividendsQueryParams): """Nasdaq Historical Dividends Query Params.""" @@ -92,6 +90,8 @@ class NasdaqHistoricalDividendsFetcher( ): """Nasdaq Historical Dividends Fetcher.""" + require_credentials = False + @staticmethod def transform_query(params: Dict[str, Any]) -> NasdaqHistoricalDividendsQueryParams: """Transform the params to the provider-specific query.""" @@ -117,13 +117,13 @@ class NasdaqHistoricalDividendsFetcher( url, headers=IPO_HEADERS, ) - if response.get("status").get("rCode") == 400: + if response.get("status").get("rCode") == 400: # type: ignore response = await amake_request( url.replace("stocks", "etf"), headers=IPO_HEADERS, ) - if response.get("status").get("rCode") == 200: - data = response.get("data").get("dividends").get("rows") + if response.get("status").get("rCode") == 200: # type: ignore + data = response.get("data").get("dividends").get("rows") # type: ignore if data: if len(symbols) > 1: @@ -131,7 +131,7 @@ class NasdaqHistoricalDividendsFetcher( d["symbol"] = symbol results.extend(data) if not data: - _warn(f"No data found for {symbol}") + warn(f"No data found for {symbol}") tasks = [get_one(symbol) for symbol in symbols] diff --git a/openbb_platform/providers/nasdaq/openbb_nasdaq/utils/__init__.py b/openbb_platform/providers/nasdaq/openbb_nasdaq/utils/__init__.py index e69de29bb2d..25cbd0e00fa 100644 --- a/openbb_platform/providers/nasdaq/openbb_nasdaq/utils/__init__.py +++ b/openbb_platform/providers/nasdaq/openbb_nasdaq/utils/__init__.py @@ -0,0 +1 @@ +"""NASDAQ provider utils.""" diff --git a/openbb_platform/providers/nasdaq/poetry.lock b/openbb_platform/providers/nasdaq/poetry.lock index 725940d6f38..edc7e134e72 100644 --- a/openbb_platform/providers/nasdaq/poetry.lock +++ b/openbb_platform/providers/nasdaq/poetry.lock @@ -679,13 +679,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1409,4 +1409,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "efd8feefbbf69760dcb90234a4d68a77c2c99119012f289e9721b875f4e47d43" +content-hash = "a45b677f846583524cef16d530bb44638f8e6d7777370b5e1cd7ca4c40c226ea" diff --git a/openbb_platform/providers/nasdaq/pyproject.toml b/openbb_platform/providers/nasdaq/pyproject.toml index 11b0e030366..f2b78188d71 100644 --- a/openbb_platform/providers/nasdaq/pyproject.toml +++ b/openbb_platform/providers/nasdaq/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-nasdaq" -version = "1.1.5" +version = "1.1.6" description = "Nasdaq extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_nasdaq" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" random-user-agent = "^1.0.1" nasdaq-data-link = "^1.0.4" diff --git a/openbb_platform/providers/nasdaq/tests/__init__.py b/openbb_platform/providers/nasdaq/tests/__init__.py index e69de29bb2d..60bd86abf47 100644 --- a/openbb_platform/providers/nasdaq/tests/__init__.py +++ b/openbb_platform/providers/nasdaq/tests/__init__.py @@ -0,0 +1 @@ +"""NASDAQ provider tests.""" diff --git a/openbb_platform/providers/nasdaq/tests/test_nasdaq_fetchers.py b/openbb_platform/providers/nasdaq/tests/test_nasdaq_fetchers.py index 095763d5015..9a3adc506b8 100644 --- a/openbb_platform/providers/nasdaq/tests/test_nasdaq_fetchers.py +++ b/openbb_platform/providers/nasdaq/tests/test_nasdaq_fetchers.py @@ -1,3 +1,5 @@ +"""Tests for the Nasdaq fetchers.""" + import datetime import pytest @@ -21,6 +23,7 @@ test_credentials = UserService().default_user_settings.credentials.model_dump( @pytest.fixture(scope="module") def vcr_config(): + """VCR configuration.""" return { "filter_headers": [ ("User-Agent", None), @@ -36,6 +39,7 @@ def vcr_config(): @pytest.mark.record_http def test_nasdaq_equity_search_fetcher(credentials=test_credentials): + """Test the Nasdaq Equity Search fetcher.""" params = {"query": "", "is_etf": True, "use_cache": False} fetcher = NasdaqEquitySearchFetcher() @@ -45,6 +49,7 @@ def test_nasdaq_equity_search_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_nasdaq_economic_calendar_fetcher(credentials=test_credentials): + """Test the Nasdaq Economic Calendar fetcher.""" params = { "start_date": datetime.date(2023, 11, 3), "end_date": datetime.date(2023, 11, 3), @@ -57,6 +62,7 @@ def test_nasdaq_economic_calendar_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_nasdaq_calendar_dividend_fetcher(credentials=test_credentials): + """Test the Nasdaq Calendar Dividend fetcher.""" params = { "start_date": datetime.date(2023, 11, 6), "end_date": datetime.date(2023, 11, 6), @@ -69,6 +75,7 @@ def test_nasdaq_calendar_dividend_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_nasdaq_calendar_ipo_fetcher(credentials=test_credentials): + """Test the Nasdaq Calendar IPO fetcher.""" params = { "start_date": datetime.date(2023, 11, 1), "end_date": datetime.date(2023, 11, 30), @@ -82,6 +89,7 @@ def test_nasdaq_calendar_ipo_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_nasdaq_top_retail_fetcher(credentials=test_credentials): + """Test the Nasdaq Top Retail fetcher.""" params = {} fetcher = NasdaqTopRetailFetcher() @@ -91,6 +99,7 @@ def test_nasdaq_top_retail_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_nasdaq_sp500_multiples_fetcher(credentials=test_credentials): + """Test the Nasdaq SP500 Multiples fetcher.""" params = {} fetcher = NasdaqSP500MultiplesFetcher() @@ -100,6 +109,7 @@ def test_nasdaq_sp500_multiples_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_nasdaq_cot_fetcher(credentials=test_credentials): + """Test the Nasdaq COT fetcher.""" params = {} fetcher = NasdaqCotFetcher() @@ -108,6 +118,7 @@ def test_nasdaq_cot_fetcher(credentials=test_credentials): def test_nasdaq_cot_search_fetcher(credentials=test_credentials): + """Test the Nasdaq COT Search fetcher.""" params = {} fetcher = NasdaqCotSearchFetcher() @@ -117,6 +128,7 @@ def test_nasdaq_cot_search_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_nasdaq_calendar_earnings_fetcher(credentials=test_credentials): + """Test the Nasdaq Calendar Earnings fetcher.""" params = { "start_date": datetime.date(2023, 11, 1), "end_date": datetime.date(2023, 11, 30), @@ -129,6 +141,7 @@ def test_nasdaq_calendar_earnings_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_nasdaq_historical_dividends_fetcher(credentials=test_credentials): + """Test the Nasdaq Historical Dividends fetcher.""" params = {"symbol": "AAPL"} fetcher = NasdaqHistoricalDividendsFetcher() @@ -138,6 +151,7 @@ def test_nasdaq_historical_dividends_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_nasdaq_lbma_fixing_fetcher(credentials=test_credentials): + """Test the Nasdaq LBMA Fixing fetcher.""" params = {"asset": "gold"} fetcher = NasdaqLbmaFixingFetcher() diff --git a/openbb_platform/providers/oecd/__init__.py b/openbb_platform/providers/oecd/__init__.py index e69de29bb2d..78232822134 100644 --- a/openbb_platform/providers/oecd/__init__.py +++ b/openbb_platform/providers/oecd/__init__.py @@ -0,0 +1 @@ +"""OECD Provider for OpenBB Platform.""" diff --git a/openbb_platform/providers/oecd/openbb_oecd/utils/helpers.py b/openbb_platform/providers/oecd/openbb_oecd/utils/helpers.py index 61e5475137d..3e11609ef3e 100644 --- a/openbb_platform/providers/oecd/openbb_oecd/utils/helpers.py +++ b/openbb_platform/providers/oecd/openbb_oecd/utils/helpers.py @@ -1,3 +1,5 @@ +"""OECD helper functions.""" + import ssl from datetime import date from io import StringIO @@ -20,14 +22,16 @@ Path(cache).mkdir(parents=True, exist_ok=True) class CustomHttpAdapter(requests.adapters.HTTPAdapter): - # "Transport adapter" that allows us to use custom ssl_context. + """Transport adapter" that allows us to use custom ssl_context.""" def __init__(self, ssl_context=None, **kwargs): + """Initialize the adapter with a custom ssl_context.""" self.ssl_context = ssl_context super().__init__(**kwargs) # pylint: disable=arguments-differ def init_poolmanager(self, connections, maxsize, block=False): + """Initialize the poolmanager with a custom ssl_context.""" self.poolmanager = urllib3.poolmanager.PoolManager( # pylint: disable=attribute-defined-outside-init num_pools=connections, maxsize=maxsize, @@ -40,7 +44,7 @@ class CustomHttpAdapter(requests.adapters.HTTPAdapter): def get_legacy_session(): - """Stackoverflow code to create a custom session.""" + """Create a custom session.""" ctx = ssl.create_default_context(ssl.Purpose.SERVER_AUTH) ctx.options |= 0x4 # OP_LEGACY_SERVER_CONNECT session = requests.Session() @@ -64,9 +68,9 @@ def fetch_data(url: str, csv_kwargs: Optional[Dict] = None, **kwargs: Any) -> Da def oecd_xml_to_df(xml_string: str) -> DataFrame: - """Helper function to parse the OECD XML and return a dataframe. + """Parse the OECD XML and return a dataframe. - Parameters + Parameters ---------- xml_string : str A string containing the OECD XML data. @@ -108,7 +112,7 @@ def oecd_xml_to_df(xml_string: str) -> DataFrame: def parse_url(url: str) -> DataFrame: - """Helper function to parse the SDMX url and return a dataframe. + """Parse the SDMX url and return a dataframe. Parameters ---------- @@ -193,7 +197,7 @@ def write_to_cache(cache_str: str, data: DataFrame, cache_method: str) -> None: def query_dict_to_path(query_dict: dict) -> str: - """Convert the query dict into something usable for writing file""" + """Convert the query dict into something usable for writing file.""" items = sorted(query_dict.items()) key_parts = [f"{key}_{value}" for key, value in items] return "-".join(key_parts).replace("/", "_").replace(" ", "_") @@ -206,8 +210,7 @@ def get_possibly_cached_data( cache_method: str = "csv", skip_cache: bool = False, ) -> DataFrame: - """ - Retrieve data from a given URL or from the cache if available and valid. + """Retrieve data from a given URL or from the cache if available and valid. Parameters ---------- @@ -225,8 +228,9 @@ def get_possibly_cached_data( DataFrame A Pandas DataFrame containing the fetched or cached data. """ - - base_cache = f"{cache}/{function}_{query_dict_to_path(query_dict)}" + base_cache = ( + f"{cache}/{function}_{query_dict_to_path(query_dict if query_dict else {})}" + ) if cache_method == "parquet": cache_path = base_cache + ".parquet" elif cache_method == "csv": @@ -248,7 +252,7 @@ def get_possibly_cached_data( def oecd_date_to_python_date(input_date: Union[str, int]) -> date: - """Darrens good idea to make the dates filterable""" + """Use Darrens good idea to make the dates filterable.""" input_date = str(input_date) if "Q" in input_date: return to_datetime(input_date).to_period("Q").to_timestamp("Q").date() diff --git a/openbb_platform/providers/oecd/poetry.lock b/openbb_platform/providers/oecd/poetry.lock index e45b55d8095..f15d71a6c2c 100644 --- a/openbb_platform/providers/oecd/poetry.lock +++ b/openbb_platform/providers/oecd/poetry.lock @@ -648,13 +648,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1367,4 +1367,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "38738ec5f45508730461443188945421648873b1326a2838e98324696d059e33" +content-hash = "80240bbb79b7fbd6d34f3b1b386ab7152e103a26da4ffee37aafafb0561e300d" diff --git a/openbb_platform/providers/oecd/pyproject.toml b/openbb_platform/providers/oecd/pyproject.toml index be072794c41..e1a7aab7f81 100644 --- a/openbb_platform/providers/oecd/pyproject.toml +++ b/openbb_platform/providers/oecd/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-oecd" -version = "1.1.4" +version = "1.1.5" description = "OECD extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_oecd" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" urllib3 = ">1.26.16" defusedxml = "^0.8.0rc2" diff --git a/openbb_platform/providers/oecd/tests/test_oecd_fetchers.py b/openbb_platform/providers/oecd/tests/test_oecd_fetchers.py index 2bfd968f7c1..c1e0dc618ea 100644 --- a/openbb_platform/providers/oecd/tests/test_oecd_fetchers.py +++ b/openbb_platform/providers/oecd/tests/test_oecd_fetchers.py @@ -1,3 +1,5 @@ +"""Test the OECD fetchers.""" + import datetime import pytest @@ -17,6 +19,7 @@ test_credentials = UserService().default_user_settings.credentials.model_dump( @pytest.fixture(scope="module") def vcr_config(): + """VCR configuration.""" return { "filter_headers": [("User-Agent", None)], "filter_query_parameters": [ @@ -27,6 +30,7 @@ def vcr_config(): @pytest.mark.record_http def test_oecd_nominal_gdp_fetcher(credentials=test_credentials): + """Test the OECD Nominal GDP fetcher.""" params = { "start_date": datetime.date(2020, 1, 1), "end_date": datetime.date(2023, 6, 6), @@ -39,6 +43,7 @@ def test_oecd_nominal_gdp_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_oecd_real_gdp_fetcher(credentials=test_credentials): + """Test the OECD Real GDP fetcher.""" params = { "start_date": datetime.date(2020, 1, 1), "end_date": datetime.date(2023, 6, 6), @@ -50,6 +55,7 @@ def test_oecd_real_gdp_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_oecd_forecast_gdp_fetcher(credentials=test_credentials): + """Test the OECD GDP Forecast fetcher.""" params = { "start_date": datetime.date(2020, 1, 1), "end_date": datetime.date(2023, 6, 6), @@ -62,6 +68,7 @@ def test_oecd_forecast_gdp_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_oecd_unemployment_fetcher(credentials=test_credentials): + """Test the OECD Unemployment Rate fetcher.""" params = { "start_date": datetime.date(2023, 1, 1), "end_date": datetime.date(2023, 6, 6), @@ -74,6 +81,7 @@ def test_oecd_unemployment_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_oecdcli_fetcher(credentials=test_credentials): + """Test the OECD Composite Leading Indicator fetcher.""" params = { "start_date": datetime.date(2023, 1, 1), "end_date": datetime.date(2023, 6, 6), @@ -86,6 +94,7 @@ def test_oecdcli_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_oecdstir_fetcher(credentials=test_credentials): + """Test the OECD Short Term Interest Rate fetcher.""" params = { "start_date": datetime.date(2023, 1, 1), "end_date": datetime.date(2023, 6, 6), @@ -98,6 +107,7 @@ def test_oecdstir_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_oecdltir_fetcher(credentials=test_credentials): + """Test the OECD Long Term Interest Rate fetcher.""" params = { "start_date": datetime.date(2023, 1, 1), "end_date": datetime.date(2023, 6, 6), diff --git a/openbb_platform/providers/polygon/__init__.py b/openbb_platform/providers/polygon/__init__.py index e69de29bb2d..058a541bd21 100644 --- a/openbb_platform/providers/polygon/__init__.py +++ b/openbb_platform/providers/polygon/__init__.py @@ -0,0 +1 @@ +"""Polygon Provider init.""" diff --git a/openbb_platform/providers/polygon/openbb_polygon/models/__init__.py b/openbb_platform/providers/polygon/openbb_polygon/models/__init__.py index e69de29bb2d..8062aa0a1f1 100644 --- a/openbb_platform/providers/polygon/openbb_polygon/models/__init__.py +++ b/openbb_platform/providers/polygon/openbb_polygon/models/__init__.py @@ -0,0 +1 @@ +"""OpenBB Polygon provider data models.""" diff --git a/openbb_platform/providers/polygon/openbb_polygon/models/crypto_historical.py b/openbb_platform/providers/polygon/openbb_polygon/models/crypto_historical.py index 04a566a6250..dc9bb95fe2b 100644 --- a/openbb_platform/providers/polygon/openbb_polygon/models/crypto_historical.py +++ b/openbb_platform/providers/polygon/openbb_polygon/models/crypto_historical.py @@ -3,7 +3,10 @@ # pylint: disable=unused-argument,protected-access,line-too-long import warnings -from datetime import datetime +from datetime import ( + datetime, + timezone, +) from typing import Any, Dict, List, Literal, Optional from dateutil.relativedelta import relativedelta @@ -18,6 +21,7 @@ from openbb_core.provider.utils.helpers import ( ClientResponse, ClientSession, amake_requests, + safe_fromtimestamp, ) from pydantic import ( Field, @@ -25,7 +29,6 @@ from pydantic import ( PrivateAttr, model_validator, ) -from pytz import timezone _warn = warnings.warn @@ -146,17 +149,18 @@ class PolygonCryptoHistoricalFetcher( data = await response.json() symbol = response.url.parts[4] - next_url = data.get("next_url", None) - results: list = data.get("results", []) + next_url = data.get("next_url", None) # type: ignore + results: list = data.get("results", []) # type: ignore while next_url: url = f"{next_url}&apiKey={api_key}" data = await session.get_json(url) - results.extend(data.get("results", [])) - next_url = data.get("next_url", None) + results.extend(data.get("results", [])) # type: ignore + next_url = data.get("next_url", None) # type: ignore for r in results: - r["t"] = datetime.fromtimestamp(r["t"] / 1000, tz=timezone("UTC")) + v = r["t"] / 1000 # milliseconds to seconds + r["t"] = safe_fromtimestamp(v, tz=timezone.utc) # type: ignore[arg-type] if query._timespan not in ["second", "minute", "hour"]: r["t"] = r["t"].date().strftime("%Y-%m-%d") else: diff --git a/openbb_platform/providers/polygon/openbb_polygon/models/currency_historical.py b/openbb_platform/providers/polygon/openbb_polygon/models/currency_historical.py index 0da2b73c2f2..9a4edcb98b4 100644 --- a/openbb_platform/providers/polygon/openbb_polygon/models/currency_historical.py +++ b/openbb_platform/providers/polygon/openbb_polygon/models/currency_historical.py @@ -3,7 +3,10 @@ # pylint: disable=unused-argument,protected-access,line-too-long import warnings -from datetime import datetime +from datetime import ( + datetime, + timezone, +) from typing import Any, Dict, List, Literal, Optional from dateutil.relativedelta import relativedelta @@ -18,6 +21,7 @@ from openbb_core.provider.utils.helpers import ( ClientResponse, ClientSession, amake_requests, + safe_fromtimestamp, ) from pydantic import ( Field, @@ -25,7 +29,6 @@ from pydantic import ( PrivateAttr, model_validator, ) -from pytz import timezone _warn = warnings.warn @@ -143,17 +146,18 @@ class PolygonCurrencyHistoricalFetcher( data = await response.json() symbol = response.url.parts[4] - next_url = data.get("next_url", None) - results: list = data.get("results", []) + next_url = data.get("next_url", None) # type: ignore[union-attr] + results: list = data.get("results", []) # type: ignore[union-attr] while next_url: url = f"{next_url}&apiKey={api_key}" data = await session.get_json(url) - results.extend(data.get("results", [])) - next_url = data.get("next_url", None) + results.extend(data.get("results", [])) # type: ignore[union-attr] + next_url = data.get("next_url", None) # type: ignore[union-attr] for r in results: - r["t"] = datetime.fromtimestamp(r["t"] / 1000, tz=timezone("UTC")) + v = r["t"] / 1000 # milliseconds to seconds + r["t"] = safe_fromtimestamp(v, tz=timezone.utc) # type: ignore[arg-type] if query._timespan not in ["second", "minute", "hour"]: r["t"] = r["t"].date().strftime("%Y-%m-%d") else: diff --git a/openbb_platform/providers/polygon/openbb_polygon/models/equity_historical.py b/openbb_platform/providers/polygon/openbb_polygon/models/equity_historical.py index 85f4625a875..de818d61bfe 100644 --- a/openbb_platform/providers/polygon/openbb_polygon/models/equity_historical.py +++ b/openbb_platform/providers/polygon/openbb_polygon/models/equity_historical.py @@ -3,7 +3,9 @@ # pylint: disable=unused-argument,protected-access import warnings -from datetime import datetime +from datetime import ( + datetime, +) from typing import Any, Dict, List, Literal, Optional from dateutil.relativedelta import relativedelta @@ -18,6 +20,7 @@ from openbb_core.provider.utils.helpers import ( ClientResponse, ClientSession, amake_requests, + safe_fromtimestamp, ) from pandas import to_datetime from pydantic import ( @@ -152,19 +155,18 @@ class PolygonEquityHistoricalFetcher( data = await response.json() symbol = response.url.parts[4] - next_url = data.get("next_url", None) - results: list = data.get("results", []) + next_url = data.get("next_url", None) # type: ignore + results: list = data.get("results", []) # type: ignore while next_url: url = f"{next_url}&apiKey={api_key}" data = await session.get_json(url) - results.extend(data.get("results", [])) - next_url = data.get("next_url", None) + results.extend(data.get("results", [])) # type: ignore + next_url = data.get("next_url", None) # type: ignore for r in results: - r["t"] = datetime.fromtimestamp( - r["t"] / 1000, tz=timezone("America/New_York") - ) + v = r["t"] / 1000 # milliseconds to seconds + r["t"] = safe_fromtimestamp(v, tz=timezone("America/New_York")) # type: ignore[arg-type] if query._timespan not in ["second", "minute", "hour"]: r["t"] = r["t"].date().strftime("%Y-%m-%d") else: diff --git a/openbb_platform/providers/polygon/openbb_polygon/models/index_historical.py b/openbb_platform/providers/polygon/openbb_polygon/models/index_historical.py index 01320ddfc75..74fa010e841 100644 --- a/openbb_platform/providers/polygon/openbb_polygon/models/index_historical.py +++ b/openbb_platform/providers/polygon/openbb_polygon/models/index_historical.py @@ -18,6 +18,7 @@ from openbb_core.provider.utils.helpers import ( ClientResponse, ClientSession, amake_requests, + safe_fromtimestamp, ) from pydantic import ( Field, @@ -143,19 +144,18 @@ class PolygonIndexHistoricalFetcher( data = await response.json() symbol = response.url.parts[4] - next_url = data.get("next_url", None) - results: list = data.get("results", []) + next_url = data.get("next_url", None) # type: ignore[union-attr] + results: list = data.get("results", []) # type: ignore[union-attr] while next_url: url = f"{next_url}&apiKey={api_key}" data = await session.get_json(url) - results.extend(data.get("results", [])) - next_url = data.get("next_url", None) + results.extend(data.get("results", [])) # type: ignore[union-attr] + next_url = data.get("next_url", None) # type: ignore[union-attr] for r in results: - r["t"] = datetime.fromtimestamp( - r["t"] / 1000, tz=timezone("America/New_York") - ) + v = r["t"] / 1000 # milliseconds to seconds + r["t"] = safe_fromtimestamp(v, tz=timezone("America/New_York")) # type: ignore[arg-type] if query._timespan not in ["second", "minute", "hour"]: r["t"] = r["t"].date().strftime("%Y-%m-%d") else: diff --git a/openbb_platform/providers/polygon/openbb_polygon/models/market_indices.py b/openbb_platform/providers/polygon/openbb_polygon/models/market_indices.py index b473a42cffb..35670008e50 100644 --- a/openbb_platform/providers/polygon/openbb_polygon/models/market_indices.py +++ b/openbb_platform/providers/polygon/openbb_polygon/models/market_indices.py @@ -1,6 +1,8 @@ """Polygon Market Indices Model.""" -from datetime import datetime +from datetime import ( + datetime, +) from typing import Any, Dict, List, Literal, Optional from dateutil.relativedelta import relativedelta @@ -10,6 +12,7 @@ from openbb_core.provider.standard_models.market_indices import ( MarketIndicesQueryParams, ) from openbb_core.provider.utils.descriptions import QUERY_DESCRIPTIONS +from openbb_core.provider.utils.helpers import safe_fromtimestamp from openbb_polygon.utils.helpers import get_data_many from pydantic import Field, PositiveInt @@ -94,7 +97,8 @@ class PolygonMarketIndicesFetcher( data = await get_data_many(request_url, "results", **kwargs) for d in data: - d["t"] = datetime.fromtimestamp(d["t"] / 1000) + v = d["t"] / 1000 # milliseconds to seconds + d["t"] = safe_fromtimestamp(v) if query.timespan not in ["minute", "hour"]: d["t"] = d["t"].date() diff --git a/openbb_platform/providers/polygon/openbb_polygon/utils/__init__.py b/openbb_platform/providers/polygon/openbb_polygon/utils/__init__.py index e69de29bb2d..23bbc3b80cb 100644 --- a/openbb_platform/providers/polygon/openbb_polygon/utils/__init__.py +++ b/openbb_platform/providers/polygon/openbb_polygon/utils/__init__.py @@ -0,0 +1 @@ +"""OpenBB Polygon utils.""" diff --git a/openbb_platform/providers/polygon/openbb_polygon/utils/helpers.py b/openbb_platform/providers/polygon/openbb_polygon/utils/helpers.py index bc7f160f182..c2e4b3a0a20 100644 --- a/openbb_platform/providers/polygon/openbb_polygon/utils/helpers.py +++ b/openbb_platform/providers/polygon/openbb_polygon/utils/helpers.py @@ -2,7 +2,7 @@ import json from io import StringIO -from typing import Any, List, Optional, Tuple, TypeVar, Union +from typing import Any, Dict, List, Optional, Tuple, TypeVar, Union from openbb_core.provider.utils.errors import EmptyDataError from openbb_core.provider.utils.helpers import ( @@ -31,16 +31,17 @@ class BasicResponse: def request(url: str) -> BasicResponse: - """ - Request function for PyScript. Pass in Method and make sure to await. + """Request function for PyScript. - Parameters: - ----------- + Pass in Method and make sure to await. + + Parameters + ---------- url: str URL to make request to - Return: - ------- + Return + ------ response: BasicRequest BasicRequest object with status_code and text attributes """ @@ -54,8 +55,8 @@ def request(url: str) -> BasicResponse: async def response_callback( response: ClientResponse, _: ClientSession ) -> Union[dict, List[dict]]: - """Callback for make_request.""" - data: dict = await response.json() + """Use callback for make_request.""" + data: Dict = await response.json() # type: ignore if response.status != 200: message = data.get("error", None) or data.get("message", None) @@ -79,15 +80,15 @@ async def get_data_many( ) -> List[dict]: """Get data from Polygon endpoint and convert to list of schemas. - Parameters: - ----------- + Parameters + ---------- url: str The URL to get the data from. sub_dict: Optional[str] The sub-dictionary to use. - Returns: - -------- + Returns + ------- List[dict] Dictionary of data. """ diff --git a/openbb_platform/providers/polygon/poetry.lock b/openbb_platform/providers/polygon/poetry.lock index 1f872410758..45aff8d211b 100644 --- a/openbb_platform/providers/polygon/poetry.lock +++ b/openbb_platform/providers/polygon/poetry.lock @@ -697,13 +697,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1416,4 +1416,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e5a1c1f22e0b8e42343cef04f6f23281c7d6441df13f2be91584098c856ab1f0" +content-hash = "ca421fe0dbae56150a2fc3a7978ad65f3dd4e70025bc4da4a7f1338b8eca522c" diff --git a/openbb_platform/providers/polygon/pyproject.toml b/openbb_platform/providers/polygon/pyproject.toml index e5dd990d25c..0be41db1cb6 100644 --- a/openbb_platform/providers/polygon/pyproject.toml +++ b/openbb_platform/providers/polygon/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-polygon" -version = "1.1.4" +version = "1.1.5" description = "Polygon extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_polygon" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/providers/polygon/tests/test_polygon_fetchers.py b/openbb_platform/providers/polygon/tests/test_polygon_fetchers.py index ebc51911a31..034334f2195 100644 --- a/openbb_platform/providers/polygon/tests/test_polygon_fetchers.py +++ b/openbb_platform/providers/polygon/tests/test_polygon_fetchers.py @@ -1,3 +1,5 @@ +"""Test the Polygon fetchers.""" + from datetime import date import pytest @@ -26,6 +28,7 @@ test_credentials = UserService().default_user_settings.credentials.model_dump( @pytest.fixture(scope="module") def vcr_config(): + """VCR configuration.""" return { "filter_headers": [("User-Agent", None)], "filter_query_parameters": [ @@ -36,6 +39,7 @@ def vcr_config(): @pytest.mark.record_http def test_polygon_equity_historical_fetcher(credentials=test_credentials): + """Test the Polygon Equity Historical fetcher.""" params = { "symbol": "AAPL", "start_date": date(2023, 1, 1), @@ -50,6 +54,7 @@ def test_polygon_equity_historical_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_polygon_market_indices_fetcher(credentials=test_credentials): + """Test the Polygon Market Indices fetcher.""" params = { "symbol": "NDX", "start_date": date(2023, 1, 1), @@ -63,6 +68,7 @@ def test_polygon_market_indices_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_polygon_index_historical_fetcher(credentials=test_credentials): + """Test the Polygon Index Historical fetcher.""" params = { "symbol": "NDX", "start_date": date(2023, 1, 1), @@ -76,6 +82,7 @@ def test_polygon_index_historical_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_polygon_company_news_fetcher(credentials=test_credentials): + """Test the Polygon Company News fetcher.""" params = {"symbol": "AAPL"} fetcher = PolygonCompanyNewsFetcher() @@ -85,6 +92,7 @@ def test_polygon_company_news_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_polygon_balance_sheet_fetcher(credentials=test_credentials): + """Test the Polygon Balance Sheet fetcher.""" params = {"symbol": "AAPL"} fetcher = PolygonBalanceSheetFetcher() @@ -94,6 +102,7 @@ def test_polygon_balance_sheet_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_polygon_income_statement_fetcher(credentials=test_credentials): + """Test the Polygon Income Statement fetcher.""" params = {"symbol": "AAPL"} fetcher = PolygonIncomeStatementFetcher() @@ -103,6 +112,7 @@ def test_polygon_income_statement_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_polygon_cash_flow_statement_fetcher(credentials=test_credentials): + """Test the Polygon Cash Flow Statement fetcher.""" params = {"symbol": "AAPL"} fetcher = PolygonCashFlowStatementFetcher() @@ -112,6 +122,7 @@ def test_polygon_cash_flow_statement_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_polygon_crypto_historical_fetcher(credentials=test_credentials): + """Test the Polygon Crypto Historical fetcher.""" params = { "symbol": "BTCUSD", "start_date": date(2023, 1, 1), @@ -125,6 +136,7 @@ def test_polygon_crypto_historical_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_polygon_currency_historical_fetcher(credentials=test_credentials): + """Test the Polygon Currency Historical fetcher.""" params = { "symbol": "EURUSD", "start_date": date(2023, 1, 1), @@ -138,6 +150,7 @@ def test_polygon_currency_historical_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_polygon_currency_pairs_fetcher(credentials=test_credentials): + """Test the Polygon Currency Pairs fetcher.""" params = {"date": date(2023, 1, 1)} fetcher = PolygonCurrencyPairsFetcher() @@ -147,6 +160,7 @@ def test_polygon_currency_pairs_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_polygon_equity_nbbo_fetcher(credentials=test_credentials): + """Test the Polygon Equity NBBO fetcher.""" params = {"symbol": "SPY", "limit": 1000} fetcher = PolygonEquityNBBOFetcher() @@ -156,6 +170,7 @@ def test_polygon_equity_nbbo_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_polygon_market_snapshots_fetcher(credentials=test_credentials): + """Test the Polygon Market Snapshots fetcher.""" params = {} fetcher = PolygonMarketSnapshotsFetcher() diff --git a/openbb_platform/providers/sec/__init__.py b/openbb_platform/providers/sec/__init__.py index e69de29bb2d..58f6e5aeaa4 100644 --- a/openbb_platform/providers/sec/__init__.py +++ b/openbb_platform/providers/sec/__init__.py @@ -0,0 +1 @@ +"""SEC Provider.""" diff --git a/openbb_platform/providers/sec/openbb_sec/models/__init__.py b/openbb_platform/providers/sec/openbb_sec/models/__init__.py index e69de29bb2d..a2faa26a3ad 100644 --- a/openbb_platform/providers/sec/openbb_sec/models/__init__.py +++ b/openbb_platform/providers/sec/openbb_sec/models/__init__.py @@ -0,0 +1 @@ +"""SEC Provider Models.""" diff --git a/openbb_platform/providers/sec/openbb_sec/models/company_filings.py b/openbb_platform/providers/sec/openbb_sec/models/company_filings.py index 1108ad19419..85d98ff1b0c 100644 --- a/openbb_platform/providers/sec/openbb_sec/models/company_filings.py +++ b/openbb_platform/providers/sec/openbb_sec/models/company_filings.py @@ -145,7 +145,7 @@ class SecCompanyFilingsFetcher( credentials: Optional[Dict[str, str]], **kwargs: Any, ) -> List[Dict]: - """Extracts the data from the SEC endpoint.""" + """Extract the data from the SEC endpoint.""" filings = pd.DataFrame() if query.symbol and not query.cik: @@ -156,12 +156,12 @@ class SecCompanyFilingsFetcher( return [] # The leading 0s need to be inserted but are typically removed from the data to store as an integer. - if len(query.cik) != 10: + if len(query.cik) != 10: # type: ignore cik_: str = "" - temp = 10 - len(query.cik) + temp = 10 - len(query.cik) # type: ignore for i in range(temp): cik_ = cik_ + "0" - query.cik = cik_ + query.cik + query.cik = cik_ + str(query.cik) # type: ignore url = f"https://data.sec.gov/submissions/CIK{query.cik}.json" r = ( @@ -236,5 +236,5 @@ class SecCompanyFilingsFetcher( def transform_data( query: SecCompanyFilingsQueryParams, data: List[Dict], **kwargs: Any ) -> List[SecCompanyFilingsData]: - """Transforms the data.""" + """Transform the data.""" return [SecCompanyFilingsData.model_validate(d) for d in data] diff --git a/openbb_platform/providers/sec/openbb_sec/models/equity_ftd.py b/openbb_platform/providers/sec/openbb_sec/models/equity_ftd.py index ad8039bbc91..097a73d3a4d 100644 --- a/openbb_platform/providers/sec/openbb_sec/models/equity_ftd.py +++ b/openbb_platform/providers/sec/openbb_sec/models/equity_ftd.py @@ -56,7 +56,7 @@ class SecEquityFtdFetcher( credentials: Optional[Dict[str, str]], **kwargs: Any, ) -> List[Dict]: - """Extracts the data from the SEC website.""" + """Extract the data from the SEC website.""" results = [] limit = query.limit if query.limit is not None and query.limit > 0 else 0 symbol = query.symbol.upper() @@ -83,5 +83,5 @@ class SecEquityFtdFetcher( def transform_data( query: SecEquityFtdQueryParams, data: List[Dict], **kwargs: Any ) -> List[SecEquityFtdData]: - """Transforms the data to the standard format.""" + """Transform the data to the standard format.""" return [SecEquityFtdData.model_validate(d) for d in data] diff --git a/openbb_platform/providers/sec/openbb_sec/utils/__init__.py b/openbb_platform/providers/sec/openbb_sec/utils/__init__.py index e69de29bb2d..e63a6cc9ef4 100644 --- a/openbb_platform/providers/sec/openbb_sec/utils/__init__.py +++ b/openbb_platform/providers/sec/openbb_sec/utils/__init__.py @@ -0,0 +1 @@ +"""SEC Utils.""" diff --git a/openbb_platform/providers/sec/openbb_sec/utils/helpers.py b/openbb_platform/providers/sec/openbb_sec/utils/helpers.py index 1b150ddd95b..e8622aac7f5 100644 --- a/openbb_platform/providers/sec/openbb_sec/utils/helpers.py +++ b/openbb_platform/providers/sec/openbb_sec/utils/helpers.py @@ -1,4 +1,4 @@ -"""SEC Helpers module""" +"""SEC Helpers module.""" # pylint: skip-file from datetime import timedelta @@ -30,7 +30,8 @@ sec_session_company_filings = requests_cache.CachedSession( def get_all_companies(use_cache: bool = True) -> pd.DataFrame: - """Gets all company names, tickers, and CIK numbers registered with the SEC. + """Get all company names, tickers, and CIK numbers registered with the SEC. + Companies are sorted by market cap. Returns @@ -41,7 +42,6 @@ def get_all_companies(use_cache: bool = True) -> pd.DataFrame: ------- >>> tickers = get_all_companies() """ - url = "https://www.sec.gov/files/company_tickers.json" r = ( @@ -56,8 +56,7 @@ def get_all_companies(use_cache: bool = True) -> pd.DataFrame: def get_all_ciks(use_cache: bool = True) -> pd.DataFrame: - """Gets a list of entity names and their CIK number.""" - + """Get a list of entity names and their CIK number.""" HEADERS = { "User-Agent": "my real company name definitelynot@fakecompany.com", "Accept-Encoding": "gzip, deflate", @@ -86,8 +85,7 @@ def get_all_ciks(use_cache: bool = True) -> pd.DataFrame: def get_mf_and_etf_map(use_cache: bool = True) -> pd.DataFrame: - """Returns the CIK number of a ticker symbol for querying the SEC API.""" - + """Return the CIK number of a ticker symbol for querying the SEC API.""" symbols = pd.DataFrame() url = "https://www.sec.gov/files/company_tickers_mf.json" @@ -110,8 +108,7 @@ def search_institutions(keyword: str, use_cache: bool = True) -> pd.DataFrame: def symbol_map(symbol: str, use_cache: bool = True) -> str: - """Returns the CIK number of a ticker symbol for querying the SEC API.""" - + """Return the CIK number of a ticker symbol for querying the SEC API.""" symbol = symbol.upper().replace(".", "-") symbols = get_all_companies(use_cache=use_cache) @@ -130,8 +127,7 @@ def symbol_map(symbol: str, use_cache: bool = True) -> str: def cik_map(cik: int, use_cache: bool = True) -> str: - """ - Converts a CIK number to a ticker symbol. Enter CIK as an integer with no leading zeros. + """Convert a CIK number to a ticker symbol. Enter CIK as an integer with no leading zeros. Function is not meant for funds. @@ -164,7 +160,8 @@ def get_frame( instantaneous: bool = False, use_cache: bool = True, ) -> Dict: - """ + """Get a frame of data for a given fact. + The xbrl/frames API aggregates one fact for each reporting entity that is last filed that most closely fits the calendrical period requested. @@ -197,7 +194,6 @@ def get_frame( Facts where units are, "shares": WeightedAverageNumberOfDilutedSharesOutstanding """ - if fact in ["WeightedAverageNumberOfDilutedSharesOutstanding"]: units = "shares" @@ -237,6 +233,7 @@ def get_frame( def get_schema_filelist(query: str = "", url: str = "") -> List: + """Get a list of schema files from the SEC website.""" results: List = [] url = url if url else f"https://xbrl.fasb.org/us-gaap/{query}" _url = url @@ -300,7 +297,6 @@ def download_zip_file(url, symbol: Optional[str] = None) -> List[Dict]: def get_ftd_urls() -> Dict: """Get Fails-to-Deliver Data URLs.""" - results = {} position = None key = "title" @@ -330,8 +326,8 @@ def get_ftd_urls() -> Dict: def get_series_id( symbol: Optional[str] = None, cik: Optional[str] = None, use_cache: bool = True ): - """ - This function maps the fund to the series and class IDs for validating the correct filing. + """Map the fund to the series and class IDs for validating the correct filing. + For an exact match, use a symbol. """ symbol = symbol if symbol else "" @@ -359,8 +355,7 @@ def get_series_id( def get_nport_candidates(symbol: str, use_cache: bool = True) -> List[Dict]: - """Gets a list of all NPORT-P filings for a given fund's symbol.""" - + """Get a list of all NPORT-P filings for a given fund's symbol.""" results = [] _series_id = get_series_id(symbol, use_cache=use_cache) try: diff --git a/openbb_platform/providers/sec/openbb_sec/utils/parse_13f.py b/openbb_platform/providers/sec/openbb_sec/utils/parse_13f.py index eda060c17bc..5fedbaf3858 100644 --- a/openbb_platform/providers/sec/openbb_sec/utils/parse_13f.py +++ b/openbb_platform/providers/sec/openbb_sec/utils/parse_13f.py @@ -1,6 +1,6 @@ """Utility functions for parsing SEC Form 13F-HR.""" -from typing import Dict, Optional +from typing import Any, Dict, Optional import xmltodict from bs4 import BeautifulSoup @@ -22,7 +22,7 @@ def date_to_quarter_end(date: str) -> str: def get_13f_candidates(symbol: Optional[str] = None, cik: Optional[str] = None): """Get the 13F-HR filings for a given symbol or CIK.""" fetcher = SecCompanyFilingsFetcher() - params = {} + params: Dict[str, Any] = {} if cik is not None: params["cik"] = str(cik) if symbol is not None: @@ -46,7 +46,7 @@ def get_13f_candidates(symbol: Optional[str] = None, cik: Optional[str] = None): async def complete_submission_callback(response, _): - """Callback function for processing the response object.""" + """Use callback function for processing the response object.""" if response.status == 200: return await response.text() raise RuntimeError(f"Request failed with status code {response.status}") @@ -106,7 +106,7 @@ def get_period_ending(filing_str: str): async def parse_13f_hr(filing: str): - """Parses a 13F-HR filing from the Complete Submission TXT file string.""" + """Parse a 13F-HR filing from the Complete Submission TXT file string.""" data = DataFrame() # Check if the input string is a URL diff --git a/openbb_platform/providers/sec/poetry.lock b/openbb_platform/providers/sec/poetry.lock index 831ebc05871..11e0c3e54c6 100644 --- a/openbb_platform/providers/sec/poetry.lock +++ b/openbb_platform/providers/sec/poetry.lock @@ -721,13 +721,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1584,4 +1584,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = ">=3.8,<3.12" -content-hash = "8518d131e4fd2f87fdbfe11ceeb02d1389bad71baa0b8689e079bbc96aeab9a2" +content-hash = "5f1027824c017abd05bf08cc40628e94c28062b8a91a551667a46d30381d9be0" diff --git a/openbb_platform/providers/sec/pyproject.toml b/openbb_platform/providers/sec/pyproject.toml index a69eb563cc6..c9e51879d41 100644 --- a/openbb_platform/providers/sec/pyproject.toml +++ b/openbb_platform/providers/sec/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-sec" -version = "1.1.4" +version = "1.1.5" description = "SEC extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_sec" }] [tool.poetry.dependencies] python = ">=3.8,<3.12" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" requests-cache = "^1.1.0" xmltodict = "^0.13.0" pytest-freezegun = "^0.4.2" diff --git a/openbb_platform/providers/sec/tests/__init__.py b/openbb_platform/providers/sec/tests/__init__.py index e69de29bb2d..9c38549cbb3 100644 --- a/openbb_platform/providers/sec/tests/__init__.py +++ b/openbb_platform/providers/sec/tests/__init__.py @@ -0,0 +1 @@ +"""SEC tests.""" diff --git a/openbb_platform/providers/sec/tests/test_sec_fetchers.py b/openbb_platform/providers/sec/tests/test_sec_fetchers.py index e7f7f2df02c..60db05d26d3 100644 --- a/openbb_platform/providers/sec/tests/test_sec_fetchers.py +++ b/openbb_platform/providers/sec/tests/test_sec_fetchers.py @@ -1,3 +1,5 @@ +"""Tests for the SEC fetchers.""" + import pytest from openbb_core.app.service.user_service import UserService from openbb_sec.models.cik_map import SecCikMapFetcher @@ -17,6 +19,7 @@ test_credentials = UserService().default_user_settings.credentials.dict() @pytest.fixture(scope="module") def vcr_config(): + """VCR configuration.""" return { "filter_headers": [("User-Agent", None)], "filter_query_parameters": [ @@ -27,6 +30,7 @@ def vcr_config(): @pytest.mark.record_http def test_sec_etf_holdings_fetcher(credentials=test_credentials): + """Test the SEC ETF Holdings fetcher.""" params = {"symbol": "TQQQ", "use_cache": False} fetcher = SecEtfHoldingsFetcher() @@ -36,6 +40,7 @@ def test_sec_etf_holdings_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_sec_sic_search_fetcher(credentials=test_credentials): + """Test the SEC SIC Search fetcher.""" params = {"query": "oil", "use_cache": False} fetcher = SecSicSearchFetcher() @@ -45,6 +50,7 @@ def test_sec_sic_search_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_sec_symbol_map_fetcher(credentials=test_credentials): + """Test the SEC Symbol Map fetcher.""" params = {"query": "0000909832"} fetcher = SecSymbolMapFetcher() @@ -54,6 +60,7 @@ def test_sec_symbol_map_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_sec_equity_ftd_fetcher(credentials=test_credentials): + """Test the SEC Equity FTD fetcher.""" params = {"symbol": "AAPL", "limit": 1} fetcher = SecEquityFtdFetcher() @@ -63,6 +70,7 @@ def test_sec_equity_ftd_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_sec_equity_search_fetcher(credentials=test_credentials): + """Test the SEC Equity Search fetcher.""" params = {"query": "trust", "use_cache": False} fetcher = SecEquitySearchFetcher() @@ -72,6 +80,7 @@ def test_sec_equity_search_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_sec_company_filings_fetcher(credentials=test_credentials): + """Test the SEC Company Filings fetcher.""" params = {"symbol": "AAPL", "type": "10-K", "use_cache": False} fetcher = SecCompanyFilingsFetcher() @@ -81,6 +90,7 @@ def test_sec_company_filings_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_sec_institutions_search_fetcher(credentials=test_credentials): + """Test the SEC Institutions Search fetcher.""" params = {"query": "Investment Trust", "use_cache": False} fetcher = SecInstitutionsSearchFetcher() @@ -90,6 +100,7 @@ def test_sec_institutions_search_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_sec_schema_files_fetcher(credentials=test_credentials): + """Test the SEC Schema Files fetcher.""" params = {"query": "2022"} fetcher = SecSchemaFilesFetcher() @@ -99,6 +110,7 @@ def test_sec_schema_files_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_sec_rss_litigation_fetcher(credentials=test_credentials): + """Test the SEC RSS Litigation fetcher.""" params = {} fetcher = SecRssLitigationFetcher() @@ -108,6 +120,7 @@ def test_sec_rss_litigation_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_sec_cik_map_fetcher(credentials=test_credentials): + """Test the SEC CIK map fetcher.""" params = {"symbol": "OXY"} fetcher = SecCikMapFetcher() @@ -117,6 +130,7 @@ def test_sec_cik_map_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_sec_form_13FHR_fetcher(credentials=test_credentials): + """Test the SEC Form 13FHR fetcher.""" params = {"symbol": "NVDA"} fetcher = SecForm13FHRFetcher() diff --git a/openbb_platform/providers/seeking_alpha/poetry.lock b/openbb_platform/providers/seeking_alpha/poetry.lock index 12b9fd975a0..718edef43ca 100644 --- a/openbb_platform/providers/seeking_alpha/poetry.lock +++ b/openbb_platform/providers/seeking_alpha/poetry.lock @@ -712,13 +712,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1431,4 +1431,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e5a1c1f22e0b8e42343cef04f6f23281c7d6441df13f2be91584098c856ab1f0" +content-hash = "ca421fe0dbae56150a2fc3a7978ad65f3dd4e70025bc4da4a7f1338b8eca522c" diff --git a/openbb_platform/providers/seeking_alpha/pyproject.toml b/openbb_platform/providers/seeking_alpha/pyproject.toml index 586057006d6..8701c492759 100644 --- a/openbb_platform/providers/seeking_alpha/pyproject.toml +++ b/openbb_platform/providers/seeking_alpha/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-seeking-alpha" -version = "1.1.4" +version = "1.1.5" description = "Seeking Alpha extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_seeking_alpha" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/providers/seeking_alpha/tests/__init__.py b/openbb_platform/providers/seeking_alpha/tests/__init__.py index e69de29bb2d..47cf47b762c 100644 --- a/openbb_platform/providers/seeking_alpha/tests/__init__.py +++ b/openbb_platform/providers/seeking_alpha/tests/__init__.py @@ -0,0 +1 @@ +"""Seeking Alpha provider tests.""" diff --git a/openbb_platform/providers/seeking_alpha/tests/test_seeking_alpha_fetchers.py b/openbb_platform/providers/seeking_alpha/tests/test_seeking_alpha_fetchers.py index fb89a5e0299..e279c044e00 100644 --- a/openbb_platform/providers/seeking_alpha/tests/test_seeking_alpha_fetchers.py +++ b/openbb_platform/providers/seeking_alpha/tests/test_seeking_alpha_fetchers.py @@ -1,3 +1,5 @@ +"""Tests for the Seeking Alpha fetchers.""" + import pytest from openbb_core.app.service.user_service import UserService from openbb_seeking_alpha.models.upcoming_release_days import ( @@ -11,6 +13,7 @@ test_credentials = UserService().default_user_settings.credentials.model_dump( @pytest.fixture(scope="module") def vcr_config(): + """VCR configuration.""" return { "filter_headers": [("User-Agent", None)], "filter_query_parameters": [ @@ -21,6 +24,7 @@ def vcr_config(): @pytest.mark.record_http def test_sa_upcoming_release_days_fetcher(credentials=test_credentials): + """Test the Seeking Alpha Upcoming Release Days fetcher.""" params = {"limit": 5} fetcher = SAUpcomingReleaseDaysFetcher() diff --git a/openbb_platform/providers/stockgrid/__init__.py b/openbb_platform/providers/stockgrid/__init__.py index e69de29bb2d..61d62436f15 100644 --- a/openbb_platform/providers/stockgrid/__init__.py +++ b/openbb_platform/providers/stockgrid/__init__.py @@ -0,0 +1 @@ +"""Stockgrid provider.""" diff --git a/openbb_platform/providers/stockgrid/poetry.lock b/openbb_platform/providers/stockgrid/poetry.lock index 035cf5320d7..10be16a257a 100644 --- a/openbb_platform/providers/stockgrid/poetry.lock +++ b/openbb_platform/providers/stockgrid/poetry.lock @@ -696,13 +696,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1489,4 +1489,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e65cf7357235dd769f59f934a0b3b7269423aefab7894263aec71a45c2dc95db" +content-hash = "26d1a0d45b5b2c949bc78c9c9d7f1f4b0da40bfd8ae1ff8882d162fa23248a53" diff --git a/openbb_platform/providers/stockgrid/pyproject.toml b/openbb_platform/providers/stockgrid/pyproject.toml index 12c744446f0..64f5ff05a1e 100644 --- a/openbb_platform/providers/stockgrid/pyproject.toml +++ b/openbb_platform/providers/stockgrid/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-stockgrid" -version = "1.1.4" +version = "1.1.5" description = "stockgrid extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_stockgrid" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" pytest-freezegun = "^0.4.2" [build-system] diff --git a/openbb_platform/providers/stockgrid/tests/test_stockgrid_fetchers.py b/openbb_platform/providers/stockgrid/tests/test_stockgrid_fetchers.py index cdc591c080d..a06c0e619ea 100644 --- a/openbb_platform/providers/stockgrid/tests/test_stockgrid_fetchers.py +++ b/openbb_platform/providers/stockgrid/tests/test_stockgrid_fetchers.py @@ -1,3 +1,5 @@ +"""Test stockgrid fetchers.""" + import pytest from openbb_core.app.service.user_service import UserService from openbb_stockgrid.models.short_volume import StockgridShortVolumeFetcher @@ -9,6 +11,7 @@ test_credentials = UserService().default_user_settings.credentials.model_dump( @pytest.fixture(scope="module") def vcr_config(): + """VCR configuration.""" return { "filter_headers": [("User-Agent", None)], "filter_query_parameters": [ @@ -20,6 +23,7 @@ def vcr_config(): @pytest.mark.freeze_time("2023-11-08") @pytest.mark.record_http def test_stockgrid_short_volume_fetcher(credentials=test_credentials): + """Test short volume fetcher.""" params = {"symbol": "AAPL"} fetcher = StockgridShortVolumeFetcher() diff --git a/openbb_platform/providers/tests/__init__.py b/openbb_platform/providers/tests/__init__.py index e69de29bb2d..bf8046d32a1 100644 --- a/openbb_platform/providers/tests/__init__.py +++ b/openbb_platform/providers/tests/__init__.py @@ -0,0 +1 @@ +"""OpenBB Provider tests.""" diff --git a/openbb_platform/providers/tests/utils/__init__.py b/openbb_platform/providers/tests/utils/__init__.py index e69de29bb2d..83831219db3 100644 --- a/openbb_platform/providers/tests/utils/__init__.py +++ b/openbb_platform/providers/tests/utils/__init__.py @@ -0,0 +1 @@ +"""Provider test utils.""" diff --git a/openbb_platform/providers/tiingo/__init__.py b/openbb_platform/providers/tiingo/__init__.py index e69de29bb2d..da05810f5e9 100644 --- a/openbb_platform/providers/tiingo/__init__.py +++ b/openbb_platform/providers/tiingo/__init__.py @@ -0,0 +1 @@ +"""Tiingo provider.""" diff --git a/openbb_platform/providers/tiingo/poetry.lock b/openbb_platform/providers/tiingo/poetry.lock index 7f12dfce23c..f5cf8931f29 100644 --- a/openbb_platform/providers/tiingo/poetry.lock +++ b/openbb_platform/providers/tiingo/poetry.lock @@ -682,13 +682,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1401,4 +1401,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e5a1c1f22e0b8e42343cef04f6f23281c7d6441df13f2be91584098c856ab1f0" +content-hash = "ca421fe0dbae56150a2fc3a7978ad65f3dd4e70025bc4da4a7f1338b8eca522c" diff --git a/openbb_platform/providers/tiingo/pyproject.toml b/openbb_platform/providers/tiingo/pyproject.toml index 18b3abfff52..2c703613733 100644 --- a/openbb_platform/providers/tiingo/pyproject.toml +++ b/openbb_platform/providers/tiingo/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-tiingo" -version = "1.1.4" +version = "1.1.5" description = "Tiingo extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_tiingo" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/providers/tiingo/tests/test_tiingo_fetchers.py b/openbb_platform/providers/tiingo/tests/test_tiingo_fetchers.py index 24357f9e02e..26dcddaf1df 100644 --- a/openbb_platform/providers/tiingo/tests/test_tiingo_fetchers.py +++ b/openbb_platform/providers/tiingo/tests/test_tiingo_fetchers.py @@ -1,3 +1,5 @@ +"""Test Tiingo fetchers.""" + from datetime import date import pytest @@ -16,6 +18,7 @@ test_credentials = UserService().default_user_settings.credentials.model_dump( @pytest.fixture(scope="module") def vcr_config(): + """VCR configuration.""" return { "filter_headers": [("User-Agent", None)], "filter_query_parameters": [ @@ -26,6 +29,7 @@ def vcr_config(): @pytest.mark.record_http def test_tiingo_equity_historical_fetcher(credentials=test_credentials): + """Test Tiingo equity historical fetcher.""" params = { "symbol": "AAPL", "start_date": date(2023, 1, 1), @@ -39,6 +43,7 @@ def test_tiingo_equity_historical_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tiingo_company_news_fetcher(credentials=test_credentials): + """Test Tiingo company news fetcher.""" params = {"symbol": "AAPL,MSFT"} fetcher = TiingoCompanyNewsFetcher() @@ -48,6 +53,7 @@ def test_tiingo_company_news_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tiingo_world_news_fetcher(credentials=test_credentials): + """Test Tiingo world news fetcher.""" params = {"limit": 20} fetcher = TiingoWorldNewsFetcher() @@ -57,6 +63,7 @@ def test_tiingo_world_news_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tiingo_crypto_historical_fetcher(credentials=test_credentials): + """Test Tiingo crypto historical fetcher.""" params = { "symbol": "BTCUSD", "start_date": date(2023, 1, 1), @@ -70,6 +77,7 @@ def test_tiingo_crypto_historical_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tiingo_currency_historical_fetcher(credentials=test_credentials): + """Test Tiingo currency historical fetcher.""" params = { "symbol": "EURUSD", "start_date": date(2023, 1, 1), @@ -83,6 +91,7 @@ def test_tiingo_currency_historical_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tiingo_trailing_div_yield_fetcher(credentials=test_credentials): + """Test Tiingo trailing dividend yield fetcher.""" params = {"symbol": "SCHD"} fetcher = TiingoTrailingDivYieldFetcher() diff --git a/openbb_platform/providers/tmx/__init__.py b/openbb_platform/providers/tmx/__init__.py index e69de29bb2d..ecfc13312a4 100644 --- a/openbb_platform/providers/tmx/__init__.py +++ b/openbb_platform/providers/tmx/__init__.py @@ -0,0 +1 @@ +"""TMX Provider.""" diff --git a/openbb_platform/providers/tmx/openbb_tmx/models/__init__.py b/openbb_platform/providers/tmx/openbb_tmx/models/__init__.py index e69de29bb2d..8810abcee39 100644 --- a/openbb_platform/providers/tmx/openbb_tmx/models/__init__.py +++ b/openbb_platform/providers/tmx/openbb_tmx/models/__init__.py @@ -0,0 +1 @@ +"""TMX Provider Models.""" diff --git a/openbb_platform/providers/tmx/openbb_tmx/models/calendar_earnings.py b/openbb_platform/providers/tmx/openbb_tmx/models/calendar_earnings.py index 0494f09d08b..87082ce6130 100644 --- a/openbb_platform/providers/tmx/openbb_tmx/models/calendar_earnings.py +++ b/openbb_platform/providers/tmx/openbb_tmx/models/calendar_earnings.py @@ -1,4 +1,4 @@ -"""TMX Earnings Calendar Model""" +"""TMX Earnings Calendar Model.""" # pylint: disable=unused-argument import asyncio @@ -85,14 +85,12 @@ class TmxCalendarEarningsFetcher( **kwargs: Any, ) -> List[Dict]: """Return the raw data from the TMX endpoint.""" - - results = [] - dates = [] + results: List[Dict] = [] user_agent = get_random_agent() dates = date_range(query.start_date, end=query.end_date) async def create_task(date, results): - """Creates a task for a single date in the range.""" + """Create a task for a single date in the range.""" data = [] date = date.strftime("%Y-%m-%d") payload = gql.get_earnings_date_payload.copy() diff --git a/openbb_platform/providers/tmx/openbb_tmx/models/company_news.py b/openbb_platform/providers/tmx/openbb_tmx/models/company_news.py index 4c8269ac241..cc8fd504cdc 100644 --- a/openbb_platform/providers/tmx/openbb_tmx/models/company_news.py +++ b/openbb_platform/providers/tmx/openbb_tmx/models/company_news.py @@ -26,9 +26,17 @@ class TmxCompanyNewsQueryParams(CompanyNewsQueryParams): default=1, description="The page number to start from. Use with limit." ) + @field_validator("symbol", mode="before") + @classmethod + def symbols_validate(cls, v): + """Validate the symbols.""" + if v is None: + raise ValueError("Symbol is a required field for TMX.") + return v + class TmxCompanyNewsData(CompanyNewsData): - """TMX Stock News Data""" + """TMX Stock News Data.""" __alias_dict__ = { "date": "datetime", @@ -63,12 +71,11 @@ class TmxCompanyNewsFetcher( ) -> List[Dict]: """Return the raw data from the TMX endpoint.""" user_agent = get_random_agent() - symbols = query.symbol.split(",") - results = [] + symbols = query.symbol.split(",") # type: ignore + results: List[Dict] = [] async def create_task(symbol, results): - """Makes a POST request to the TMX GraphQL endpoint for a single symbol.""" - + """Make a POST request to the TMX GraphQL endpoint for a single symbol.""" symbol = ( symbol.upper().replace(".TO", "").replace(".TSX", "").replace("-", ".") ) @@ -78,7 +85,7 @@ class TmxCompanyNewsFetcher( payload["variables"]["limit"] = query.limit payload["variables"]["locale"] = "en" url = "https://app-money.tmx.com/graphql" - data = {} + data: Dict = {} response = await get_data_from_gql( method="POST", url=url, diff --git a/openbb_platform/providers/tmx/openbb_tmx/models/equity_historical.py b/openbb_platform/providers/tmx/openbb_tmx/models/equity_historical.py index acc66c79449..f81c10e06f9 100644 --- a/openbb_platform/providers/tmx/openbb_tmx/models/equity_historical.py +++ b/openbb_platform/providers/tmx/openbb_tmx/models/equity_historical.py @@ -48,7 +48,7 @@ class TmxEquityHistoricalQueryParams(EquityHistoricalQueryParams): interval: Union[ Literal["1m", "2m", "5m", "15m", "30m", "60m", "1h", "1d", "1W", "1M"], str, int - ] = Field( + ] = Field( # type: ignore description=QUERY_DESCRIPTIONS.get("interval", "") + " Or, any integer (entered as a string) representing the number of minutes." + " Default is daily data." @@ -146,12 +146,11 @@ class TmxEquityHistoricalFetcher( **kwargs: Any, ) -> List[Dict]: """Return the raw data from the TMX endpoint.""" - results: List[Dict] = [] symbols = query.symbol.split(",") async def create_task(symbol, results): - """Makes a POST request to the TMX GraphQL endpoint for a single ticker.""" + """Make a POST request to the TMX GraphQL endpoint for a single ticker.""" data: List[Dict] = [] # A different request is used for each type of interval. if query.interval == "day": @@ -199,7 +198,6 @@ class TmxEquityHistoricalFetcher( **kwargs: Any, ) -> List[TmxEquityHistoricalData]: """Return the transformed data.""" - results = DataFrame(data) if results.empty or len(results) == 0: raise EmptyDataError() diff --git a/openbb_platform/providers/tmx/openbb_tmx/models/equity_profile.py b/openbb_platform/providers/tmx/openbb_tmx/models/equity_profile.py index 9627e25b7c6..ddce1445ef7 100644 --- a/openbb_platform/providers/tmx/openbb_tmx/models/equity_profile.py +++ b/openbb_platform/providers/tmx/openbb_tmx/models/equity_profile.py @@ -1,4 +1,4 @@ -"""TMX Equity Profile fetcher""" +"""TMX Equity Profile fetcher.""" # pylint: disable=unused-argument import asyncio @@ -84,18 +84,16 @@ class TmxEquityProfileFetcher( **kwargs: Any, ) -> List[Dict]: """Return the raw data from the TMX endpoint.""" - symbols = query.symbol.split(",") # The list where the results will be stored and appended to. - results = [] + results: List[Dict] = [] user_agent = get_random_agent() url = "https://app-money.tmx.com/graphql" async def create_task(symbol: str, results) -> None: - """Makes a POST request to the TMX GraphQL endpoint for a single symbol.""" - + """Make a POST request to the TMX GraphQL endpoint for a single symbol.""" symbol = ( symbol.upper().replace("-", ".").replace(".TO", "").replace(".TSX", "") ) @@ -133,7 +131,6 @@ class TmxEquityProfileFetcher( **kwargs: Any, ) -> List[TmxEquityProfileData]: """Return the transformed data.""" - # Get only the items associated with `equity.profile()`. items_list = [ "shortDescription", diff --git a/openbb_platform/providers/tmx/openbb_tmx/models/equity_quote.py b/openbb_platform/providers/tmx/openbb_tmx/models/equity_quote.py index 8edd26c6099..a97659e5f7a 100644 --- a/openbb_platform/providers/tmx/openbb_tmx/models/equity_quote.py +++ b/openbb_platform/providers/tmx/openbb_tmx/models/equity_quote.py @@ -1,4 +1,4 @@ -"""TMX Equity Profile fetcher""" +"""TMX Equity Profile fetcher.""" # pylint: disable=unused-argument @@ -237,7 +237,7 @@ class TmxEquityQuoteData(EquityQuoteData): ) @classmethod def date_validate(cls, v): # pylint: disable=E0213 - """Return the datetime object from the date string""" + """Return the datetime object from the date string.""" if v: try: return datetime.strptime(v, "%Y-%m-%d").date() @@ -281,18 +281,16 @@ class TmxEquityQuoteFetcher( **kwargs: Any, ) -> List[Dict]: """Return the raw data from the TMX endpoint.""" - symbols = query.symbol.split(",") # The list where the results will be stored and appended to. - results = [] + results: List[Dict] = [] user_agent = get_random_agent() url = "https://app-money.tmx.com/graphql" async def create_task(symbol: str, results) -> None: - """Makes a POST request to the TMX GraphQL endpoint for a single symbol.""" - + """Make a POST request to the TMX GraphQL endpoint for a single symbol.""" symbol = ( symbol.upper().replace("-", ".").replace(".TO", "").replace(".TSX", "") ) @@ -332,7 +330,6 @@ class TmxEquityQuoteFetcher( **kwargs: Any, ) -> List[TmxEquityQuoteData]: """Return the transformed data.""" - # Remove the items associated with `equity.profile()`. items_list = [ "shortDescription", diff --git a/openbb_platform/providers/tmx/openbb_tmx/models/gainers.py b/openbb_platform/providers/tmx/openbb_tmx/models/gainers.py index 169a737201b..461be6775af 100644 --- a/openbb_platform/providers/tmx/openbb_tmx/models/gainers.py +++ b/openbb_platform/providers/tmx/openbb_tmx/models/gainers.py @@ -76,6 +76,7 @@ class TmxGainersData(EquityPerformanceData): @model_validator(mode="before") @classmethod def check_metric(cls, values): + """Check for missing metrics.""" for k, v in values.items(): if v is None or v == "-": values[k] = 0 @@ -104,7 +105,6 @@ class TmxGainersFetcher( **kwargs: Any, ) -> List[TmxGainersData]: """Return the raw data from the TMX endpoint.""" - user_agent = get_random_agent() payload = gql.get_stock_list_payload.copy() payload["variables"]["stockListId"] = STOCK_LISTS_DICT[query.category] diff --git a/openbb_platform/providers/tmx/openbb_tmx/models/index_constituents.py b/openbb_platform/providers/tmx/openbb_tmx/models/index_constituents.py index 915ebe03005..9d299d3fa24 100644 --- a/openbb_platform/providers/tmx/openbb_tmx/models/index_constituents.py +++ b/openbb_platform/providers/tmx/openbb_tmx/models/index_constituents.py @@ -1,4 +1,4 @@ -"""TMX Index Constituents Model""" +"""TMX Index Constituents Model.""" # pylint: disable=unused-argument from typing import Any, Dict, List, Optional @@ -49,6 +49,8 @@ class TmxIndexConstituentsFetcher( List[TmxIndexConstituentsData], ] ): + """TMX Index Constituents Fetcher.""" + @staticmethod def transform_query(params: Dict[str, Any]) -> TmxIndexConstituentsQueryParams: """Transform the query.""" @@ -61,7 +63,6 @@ class TmxIndexConstituentsFetcher( **kwargs: Any, ) -> Dict: """Return the raw data from the TMX endpoint.""" - url = "https://tmxinfoservices.com/files/indices/sptsx-indices.json" data = await get_data_from_url( diff --git a/openbb_platform/providers/tmx/openbb_tmx/models/index_snapshots.py b/openbb_platform/providers/tmx/openbb_tmx/models/index_snapshots.py index a57e030155b..2052991fff7 100644 --- a/openbb_platform/providers/tmx/openbb_tmx/models/index_snapshots.py +++ b/openbb_platform/providers/tmx/openbb_tmx/models/index_snapshots.py @@ -1,4 +1,4 @@ -"""TMX Index Snapshots Model""" +"""TMX Index Snapshots Model.""" # pylint: disable=unused-argument import json @@ -24,7 +24,7 @@ from pydantic import Field, field_validator class TmxIndexSnapshotsQueryParams(IndexSnapshotsQueryParams): """TMX Index Snapshots Query Params.""" - region: Literal[None, "ca", "us"] = Field(default="ca") + region: Literal[None, "ca", "us"] = Field(default="ca") # type: ignore use_cache: bool = Field( default=True, description="Whether to use a cached request." @@ -151,6 +151,8 @@ class TmxIndexSnapshotsFetcher( List[TmxIndexSnapshotsData], ] ): + """TMX Index Snapshots Fetcher.""" + @staticmethod def transform_query(params: Dict[str, Any]) -> TmxIndexSnapshotsQueryParams: """Transform the query.""" diff --git a/openbb_platform/providers/tmx/openbb_tmx/models/insider_trading.py b/openbb_platform/providers/tmx/openbb_tmx/models/insider_trading.py index 831ae110771..4764e5310c3 100644 --- a/openbb_platform/providers/tmx/openbb_tmx/models/insider_trading.py +++ b/openbb_platform/providers/tmx/openbb_tmx/models/insider_trading.py @@ -1,4 +1,4 @@ -"""TMX Insider Trading Model""" +"""TMX Insider Trading Model.""" # pylint: disable=unused-argument import json @@ -17,7 +17,7 @@ from pydantic import Field, field_validator class TmxInsiderTradingQueryParams(InsiderTradingQueryParams): - """TMX Insider Trading Query Params""" + """TMX Insider Trading Query Params.""" summary: bool = Field( default=False, @@ -26,7 +26,7 @@ class TmxInsiderTradingQueryParams(InsiderTradingQueryParams): class TmxInsiderTradingData(InsiderTradingData): - """TMX Insider Trading Data""" + """TMX Insider Trading Data.""" period: str = Field( description="The period of the activity. Bucketed by three, six, and twelve months." @@ -66,6 +66,7 @@ class TmxInsiderTradingData(InsiderTradingData): @field_validator("period", mode="before", check_fields=False) @classmethod def period_to_snake_case(cls, v): + """Convert the period to snake case.""" return to_snake_case(v) if v else None @@ -89,7 +90,6 @@ class TmxInsiderTradingFetcher( **kwargs: Any, ) -> List[Dict]: """Return the raw data from the TMX endpoint.""" - results = [] user_agent = get_random_agent() symbol = ( diff --git a/openbb_platform/providers/tmx/openbb_tmx/models/price_target_consensus.py b/openbb_platform/providers/tmx/openbb_tmx/models/price_target_consensus.py index fd66433b45d..1ee9a9f7135 100644 --- a/openbb_platform/providers/tmx/openbb_tmx/models/price_target_consensus.py +++ b/openbb_platform/providers/tmx/openbb_tmx/models/price_target_consensus.py @@ -20,6 +20,14 @@ class TmxPriceTargetConsensusQueryParams(PriceTargetConsensusQueryParams): __json_schema_extra__ = {"symbol": ["multiple_items_allowed"]} + @field_validator("symbol", mode="before", check_fields=False) + @classmethod + def check_symbol(cls, value): + """Check the symbol.""" + if not value: + raise RuntimeError("Error: Symbol is a required field for TMX.") + return value + class TmxPriceTargetConsensusData(PriceTargetConsensusData): """TMX Price Target Consensus Data.""" @@ -88,8 +96,8 @@ class TmxPriceTargetConsensusFetcher( **kwargs: Any, ) -> List[Dict]: """Return the raw data from the TMX endpoint.""" - symbols = query.symbol.split(",") - results = [] + symbols = query.symbol.split(",") # type: ignore + results: List[Dict] = [] async def create_task(symbol, results): """Create a task for each symbol provided.""" diff --git a/openbb_platform/providers/tmx/openbb_tmx/utils/__init__.py b/openbb_platform/providers/tmx/openbb_tmx/utils/__init__.py index e69de29bb2d..75323e86bd9 100644 --- a/openbb_platform/providers/tmx/openbb_tmx/utils/__init__.py +++ b/openbb_platform/providers/tmx/openbb_tmx/utils/__init__.py @@ -0,0 +1 @@ +"""TMX Provider Utils.""" diff --git a/openbb_platform/providers/tmx/openbb_tmx/utils/helpers.py b/openbb_platform/providers/tmx/openbb_tmx/utils/helpers.py index 6f31263e82f..2ed84d0abb0 100644 --- a/openbb_platform/providers/tmx/openbb_tmx/utils/helpers.py +++ b/openbb_platform/providers/tmx/openbb_tmx/utils/helpers.py @@ -12,7 +12,7 @@ from datetime import ( timedelta, ) from io import StringIO -from typing import Any, Dict, List, Literal, Optional +from typing import Any, Dict, List, Literal, Optional, Union import exchange_calendars as xcals import pandas as pd @@ -265,7 +265,7 @@ NASDAQ_GIDS = { async def response_callback(response, _: Any): - """Callback for HTTP Client Response.""" + """Use callback for HTTP Client Response.""" content_type = response.headers.get("Content-Type", "") if "application/json" in content_type: return await response.json() @@ -296,7 +296,6 @@ async def get_data_from_url( async def get_data_from_gql(url: str, headers, data, **kwargs: Any) -> Any: """Make an asynchronous GraphQL request.""" - response = await amake_request( url=url, method="POST", @@ -310,7 +309,7 @@ async def get_data_from_gql(url: str, headers, data, **kwargs: Any) -> Any: def replace_values_in_list_of_dicts(data): - """Helper function to replace "NA" and "-" with None in a list of dictionaries.""" + """Replace "NA" and "-" with None in a list of dictionaries.""" for d in data: for k, v in d.items(): if isinstance(v, dict): @@ -329,7 +328,7 @@ def replace_values_in_list_of_dicts(data): def check_weekday(date) -> str: - """Helper function to check if the input date is a weekday, and if not, returns the next weekday. + """Check if the input date is a weekday, and if not, returns the next weekday. Parameters ---------- @@ -341,32 +340,27 @@ def check_weekday(date) -> str: str Date in YYYY-MM-DD format. If the date is a weekend, returns the date of the next weekday. """ - if pd.to_datetime(date).weekday() > 4: return next_workday(pd.to_datetime(date)).strftime("%Y-%m-%d") return date async def get_all_etfs(use_cache: bool = True) -> List[Dict]: - """ - Gets a summary of the TMX ETF universe. + """Get a summary of the TMX ETF universe. Returns ------- Dict Dictionary with all TMX-listed ETFs. """ - url = "https://dgr53wu9i7rmp.cloudfront.net/etfs/etfs.json" response = await get_data_from_url( url, use_cache=use_cache, backend=tmx_etfs_backend ) - if response is None: - raise RuntimeError( - f"There was a problem with the request. Could not get ETFs. -> {response.status_code}" - ) + if not response or response is None: + raise RuntimeError("There was a problem with the request. Could not get ETFs.") response = replace_values_in_list_of_dicts(response) @@ -403,8 +397,7 @@ async def get_all_etfs(use_cache: bool = True) -> List[Dict]: async def get_tmx_tickers( exchange: Literal["tsx", "tsxv"] = "tsx", use_cache: bool = True ) -> Dict: - """Gets a dictionary of either TSX or TSX-V symbols and names.""" - + """Get a dictionary of either TSX or TSX-V symbols and names.""" tsx_json_url = "https://www.tsx.com/json/company-directory/search" url = f"{tsx_json_url}/{exchange}/*" response = await get_data_from_url( @@ -420,7 +413,7 @@ async def get_tmx_tickers( async def get_all_tmx_companies(use_cache: bool = True) -> Dict: - """Merges TSX and TSX-V listings into a single dictionary.""" + """Merge TSX and TSX-V listings into a single dictionary.""" all_tmx = {} tsx_tickers = await get_tmx_tickers(use_cache=use_cache) tsxv_tickers = await get_tmx_tickers("tsxv", use_cache=use_cache) @@ -430,14 +423,13 @@ async def get_all_tmx_companies(use_cache: bool = True) -> Dict: async def get_all_options_tickers(use_cache: bool = True) -> pd.DataFrame: - """Returns a DataFrame with all valid ticker symbols.""" - + """Return a DataFrame with all valid ticker symbols.""" url = "https://www.m-x.ca/en/trading/data/options-list" r = await get_data_from_url(url, use_cache=use_cache, backend=tmx_companies_backend) - if r is None: - raise RuntimeError(f"Error with the request: {r.status_code}") + if r is None or r == []: + raise RuntimeError("Error with the request") # mypy: ignore options_listings = pd.read_html(StringIO(r)) listings = pd.concat(options_listings) @@ -456,8 +448,7 @@ async def get_all_options_tickers(use_cache: bool = True) -> pd.DataFrame: async def get_current_options(symbol: str, use_cache: bool = True) -> pd.DataFrame: - """Gets the current quotes for the complete options chain.""" - + """Get the current quotes for the complete options chain.""" SYMBOLS = await get_all_options_tickers(use_cache=use_cache) data = pd.DataFrame() symbol = symbol.upper() @@ -558,8 +549,7 @@ async def get_current_options(symbol: str, use_cache: bool = True) -> pd.DataFra async def download_eod_chains( symbol: str, date: Optional[dateType] = None, use_cache: bool = False ) -> pd.DataFrame: - """Downloads EOD chains data for a given symbol and date.""" - + """Download EOD chains data for a given symbol and date.""" symbol = symbol.upper() SYMBOLS = await get_all_options_tickers(use_cache=False) # Remove echange identifiers from the symbol. @@ -582,10 +572,10 @@ async def download_eod_chains( EOD_URL = BASE_URL + f"{symbol}" "&dnld=1#quotes" if date is not None: date = check_weekday(date) # type: ignore - if cal.is_session(date) is False: + if cal.is_session(date) is False: # type: ignore date = (pd.to_datetime(date) + timedelta(days=1)).strftime("%Y-%m-%d") # type: ignore date = check_weekday(date) # type: ignore - if cal.is_session(date=date) is False: + if cal.is_session(date=date) is False: # type: ignore date = (pd.to_datetime(date) + timedelta(days=1)).strftime("%Y-%m-%d") # type: ignore EOD_URL = ( @@ -717,8 +707,8 @@ async def get_company_filings( async def get_daily_price_history( symbol: str, - start_date: Optional[dateType] = None, - end_date: Optional[dateType] = None, + start_date: Optional[Union[str, dateType]] = None, + end_date: Optional[Union[str, dateType]] = None, adjustment: Literal[ "splits_only", "unadjusted", "splits_and_dividends" ] = "splits_only", @@ -834,21 +824,23 @@ async def get_daily_price_history( async def get_weekly_or_monthly_price_history( symbol: str, - start_date: Optional[dateType] = None, - end_date: Optional[dateType] = None, + start_date: Optional[Union[str, dateType]] = None, + end_date: Optional[Union[str, dateType]] = None, interval: Literal["month", "week"] = "month", ): """Get historical price data.""" - start_date = ( - datetime.strptime(start_date, "%Y-%m-%d") - if isinstance(start_date, str) - else start_date - ) - end_date = ( - datetime.strptime(end_date, "%Y-%m-%d") - if isinstance(end_date, str) - else end_date - ) + if start_date: + start_date = ( + datetime.strptime(start_date, "%Y-%m-%d") + if isinstance(start_date, str) + else start_date + ) + if end_date: + end_date = ( + datetime.strptime(end_date, "%Y-%m-%d") + if isinstance(end_date, str) + else end_date + ) user_agent = get_random_agent() results: List[Dict] = [] symbol = symbol.upper().replace("-", ".").replace(".TO", "").replace(".TSX", "") @@ -868,8 +860,14 @@ async def get_weekly_or_monthly_price_history( payload["variables"].pop("endDateTime") payload["variables"]["symbol"] = symbol payload["variables"]["freq"] = interval - payload["variables"]["end"] = end_date.strftime("%Y-%m-%d") - payload["variables"]["start"] = start_date.strftime("%Y-%m-%d") + payload["variables"]["end"] = ( + end_date.strftime("%Y-%m-%d") if isinstance(end_date, dateType) else end_date + ) + payload["variables"]["start"] = ( + start_date.strftime("%Y-%m-%d") + if isinstance(start_date, dateType) + else start_date + ) url = "https://app-money.tmx.com/graphql" data = await get_data_from_gql( method="POST", @@ -914,21 +912,23 @@ async def get_weekly_or_monthly_price_history( async def get_intraday_price_history( symbol: str, - start_date: Optional[dateType] = None, - end_date: Optional[dateType] = None, + start_date: Optional[Union[str, dateType]] = None, + end_date: Optional[Union[str, dateType]] = None, interval: Optional[int] = 1, ): """Get historical price data.""" - start_date = ( - datetime.strptime(start_date, "%Y-%m-%d") - if isinstance(start_date, str) - else start_date - ) - end_date = ( - datetime.strptime(end_date, "%Y-%m-%d") - if isinstance(end_date, str) - else end_date - ) + if start_date: + start_date = ( + datetime.strptime(start_date, "%Y-%m-%d") + if isinstance(start_date, str) + else start_date + ) + if end_date: + end_date = ( + datetime.strptime(end_date, "%Y-%m-%d") + if isinstance(end_date, str) + else end_date + ) user_agent = get_random_agent() results: List[Dict] = [] symbol = symbol.upper().replace("-", ".").replace(".TO", "").replace(".TSX", "") @@ -941,11 +941,11 @@ async def get_intraday_price_history( # This is the first date of available intraday data. date_check = datetime(2022, 4, 12).date() start_date = max(start_date, date_check) - if end_date < date_check: + if end_date < date_check: # type: ignore end_date = datetime.now().date() # Generate a list of dates from start_date to end_date with a frequency of 3 weeks dates = list( - rrule.rrule(rrule.WEEKLY, interval=4, dtstart=start_date, until=end_date) + rrule.rrule(rrule.WEEKLY, interval=4, dtstart=start_date, until=end_date) # type: ignore ) if dates[-1] != end_date: @@ -1039,8 +1039,10 @@ async def get_intraday_price_history( async def get_all_bonds(use_cache: bool = True) -> pd.DataFrame: - """Gets all bonds reference data published by CIRO. The complete list is approximately 70-100K securities.""" + """Get all bonds reference data published by CIRO. + The complete list is approximately 70-100K securities. + """ url = "https://bondtradedata.iiroc.ca/debtip/designatedbonds/list" response = await get_data_from_url( url, use_cache=use_cache, timeout=30, backend=tmx_bonds_backend diff --git a/openbb_platform/providers/tmx/poetry.lock b/openbb_platform/providers/tmx/poetry.lock index 7d2790aca29..e9d1c0cab5d 100644 --- a/openbb_platform/providers/tmx/poetry.lock +++ b/openbb_platform/providers/tmx/poetry.lock @@ -756,13 +756,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1501,4 +1501,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "a0e9e0c6fc96a331f4ae5355ccdfbc55ebf564b33e75953e5c8f82a9b3ab952e" +content-hash = "d2c6f6ecc431b148a13d6bd38750be5d9fe52558fab654fb9d76d15502225bfd" diff --git a/openbb_platform/providers/tmx/pyproject.toml b/openbb_platform/providers/tmx/pyproject.toml index 675beab0ab2..2765f631836 100644 --- a/openbb_platform/providers/tmx/pyproject.toml +++ b/openbb_platform/providers/tmx/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-tmx" -version = "1.0.1" +version = "1.0.2" description = "Unofficial TMX data provider extension for the OpenBB Platform - Public Canadian markets data for Python and Fast API." authors = ["OpenBB "] readme = "README.md" @@ -12,7 +12,7 @@ aiohttp-client-cache = "^0.10.0" aiosqlite = "^0.19.0" random-user-agent = "^1.0.1" exchange-calendars = "^4.2.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/providers/tmx/tests/__init__.py b/openbb_platform/providers/tmx/tests/__init__.py index 8b137891791..82c47774efc 100644 --- a/openbb_platform/providers/tmx/tests/__init__.py +++ b/openbb_platform/providers/tmx/tests/__init__.py @@ -1 +1 @@ - +"""TMX Tests.""" diff --git a/openbb_platform/providers/tmx/tests/test_tmx_fetchers.py b/openbb_platform/providers/tmx/tests/test_tmx_fetchers.py index 652b0159def..685da00dad2 100644 --- a/openbb_platform/providers/tmx/tests/test_tmx_fetchers.py +++ b/openbb_platform/providers/tmx/tests/test_tmx_fetchers.py @@ -33,6 +33,7 @@ test_credentials = UserService().default_user_settings.credentials.model_dump() @pytest.fixture(scope="module") def vcr_config(): + """VCR configuration.""" return { "filter_headers": [("User-Agent", None)], "filter_query_parameters": [ @@ -43,6 +44,7 @@ def vcr_config(): @pytest.mark.record_http def test_tmx_equity_profile_fetcher(credentials=test_credentials): + """Test equity profile fetcher.""" params = {"symbol": "RY,NTR"} fetcher = TmxEquityProfileFetcher() @@ -52,6 +54,7 @@ def test_tmx_equity_profile_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tmx_equity_search_fetcher(credentials=test_credentials): + """Test equity search fetcher.""" params = {"query": "gold", "use_cache": False} fetcher = TmxEquitySearchFetcher() @@ -61,6 +64,7 @@ def test_tmx_equity_search_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tmx_available_indices_fetcher(credentials=test_credentials): + """Test available indices fetcher.""" params = {"use_cache": False} fetcher = TmxAvailableIndicesFetcher() @@ -70,6 +74,7 @@ def test_tmx_available_indices_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tmx_calendar_earnings_fetcher(credentials=test_credentials): + """Test calendar earnings fetcher.""" params = {"start_date": date(2023, 1, 2), "end_date": date(2023, 1, 31)} fetcher = TmxCalendarEarningsFetcher() @@ -79,6 +84,7 @@ def test_tmx_calendar_earnings_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tmx_company_filings_fetcher(credentials=test_credentials): + """Test company filings fetcher.""" params = { "symbol": "SHOP", "start_date": date(2023, 6, 30), @@ -92,6 +98,7 @@ def test_tmx_company_filings_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tmx_company_news_fetcher(credentials=test_credentials): + """Test company news fetcher.""" params = {"symbol": "SHOP", "limit": 5} fetcher = TmxCompanyNewsFetcher() @@ -101,6 +108,7 @@ def test_tmx_company_news_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tmx_equity_historical_fetcher(credentials=test_credentials): + """Test equity historical fetcher.""" params = { "symbol": "SHOP", "start_date": date(2022, 1, 1), @@ -114,6 +122,7 @@ def test_tmx_equity_historical_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tmx_equity_quote_fetcher(credentials=test_credentials): + """Test equity quote fetcher.""" params = {"symbol": "SHOP"} fetcher = TmxEquityQuoteFetcher() @@ -123,6 +132,7 @@ def test_tmx_equity_quote_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tmx_etf_countries_fetcher(credentials=test_credentials): + """Test ETF countries fetcher.""" params = {"symbol": "HXX", "use_cache": False} fetcher = TmxEtfCountriesFetcher() @@ -132,6 +142,7 @@ def test_tmx_etf_countries_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tmx_etf_holdings_fetcher(credentials=test_credentials): + """Test ETF holdings fetcher.""" params = {"symbol": "XIU", "use_cache": False} fetcher = TmxEtfHoldingsFetcher() @@ -141,6 +152,7 @@ def test_tmx_etf_holdings_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tmx_etf_info_fetcher(credentials=test_credentials): + """Test ETF info fetcher.""" params = {"symbol": "XIU", "use_cache": False} fetcher = TmxEtfInfoFetcher() @@ -150,6 +162,7 @@ def test_tmx_etf_info_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tmx_etf_search_fetcher(credentials=test_credentials): + """Test ETF search fetcher.""" params = {"query": "sector", "use_cache": False} fetcher = TmxEtfSearchFetcher() @@ -159,6 +172,7 @@ def test_tmx_etf_search_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tmx_etf_sectors_fetcher(credentials=test_credentials): + """Test ETF sectors fetcher.""" params = {"symbol": "XIU", "use_cache": False} fetcher = TmxEtfSectorsFetcher() @@ -168,6 +182,7 @@ def test_tmx_etf_sectors_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tmx_gainers_fetcher(credentials=test_credentials): + """Test gainers fetcher.""" params = {} fetcher = TmxGainersFetcher() @@ -177,6 +192,7 @@ def test_tmx_gainers_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tmx_historical_dividends_fetcher(credentials=test_credentials): + """Test historical dividends fetcher.""" params = {"symbol": "TD"} fetcher = TmxHistoricalDividendsFetcher() @@ -186,6 +202,7 @@ def test_tmx_historical_dividends_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tmx_index_constituents_fetcher(credentials=test_credentials): + """Test index constituents fetcher.""" params = {"symbol": "^TX60", "use_cache": False} fetcher = TmxIndexConstituentsFetcher() @@ -195,6 +212,7 @@ def test_tmx_index_constituents_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tmx_index_sectors_fetcher(credentials=test_credentials): + """Test index sectors fetcher.""" params = {"symbol": "^TSX", "use_cache": False} fetcher = TmxIndexSectorsFetcher() @@ -204,6 +222,7 @@ def test_tmx_index_sectors_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tmx_index_snapshots_fetcher(credentials=test_credentials): + """Test index snapshots fetcher.""" params = {"use_cache": False} fetcher = TmxIndexSnapshotsFetcher() @@ -213,6 +232,7 @@ def test_tmx_index_snapshots_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tmx_insider_trading_fetcher(credentials=test_credentials): + """Test insider trading fetcher.""" params = {"symbol": "SHOP", "summary": False} fetcher = TmxInsiderTradingFetcher() @@ -222,6 +242,7 @@ def test_tmx_insider_trading_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tmx_options_chains_fetcher(credentials=test_credentials): + """Test options chains fetcher.""" params = {"symbol": "SHOP", "use_cache": False} fetcher = TmxOptionsChainsFetcher() @@ -231,6 +252,7 @@ def test_tmx_options_chains_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tmx_price_target_consensus_fetcher(credentials=test_credentials): + """Test price target consensus fetcher.""" params = {"symbol": "SHOP"} fetcher = TmxPriceTargetConsensusFetcher() @@ -240,6 +262,7 @@ def test_tmx_price_target_consensus_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tmx_treasury_prices_fetcher(credentials=test_credentials): + """Test treasury prices fetcher.""" params = {"govt_type": "federal", "use_cache": False} fetcher = TmxTreasuryPricesFetcher() @@ -249,6 +272,7 @@ def test_tmx_treasury_prices_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tmx_bond_prices_fetcher(credentials=test_credentials): + """Test bond prices fetcher.""" params = {"use_cache": False, "coupon_rate_min": 4} fetcher = TmxBondPricesFetcher() diff --git a/openbb_platform/providers/tradier/__init__.py b/openbb_platform/providers/tradier/__init__.py index e69de29bb2d..192b3be92d7 100644 --- a/openbb_platform/providers/tradier/__init__.py +++ b/openbb_platform/providers/tradier/__init__.py @@ -0,0 +1 @@ +"""Tradier provider.""" diff --git a/openbb_platform/providers/tradier/openbb_tradier/models/__init__.py b/openbb_platform/providers/tradier/openbb_tradier/models/__init__.py index e69de29bb2d..7c35443f7b5 100644 --- a/openbb_platform/providers/tradier/openbb_tradier/models/__init__.py +++ b/openbb_platform/providers/tradier/openbb_tradier/models/__init__.py @@ -0,0 +1 @@ +"""Tradier provider models.""" diff --git a/openbb_platform/providers/tradier/openbb_tradier/models/equity_historical.py b/openbb_platform/providers/tradier/openbb_tradier/models/equity_historical.py index b03249fc0d7..eed0d09d93a 100644 --- a/openbb_platform/providers/tradier/openbb_tradier/models/equity_historical.py +++ b/openbb_platform/providers/tradier/openbb_tradier/models/equity_historical.py @@ -1,4 +1,4 @@ -"""Tradier Equity Historical Model""" +"""Tradier Equity Historical Model.""" # pylint: disable = unused-argument @@ -16,7 +16,7 @@ from openbb_core.provider.utils.descriptions import ( QUERY_DESCRIPTIONS, ) from openbb_core.provider.utils.errors import EmptyDataError -from openbb_core.provider.utils.helpers import amake_request +from openbb_core.provider.utils.helpers import amake_request, safe_fromtimestamp from openbb_tradier.utils.constants import INTERVALS_DICT from pandas import to_datetime from pydantic import Field @@ -56,7 +56,6 @@ class TradierEquityHistoricalFetcher( @staticmethod def transform_query(params: Dict[str, Any]) -> TradierEquityHistoricalQueryParams: """Transform the query.""" - if params.get("interval") in ["1d", "1W", "1M"]: if params.get("start_date") is None: params["start_date"] = (datetime.now() - timedelta(days=365)).date() @@ -85,7 +84,6 @@ class TradierEquityHistoricalFetcher( **kwargs: Any, ) -> List[Dict]: """Return the raw data from the Tradier endpoint.""" - api_key = credentials.get("tradier_api_key") if credentials else "" sandbox = True @@ -120,7 +118,6 @@ class TradierEquityHistoricalFetcher( async def get_one(symbol): """Get data for one symbol.""" - result = [] url = ( @@ -150,7 +147,7 @@ class TradierEquityHistoricalFetcher( r["symbol"] = symbol _ = r.pop("time") r["timestamp"] = ( - datetime.fromtimestamp(r.get("timestamp")) + safe_fromtimestamp(r.get("timestamp")) .replace(microsecond=0) .astimezone(timezone("America/New_York")) ) diff --git a/openbb_platform/providers/tradier/openbb_tradier/models/equity_quote.py b/openbb_platform/providers/tradier/openbb_tradier/models/equity_quote.py index 667879bcdf9..d3a2abef9fa 100644 --- a/openbb_platform/providers/tradier/openbb_tradier/models/equity_quote.py +++ b/openbb_platform/providers/tradier/openbb_tradier/models/equity_quote.py @@ -1,4 +1,4 @@ -"""Tradier Equity Quote Model""" +"""Tradier Equity Quote Model.""" # pylint: disable = unused-argument @@ -15,7 +15,7 @@ from openbb_core.provider.standard_models.equity_quote import ( EquityQuoteQueryParams, ) from openbb_core.provider.utils.errors import EmptyDataError -from openbb_core.provider.utils.helpers import amake_request +from openbb_core.provider.utils.helpers import amake_request, safe_fromtimestamp from openbb_tradier.utils.constants import OPTIONS_EXCHANGES, STOCK_EXCHANGES from pydantic import Field, field_validator, model_validator from pytz import timezone @@ -157,7 +157,8 @@ class TradierEquityQuoteData(EquityQuoteData): def validate_dates(cls, v): """Validate the dates.""" if v != 0 and v is not None and isinstance(v, int): - v = datetime.fromtimestamp(int(v) / 1000) + v = int(v) / 1000 # milliseconds to seconds + v = safe_fromtimestamp(v) v = v.replace(microsecond=0) v = v.astimezone(timezone("America/New_York")) return v @@ -202,7 +203,6 @@ class TradierEquityQuoteFetcher( **kwargs: Any, ) -> List[Dict]: """Return the raw data from the Tradier endpoint.""" - api_key = credentials.get("tradier_api_key") if credentials else "" sandbox = True @@ -245,7 +245,6 @@ class TradierEquityQuoteFetcher( **kwargs: Any, ) -> List[TradierEquityQuoteData]: """Transform and validate the data.""" - results: List[TradierEquityQuoteData] = [] for d in data: diff --git a/openbb_platform/providers/tradier/openbb_tradier/models/options_chains.py b/openbb_platform/providers/tradier/openbb_tradier/models/options_chains.py index ba4f728dda8..16cdbab51f0 100644 --- a/openbb_platform/providers/tradier/openbb_tradier/models/options_chains.py +++ b/openbb_platform/providers/tradier/openbb_tradier/models/options_chains.py @@ -1,4 +1,4 @@ -"""Tradier Options Chains Model""" +"""Tradier Options Chains Model.""" # pylint: disable = unused-argument @@ -13,15 +13,14 @@ from openbb_core.provider.standard_models.options_chains import ( OptionsChainsQueryParams, ) from openbb_core.provider.utils.errors import EmptyDataError -from openbb_core.provider.utils.helpers import amake_request +from openbb_core.provider.utils.helpers import amake_request, safe_fromtimestamp from openbb_tradier.utils.constants import OPTIONS_EXCHANGES, STOCK_EXCHANGES from pydantic import Field, field_validator, model_validator from pytz import timezone class TradierOptionsChainsQueryParams(OptionsChainsQueryParams): - """ - Tradier Options Chains Query. + """Tradier Options Chains Query. Source: https://documentation.tradier.com/brokerage-api/markets/get-options-chains @@ -31,7 +30,7 @@ class TradierOptionsChainsQueryParams(OptionsChainsQueryParams): class TradierOptionsChainsData(OptionsChainsData): - """Tradier Options Chains Data""" + """Tradier Options Chains Data.""" __alias_dict__ = { "expiration": "expiration_date", @@ -127,7 +126,8 @@ class TradierOptionsChainsData(OptionsChainsData): def validate_dates(cls, v): """Validate the dates.""" if v != 0 and v is not None and isinstance(v, int): - v = datetime.fromtimestamp(int(v) / 1000) + v = int(v) / 1000 # milliseconds to seconds + v = safe_fromtimestamp(v) v = v.replace(microsecond=0) v = v.astimezone(timezone("America/New_York")) return v @@ -177,6 +177,7 @@ class TradierOptionsChainsFetcher( @staticmethod def transform_query(params: Dict[str, Any]) -> TradierOptionsChainsQueryParams: + """Transform the query parameters.""" return TradierOptionsChainsQueryParams(**params) @staticmethod @@ -185,8 +186,7 @@ class TradierOptionsChainsFetcher( credentials: Optional[Dict[str, str]], **kwargs: Any, ) -> List[Dict]: - """Return the raw data from the Tradier endpoint""" - + """Return the raw data from the Tradier endpoint.""" api_key = credentials.get("tradier_api_key") if credentials else "" sandbox = True @@ -216,7 +216,6 @@ class TradierOptionsChainsFetcher( # Get the expiration dates for the symbol so we can gather the chains data. async def get_expirations(symbol): """Get the expiration dates for the given symbol.""" - url = ( f"{BASE_URL}expirations?symbol={symbol}&includeAllRoots=true" "&strikes=false&contractSize=false&expirationType=false" diff --git a/openbb_platform/providers/tradier/openbb_tradier/utils/__init__.py b/openbb_platform/providers/tradier/openbb_tradier/utils/__init__.py index e69de29bb2d..5b37a7ad204 100644 --- a/openbb_platform/providers/tradier/openbb_tradier/utils/__init__.py +++ b/openbb_platform/providers/tradier/openbb_tradier/utils/__init__.py @@ -0,0 +1 @@ +"""Tradier provider utils.""" diff --git a/openbb_platform/providers/tradier/poetry.lock b/openbb_platform/providers/tradier/poetry.lock index 1260407c2cb..445e03c1e28 100644 --- a/openbb_platform/providers/tradier/poetry.lock +++ b/openbb_platform/providers/tradier/poetry.lock @@ -715,13 +715,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1409,4 +1409,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e5a1c1f22e0b8e42343cef04f6f23281c7d6441df13f2be91584098c856ab1f0" +content-hash = "ca421fe0dbae56150a2fc3a7978ad65f3dd4e70025bc4da4a7f1338b8eca522c" diff --git a/openbb_platform/providers/tradier/pyproject.toml b/openbb_platform/providers/tradier/pyproject.toml index 9a139c5b99d..d5c21e972a9 100644 --- a/openbb_platform/providers/tradier/pyproject.toml +++ b/openbb_platform/providers/tradier/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-tradier" -version = "1.0.1" +version = "1.0.2" description = "Tradier Provider Extension for the OpenBB Platform" authors = ["OpenBB "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_tradier" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/providers/tradier/tests/__init__.py b/openbb_platform/providers/tradier/tests/__init__.py index e69de29bb2d..f070d287ac6 100644 --- a/openbb_platform/providers/tradier/tests/__init__.py +++ b/openbb_platform/providers/tradier/tests/__init__.py @@ -0,0 +1 @@ +"""Tradier provider tests.""" diff --git a/openbb_platform/providers/tradier/tests/test_tradier_fetchers.py b/openbb_platform/providers/tradier/tests/test_tradier_fetchers.py index 56a954db0be..7eba9625148 100644 --- a/openbb_platform/providers/tradier/tests/test_tradier_fetchers.py +++ b/openbb_platform/providers/tradier/tests/test_tradier_fetchers.py @@ -16,6 +16,7 @@ test_credentials = UserService().default_user_settings.credentials.model_dump( @pytest.fixture(scope="module") def vcr_config(): + """VCR configuration.""" return { "filter_headers": [ ("User-Agent", None), @@ -27,6 +28,7 @@ def vcr_config(): @pytest.mark.record_http def test_tradier_equity_historical_fetcher(credentials=test_credentials): + """Test the Tradier Equity Historical fetcher.""" params = { "start_date": datetime(2024, 2, 1).date(), "end_date": datetime(2024, 2, 29).date(), @@ -41,6 +43,7 @@ def test_tradier_equity_historical_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tradier_equity_search_fetcher(credentials=test_credentials): + """Test the Tradier Equity Search fetcher.""" params = { "query": "brookfield", "is_symbol": False, @@ -53,6 +56,7 @@ def test_tradier_equity_search_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tradier_equity_quote_fetcher(credentials=test_credentials): + """Test the Tradier Equity Quote fetcher.""" params = {"symbol": "SPY,SPY251219P00450000"} fetcher = TradierEquityQuoteFetcher() @@ -62,6 +66,7 @@ def test_tradier_equity_quote_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_tradier_derivatives_options_chains_fetcher(credentials=test_credentials): + """Test the Tradier Derivatives Options Chains fetcher.""" params = {"symbol": "PLTR"} fetcher = TradierOptionsChainsFetcher() diff --git a/openbb_platform/providers/tradingeconomics/__init__.py b/openbb_platform/providers/tradingeconomics/__init__.py index e69de29bb2d..7a4238e74bb 100644 --- a/openbb_platform/providers/tradingeconomics/__init__.py +++ b/openbb_platform/providers/tradingeconomics/__init__.py @@ -0,0 +1 @@ +"""OpenBB Trading Economics Provider.""" diff --git a/openbb_platform/providers/tradingeconomics/openbb_tradingeconomics/models/economic_calendar.py b/openbb_platform/providers/tradingeconomics/openbb_tradingeconomics/models/economic_calendar.py index c0a14d17818..97e1056633b 100644 --- a/openbb_platform/providers/tradingeconomics/openbb_tradingeconomics/models/economic_calendar.py +++ b/openbb_platform/providers/tradingeconomics/openbb_tradingeconomics/models/economic_calendar.py @@ -62,6 +62,7 @@ class TEEconomicCalendarQueryParams(EconomicCalendarQueryParams): @field_validator("importance") @classmethod def importance_to_number(cls, v): + """Convert importance to number.""" string_to_value = {"Low": 1, "Medium": 2, "High": 3} return string_to_value.get(v, None) @@ -93,6 +94,7 @@ class TEEconomicCalendarData(EconomicCalendarData): @field_validator("date", mode="before") @classmethod def validate_date(cls, v: str) -> datetime: + """Validate the date.""" return to_datetime(v, utc=True) diff --git a/openbb_platform/providers/tradingeconomics/openbb_tradingeconomics/utils/countries.py b/openbb_platform/providers/tradingeconomics/openbb_tradingeconomics/utils/countries.py index c604b77e9c4..ab31a2be579 100644 --- a/openbb_platform/providers/tradingeconomics/openbb_tradingeconomics/utils/countries.py +++ b/openbb_platform/providers/tradingeconomics/openbb_tradingeconomics/utils/countries.py @@ -1,3 +1,5 @@ +"""Countries list for Trading Economics API.""" + country_dict = { "G20": [ "United States", diff --git a/openbb_platform/providers/tradingeconomics/openbb_tradingeconomics/utils/url_generator.py b/openbb_platform/providers/tradingeconomics/openbb_tradingeconomics/utils/url_generator.py index 0bcb2a46005..f9063ecd259 100644 --- a/openbb_platform/providers/tradingeconomics/openbb_tradingeconomics/utils/url_generator.py +++ b/openbb_platform/providers/tradingeconomics/openbb_tradingeconomics/utils/url_generator.py @@ -6,6 +6,7 @@ from urllib.parse import quote, urlencode def check_args(query_args: Dict, to_include: List[str]): + """Check if all fields in to_include are present in query_args.""" available_args = ["country", "start_date", "end_date", "importance", "group"] # Check if all fields in to_include are present in query_args @@ -16,9 +17,10 @@ def check_args(query_args: Dict, to_include: List[str]): def generate_url(in_query): - """ - Generate the url for trading economimcs. There is not a single api endpoint to hit so these are - generated based on the combinations. There are also some combinations that return no data so that will return "" + """Generate the url for trading economimcs. + + There is not a single api endpoint to hit so these are generated based on the combinations. + There are also some combinations that return no data so that will return an empty string. """ # Converting the input query to a dict of params that are not None query = {k: v for k, v in in_query.dict().items() if v is not None} diff --git a/openbb_platform/providers/tradingeconomics/poetry.lock b/openbb_platform/providers/tradingeconomics/poetry.lock index 68bb6b9b230..5d97ba2712d 100644 --- a/openbb_platform/providers/tradingeconomics/poetry.lock +++ b/openbb_platform/providers/tradingeconomics/poetry.lock @@ -671,13 +671,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1390,4 +1390,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e5a1c1f22e0b8e42343cef04f6f23281c7d6441df13f2be91584098c856ab1f0" +content-hash = "ca421fe0dbae56150a2fc3a7978ad65f3dd4e70025bc4da4a7f1338b8eca522c" diff --git a/openbb_platform/providers/tradingeconomics/pyproject.toml b/openbb_platform/providers/tradingeconomics/pyproject.toml index d3f0da54ff0..0df223d8877 100644 --- a/openbb_platform/providers/tradingeconomics/pyproject.toml +++ b/openbb_platform/providers/tradingeconomics/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-tradingeconomics" -version = "1.1.4" +version = "1.1.5" description = "Trading Economics extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_tradingeconomics" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/providers/tradingeconomics/tests/test_tradingeconomics_fetchers.py b/openbb_platform/providers/tradingeconomics/tests/test_tradingeconomics_fetchers.py index 5feba458012..35d5088fd05 100644 --- a/openbb_platform/providers/tradingeconomics/tests/test_tradingeconomics_fetchers.py +++ b/openbb_platform/providers/tradingeconomics/tests/test_tradingeconomics_fetchers.py @@ -1,3 +1,5 @@ +"""Test the Trading Economics fetchers.""" + from datetime import date import pytest @@ -11,6 +13,7 @@ test_credentials = UserService().default_user_settings.credentials.model_dump( @pytest.fixture(scope="module") def vcr_config(): + """VCR configuration.""" return { "filter_headers": [("User-Agent", None)], "filter_query_parameters": [ @@ -21,6 +24,7 @@ def vcr_config(): @pytest.mark.record_http def test_tradingeconomics_economic_calendar_fetcher(credentials=test_credentials): + """Test the Trading Economics economic calendar fetcher.""" params = { "start_date": date(2023, 1, 1), "end_date": date(2023, 6, 6), diff --git a/openbb_platform/providers/tradingeconomics/tests/test_url_generator.py b/openbb_platform/providers/tradingeconomics/tests/test_url_generator.py index 566282ba09a..70b49140c58 100644 --- a/openbb_platform/providers/tradingeconomics/tests/test_url_generator.py +++ b/openbb_platform/providers/tradingeconomics/tests/test_url_generator.py @@ -9,30 +9,35 @@ from providers.tradingeconomics.openbb_tradingeconomics.utils.url_generator impo def test_check_args_valid(): + """Test check_args with valid args.""" query_args = {"country": "US", "start_date": "2023-01-01", "end_date": "2023-01-31"} to_include = ["country", "start_date", "end_date"] assert check_args(query_args, to_include) def test_check_args_invalid(): + """Test check_args with missing args.""" query_args = {"country": "US"} to_include = ["start_date", "end_date"] assert not check_args(query_args, to_include) def create_query_mock(query_dict): + """Create a query mock.""" query_mock = Mock() query_mock.dict.return_value = query_dict return query_mock def test_generate_url_country_only(): + """Test generate_url with country.""" query_mock = create_query_mock({"country": "US"}) expected_url = "https://api.tradingeconomics.com/calendar/country/US?c=" assert generate_url(query_mock) == expected_url def test_generate_url_country_and_dates(): + """Test generate_url with country and dates.""" query_mock = create_query_mock( {"country": "US", "start_date": "2023-01-01", "end_date": "2023-01-31"} ) @@ -43,24 +48,28 @@ def test_generate_url_country_and_dates(): def test_generate_url_importance_only(): + """Test generate_url with importance.""" query_mock = create_query_mock({"importance": "High"}) expected_url = "https://api.tradingeconomics.com/calendar?importance=High&c=" assert generate_url(query_mock) == expected_url def test_generate_url_no_data(): + """Test generate_url with no data.""" query_mock = create_query_mock({}) expected_url = "https://api.tradingeconomics.com/calendar?c=" assert generate_url(query_mock) == expected_url def test_generate_url_group_only(): + """Test generate_url with group.""" query_mock = create_query_mock({"group": "G20"}) expected_url = "https://api.tradingeconomics.com/calendar/group/G20?c=" assert generate_url(query_mock) == expected_url def test_generate_url_country_group_and_dates(): + """Test generate_url with country, group, and dates.""" query_mock = create_query_mock( { "country": "US", diff --git a/openbb_platform/providers/wsj/__init__.py b/openbb_platform/providers/wsj/__init__.py index e69de29bb2d..41291b5e014 100644 --- a/openbb_platform/providers/wsj/__init__.py +++ b/openbb_platform/providers/wsj/__init__.py @@ -0,0 +1 @@ +"""WSJ provider.""" diff --git a/openbb_platform/providers/wsj/poetry.lock b/openbb_platform/providers/wsj/poetry.lock index 12b9fd975a0..718edef43ca 100644 --- a/openbb_platform/providers/wsj/poetry.lock +++ b/openbb_platform/providers/wsj/poetry.lock @@ -712,13 +712,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1431,4 +1431,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "e5a1c1f22e0b8e42343cef04f6f23281c7d6441df13f2be91584098c856ab1f0" +content-hash = "ca421fe0dbae56150a2fc3a7978ad65f3dd4e70025bc4da4a7f1338b8eca522c" diff --git a/openbb_platform/providers/wsj/pyproject.toml b/openbb_platform/providers/wsj/pyproject.toml index c58dc746e36..9009d2df2e0 100644 --- a/openbb_platform/providers/wsj/pyproject.toml +++ b/openbb_platform/providers/wsj/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-wsj" -version = "1.1.4" +version = "1.1.5" description = "wsj extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,7 +8,7 @@ packages = [{ include = "openbb_wsj" }] [tool.poetry.dependencies] python = "^3.8" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/providers/wsj/tests/test_wsj_fetchers.py b/openbb_platform/providers/wsj/tests/test_wsj_fetchers.py index 1390cdd57d6..30f1eb80eae 100644 --- a/openbb_platform/providers/wsj/tests/test_wsj_fetchers.py +++ b/openbb_platform/providers/wsj/tests/test_wsj_fetchers.py @@ -1,3 +1,5 @@ +"""Tests for the WSJ fetchers.""" + import pytest from openbb_core.app.service.user_service import UserService from openbb_wsj.models.active import WSJActiveFetcher @@ -11,6 +13,7 @@ test_credentials = UserService().default_user_settings.credentials.model_dump( @pytest.fixture(scope="module") def vcr_config(): + """VCR configuration.""" return { "filter_headers": [("User-Agent", None)], "filter_query_parameters": [ @@ -21,6 +24,7 @@ def vcr_config(): @pytest.mark.record_http def test_wsj_gainers_fetcher(credentials=test_credentials): + """Test the WSJ Gainers fetcher.""" params = {} fetcher = WSJGainersFetcher() @@ -30,6 +34,7 @@ def test_wsj_gainers_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_wsj_losers_fetcher(credentials=test_credentials): + """Test the WSJ Losers fetcher.""" params = {} fetcher = WSJLosersFetcher() @@ -39,6 +44,7 @@ def test_wsj_losers_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_wsj_active_fetcher(credentials=test_credentials): + """Test the WSJ Active fetcher.""" params = {} fetcher = WSJActiveFetcher() diff --git a/openbb_platform/providers/yfinance/__init__.py b/openbb_platform/providers/yfinance/__init__.py index e69de29bb2d..2b56bab4609 100644 --- a/openbb_platform/providers/yfinance/__init__.py +++ b/openbb_platform/providers/yfinance/__init__.py @@ -0,0 +1 @@ +"""YFinance provider.""" diff --git a/openbb_platform/providers/yfinance/openbb_yfinance/models/available_indices.py b/openbb_platform/providers/yfinance/openbb_yfinance/models/available_indices.py index cb5eda90a15..5326bd66292 100644 --- a/openbb_platform/providers/yfinance/openbb_yfinance/models/available_indices.py +++ b/openbb_platform/providers/yfinance/openbb_yfinance/models/available_indices.py @@ -1,5 +1,7 @@ """Yahoo Finance Available Indices Model.""" +# pylint: disable=unused-argument + from typing import Any, Dict, List, Optional import pandas as pd @@ -43,10 +45,11 @@ class YFinanceAvailableIndicesFetcher( @staticmethod def extract_data( - query: YFinanceAvailableIndicesQueryParams, + query: YFinanceAvailableIndicesQueryParams, # pylint disable=unused-argument credentials: Optional[Dict[str, str]], **kwargs: Any, ) -> List[Dict]: + """Extract the data.""" indices = pd.DataFrame(INDICES).transpose().reset_index() indices.columns = ["code", "name", "ticker"] diff --git a/openbb_platform/providers/yfinance/openbb_yfinance/models/equity_profile.py b/openbb_platform/providers/yfinance/openbb_yfinance/models/equity_profile.py index cc98e5838c3..7150bc7be50 100644 --- a/openbb_platform/providers/yfinance/openbb_yfinance/models/equity_profile.py +++ b/openbb_platform/providers/yfinance/openbb_yfinance/models/equity_profile.py @@ -3,7 +3,10 @@ # pylint: disable=unused-argument import asyncio import warnings -from datetime import datetime +from datetime import ( + date as dateType, + timezone, +) from typing import Any, Dict, List, Optional from openbb_core.provider.abstract.fetcher import Fetcher @@ -11,6 +14,7 @@ from openbb_core.provider.standard_models.equity_info import ( EquityInfoData, EquityInfoQueryParams, ) +from openbb_core.provider.utils.helpers import safe_fromtimestamp from pydantic import Field, field_validator from yfinance import Ticker @@ -97,9 +101,9 @@ class YFinanceEquityProfileData(EquityInfoData): @field_validator("first_stock_price_date", mode="before", check_fields=False) @classmethod - def validate_first_trade_date(cls, v): + def validate_first_trade_date(cls, v: float) -> Optional[dateType]: """Validate first stock price date.""" - return datetime.utcfromtimestamp(v).date() if v else None + return safe_fromtimestamp(v, tz=timezone.utc).date() if v else None class YFinanceEquityProfileFetcher( diff --git a/openbb_platform/providers/yfinance/openbb_yfinance/models/etf_info.py b/openbb_platform/providers/yfinance/openbb_yfinance/models/etf_info.py index c2ce1a28355..915fb44bf4f 100644 --- a/openbb_platform/providers/yfinance/openbb_yfinance/models/etf_info.py +++ b/openbb_platform/providers/yfinance/openbb_yfinance/models/etf_info.py @@ -11,6 +11,7 @@ from openbb_core.provider.standard_models.etf_info import ( EtfInfoData, EtfInfoQueryParams, ) +from openbb_core.provider.utils.helpers import safe_fromtimestamp from pydantic import Field, field_validator from yfinance import Ticker @@ -275,7 +276,7 @@ class YFinanceEtfInfoFetcher( "fundInceptionDate" not in result and _first_trade is not None ): - result["fundInceptionDate"] = datetime.fromtimestamp( + result["fundInceptionDate"] = safe_fromtimestamp( _first_trade ) except Exception as e: diff --git a/openbb_platform/providers/yfinance/openbb_yfinance/models/price_target_consensus.py b/openbb_platform/providers/yfinance/openbb_yfinance/models/price_target_consensus.py index a412f210dae..15d628580fd 100644 --- a/openbb_platform/providers/yfinance/openbb_yfinance/models/price_target_consensus.py +++ b/openbb_platform/providers/yfinance/openbb_yfinance/models/price_target_consensus.py @@ -10,7 +10,7 @@ from openbb_core.provider.standard_models.price_target_consensus import ( PriceTargetConsensusData, PriceTargetConsensusQueryParams, ) -from pydantic import Field +from pydantic import Field, field_validator from yfinance import Ticker _warn = warnings.warn @@ -21,6 +21,14 @@ class YFinancePriceTargetConsensusQueryParams(PriceTargetConsensusQueryParams): __json_schema_extra__ = {"symbol": ["multiple_items_allowed"]} + @field_validator("symbol", mode="before", check_fields=False) + @classmethod + def check_symbol(cls, value): + """Check the symbol.""" + if not value: + raise RuntimeError("Error: Symbol is a required field for yFinance.") + return value + class YFinancePriceTargetConsensusData(PriceTargetConsensusData): """YFinance Price Target Consensus Data.""" @@ -78,7 +86,7 @@ class YFinancePriceTargetConsensusFetcher( **kwargs: Any, ) -> List[Dict]: """Extract the raw data from YFinance.""" - symbols = query.symbol.split(",") + symbols = query.symbol.split(",") # type: ignore results = [] fields = [ "symbol", diff --git a/openbb_platform/providers/yfinance/openbb_yfinance/utils/helpers.py b/openbb_platform/providers/yfinance/openbb_yfinance/utils/helpers.py index dbc2ebe3c28..0965aefbd54 100644 --- a/openbb_platform/providers/yfinance/openbb_yfinance/utils/helpers.py +++ b/openbb_platform/providers/yfinance/openbb_yfinance/utils/helpers.py @@ -100,19 +100,22 @@ def yf_download( """Get yFinance OHLC data for any ticker and interval available.""" symbol = symbol.upper() _start_date = start_date - + intraday = False if interval in ["60m", "1h"]: period = "2y" if period in ["5y", "10y", "max"] else period _start_date = None + intraday = True if interval in ["2m", "5m", "15m", "30m", "90m"]: _start_date = (datetime.now().date() - relativedelta(days=58)).strftime( "%Y-%m-%d" ) + intraday = True if interval == "1m": period = "5d" _start_date = None + intraday = True if adjusted is False: kwargs = dict(auto_adjust=False, back_adjust=False) @@ -158,7 +161,6 @@ def yf_download( data = data.rename(columns={"Date": "date", "Datetime": "date"}) data["date"] = data["date"].apply(pd.to_datetime) data = data[data["Open"] > 0] - if start_date is not None: data = data[data["date"] >= pd.to_datetime(start_date)] if ( @@ -167,31 +169,19 @@ def yf_download( and pd.to_datetime(end_date) > pd.to_datetime(start_date) ): data = data[ - data["date"] <= (pd.to_datetime(end_date) + relativedelta(days=1)) + data["date"] + <= ( + pd.to_datetime(end_date) + + relativedelta(minutes=719 if intraday is True else 0) + ) ] - - if period not in [ - "max", - "1d", - "5d", - "1wk", - "1mo", - "3mo", - "6mo", - "1y", - "2y", - "5y", - "10y", - ]: + if intraday is True: data["date"] = data["date"].dt.strftime("%Y-%m-%d %H:%M:%S") - if interval not in ["1m", "2m", "5m", "15m", "30m", "90m", "60m", "1h"]: + else: data["date"] = data["date"].dt.strftime("%Y-%m-%d") - if adjusted is False: data = data.drop(columns=["Adj Close"]) - data.columns = data.columns.str.lower().str.replace(" ", "_").to_list() - return data diff --git a/openbb_platform/providers/yfinance/poetry.lock b/openbb_platform/providers/yfinance/poetry.lock index e84a52a557e..bb3e8113a19 100644 --- a/openbb_platform/providers/yfinance/poetry.lock +++ b/openbb_platform/providers/yfinance/poetry.lock @@ -815,13 +815,13 @@ files = [ [[package]] name = "openbb-core" -version = "1.1.5" +version = "1.1.6" description = "OpenBB package with core functionality" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "openbb_core-1.1.5-py3-none-any.whl", hash = "sha256:abac970b9503a40ed12c3a153b734c419e46bdc7ecd9e9d51c384c0b6bf140bd"}, - {file = "openbb_core-1.1.5.tar.gz", hash = "sha256:c280bfbf579cf1accf32bbd6a4de581c39b5e88793a3d2c362c85c87a3fe31ad"}, + {file = "openbb_core-1.1.6-py3-none-any.whl", hash = "sha256:4161d6e7654cab2185fcc39e5172385c8226e3cf6bfd5d4b1ff1076f70a6374c"}, + {file = "openbb_core-1.1.6.tar.gz", hash = "sha256:bf56a8a0dc26d72e679a2c68b1f57bf6703ed130b52348a77a2f6cfa32c9fcae"}, ] [package.dependencies] @@ -1568,4 +1568,4 @@ testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "p [metadata] lock-version = "2.0" python-versions = "^3.8" -content-hash = "3e865f0f5dc1b20c0e90eda299e1d7b6c6afa5709c662e8114a68409deb4f17e" +content-hash = "73606ddf4e01de6d5b9108cb82022a6e5278b7fbcab693e7eead4e020f1db445" diff --git a/openbb_platform/providers/yfinance/pyproject.toml b/openbb_platform/providers/yfinance/pyproject.toml index d680b13ef53..fbf499bc5ed 100644 --- a/openbb_platform/providers/yfinance/pyproject.toml +++ b/openbb_platform/providers/yfinance/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb-yfinance" -version = "1.1.4" +version = "1.1.5" description = "yfinance extension for OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -9,7 +9,7 @@ packages = [{ include = "openbb_yfinance" }] [tool.poetry.dependencies] python = "^3.8" yfinance = "^0.2.27" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" [build-system] requires = ["poetry-core"] diff --git a/openbb_platform/providers/yfinance/tests/__init__.py b/openbb_platform/providers/yfinance/tests/__init__.py index e69de29bb2d..e59458f440e 100644 --- a/openbb_platform/providers/yfinance/tests/__init__.py +++ b/openbb_platform/providers/yfinance/tests/__init__.py @@ -0,0 +1 @@ +"""YFinance tests.""" diff --git a/openbb_platform/providers/yfinance/tests/test_yfinance_fetchers.py b/openbb_platform/providers/yfinance/tests/test_yfinance_fetchers.py index 7fe29e3c429..1dd0c1671a6 100644 --- a/openbb_platform/providers/yfinance/tests/test_yfinance_fetchers.py +++ b/openbb_platform/providers/yfinance/tests/test_yfinance_fetchers.py @@ -1,3 +1,5 @@ +"""Tests for YFinance fetchers.""" + from datetime import date import pytest @@ -48,6 +50,7 @@ test_credentials = UserService().default_user_settings.credentials.model_dump( @pytest.fixture(scope="module") def vcr_config(): + """VCR configuration.""" return { "filter_headers": [ ("User-Agent", None), @@ -64,6 +67,7 @@ def vcr_config(): @pytest.mark.record_http def test_y_finance_crypto_historical_fetcher(credentials=test_credentials): + """Test YFinanceCryptoHistoricalFetcher.""" params = { "symbol": "BTCUSD", "start_date": date(2023, 1, 1), @@ -78,6 +82,7 @@ def test_y_finance_crypto_historical_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_y_finance_currency_historical_fetcher(credentials=test_credentials): + """Test YFinanceCurrencyHistoricalFetcher.""" params = { "symbol": "EURUSD", "start_date": date(2023, 1, 1), @@ -91,6 +96,7 @@ def test_y_finance_currency_historical_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_y_finance_index_historical_fetcher(credentials=test_credentials): + """Test YFinanceIndexHistoricalFetcher.""" params = { "symbol": "^GSPC", "start_date": date(2023, 1, 1), @@ -104,6 +110,7 @@ def test_y_finance_index_historical_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_y_finance_equity_historical_fetcher(credentials=test_credentials): + """Test YFinanceEquityHistoricalFetcher.""" params = { "symbol": "AAPL", "start_date": date(2023, 1, 1), @@ -118,6 +125,7 @@ def test_y_finance_equity_historical_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_y_finance_historical_dividends_fetcher(credentials=test_credentials): + """Test YFinanceHistoricalDividendsFetcher.""" params = {"symbol": "IBM"} fetcher = YFinanceHistoricalDividendsFetcher() @@ -127,6 +135,7 @@ def test_y_finance_historical_dividends_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_y_finance_market_indices_fetcher(credentials=test_credentials): + """Test YFinanceMarketIndicesFetcher.""" params = { "symbol": "^GSPC", "start_date": date(2023, 1, 1), @@ -140,6 +149,7 @@ def test_y_finance_market_indices_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_y_finance_futures_historical_fetcher(credentials=test_credentials): + """Test YFinanceFuturesHistoricalFetcher.""" params = { "symbol": "ES=F", "start_date": date(2023, 1, 1), @@ -154,6 +164,7 @@ def test_y_finance_futures_historical_fetcher(credentials=test_credentials): @pytest.mark.skip("Unreliable amount of data while recording test.") @pytest.mark.record_http def test_y_finance_futures_curve_fetcher(credentials=test_credentials): + """Test YFinanceFuturesCurveFetcher.""" params = {"symbol": "ES"} fetcher = YFinanceFuturesCurveFetcher() @@ -163,6 +174,7 @@ def test_y_finance_futures_curve_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_y_finance_company_news_fetcher(credentials=test_credentials): + """Test YFinanceCompanyNewsFetcher.""" params = {"symbol": "AAPL,MSFT"} fetcher = YFinanceCompanyNewsFetcher() @@ -172,6 +184,7 @@ def test_y_finance_company_news_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_y_finance_balance_sheet_fetcher(credentials=test_credentials): + """Test YFinanceBalanceSheetFetcher.""" params = {"symbol": "AAPL"} fetcher = YFinanceBalanceSheetFetcher() @@ -181,6 +194,7 @@ def test_y_finance_balance_sheet_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_y_finance_cash_flow_statement_fetcher(credentials=test_credentials): + """Test YFinanceCashFlowStatementFetcher.""" params = {"symbol": "AAPL"} fetcher = YFinanceCashFlowStatementFetcher() @@ -190,6 +204,7 @@ def test_y_finance_cash_flow_statement_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_y_finance_income_statement_fetcher(credentials=test_credentials): + """Test YFinanceIncomeStatementFetcher.""" params = {"symbol": "AAPL"} fetcher = YFinanceIncomeStatementFetcher() @@ -198,6 +213,7 @@ def test_y_finance_income_statement_fetcher(credentials=test_credentials): def test_y_finance_available_fetcher(credentials=test_credentials): + """Test YFinanceAvailableIndicesFetcher.""" params = {} fetcher = YFinanceAvailableIndicesFetcher() @@ -207,6 +223,7 @@ def test_y_finance_available_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_y_finance_etf_historical_fetcher(credentials=test_credentials): + """Test YFinanceEtfHistoricalFetcher.""" params = { "symbol": "SPY", "start_date": date(2023, 1, 1), @@ -220,6 +237,7 @@ def test_y_finance_etf_historical_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_y_finance_active_fetcher(credentials=test_credentials): + """Test YFActiveFetcher.""" params = {} fetcher = YFActiveFetcher() @@ -229,6 +247,7 @@ def test_y_finance_active_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_y_finance_gainers_fetcher(credentials=test_credentials): + """Test YFGainersFetcher.""" params = {} fetcher = YFGainersFetcher() @@ -238,6 +257,7 @@ def test_y_finance_gainers_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_y_finance_losers_fetcher(credentials=test_credentials): + """Test YFLosersFetcher.""" params = {} fetcher = YFLosersFetcher() @@ -247,6 +267,7 @@ def test_y_finance_losers_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_y_finance_undervalued_large_caps_fetcher(credentials=test_credentials): + """Test YFUndervaluedLargeCapsFetcher.""" params = {} fetcher = YFUndervaluedLargeCapsFetcher() @@ -256,6 +277,7 @@ def test_y_finance_undervalued_large_caps_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_y_finance_undervalued_growth_equities_fetcher(credentials=test_credentials): + """Test YFUndervaluedGrowthEquitiesFetcher.""" params = {} fetcher = YFUndervaluedGrowthEquitiesFetcher() @@ -265,6 +287,7 @@ def test_y_finance_undervalued_growth_equities_fetcher(credentials=test_credenti @pytest.mark.record_http def test_y_finance_aggressive_small_caps_fetcher(credentials=test_credentials): + """Test YFAggressiveSmallCapsFetcher.""" params = {} fetcher = YFAggressiveSmallCapsFetcher() @@ -274,6 +297,7 @@ def test_y_finance_aggressive_small_caps_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_y_finance_growth_tech_equities_fetcher(credentials=test_credentials): + """Test YFGrowthTechEquitiesFetcher.""" params = {} fetcher = YFGrowthTechEquitiesFetcher() @@ -283,6 +307,7 @@ def test_y_finance_growth_tech_equities_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_y_finance_equity_profile_fetcher(credentials=test_credentials): + """Test YFinanceEquityProfileFetcher.""" params = {"symbol": "AAPL"} fetcher = YFinanceEquityProfileFetcher() @@ -292,6 +317,7 @@ def test_y_finance_equity_profile_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_y_finance_equity_quote_fetcher(credentials=test_credentials): + """Test YFinanceEquityQuoteFetcher.""" params = {"symbol": "AAPL"} fetcher = YFinanceEquityQuoteFetcher() @@ -301,6 +327,7 @@ def test_y_finance_equity_quote_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_y_finance_price_target_consensus_fetcher(credentials=test_credentials): + """Test YFinancePriceTargetConsensusFetcher.""" params = {"symbol": "AAPL"} fetcher = YFinancePriceTargetConsensusFetcher() @@ -310,6 +337,7 @@ def test_y_finance_price_target_consensus_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_y_finance_share_statistics_fetcher(credentials=test_credentials): + """Test YFinanceShareStatisticsFetcher.""" params = {"symbol": "AAPL"} fetcher = YFinanceShareStatisticsFetcher() @@ -319,6 +347,7 @@ def test_y_finance_share_statistics_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_y_finance_key_executives_fetcher(credentials=test_credentials): + """Test YFinanceKeyExecutivesFetcher.""" params = {"symbol": "AAPL"} fetcher = YFinanceKeyExecutivesFetcher() @@ -328,6 +357,7 @@ def test_y_finance_key_executives_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_y_finance_key_metrics_fetcher(credentials=test_credentials): + """Test YFinanceKeyMetricsFetcher.""" params = {"symbol": "AAPL"} fetcher = YFinanceKeyMetricsFetcher() @@ -337,6 +367,7 @@ def test_y_finance_key_metrics_fetcher(credentials=test_credentials): @pytest.mark.record_http def test_y_finance_etf_info_fetcher(credentials=test_credentials): + """Test YFinanceEtfInfoFetcher.""" params = {"symbol": "QQQ"} fetcher = YFinanceEtfInfoFetcher() diff --git a/openbb_platform/providers/yfinance/tests/test_yfinance_helpers.py b/openbb_platform/providers/yfinance/tests/test_yfinance_helpers.py index 9c8b13bca67..7c3817cbc36 100644 --- a/openbb_platform/providers/yfinance/tests/test_yfinance_helpers.py +++ b/openbb_platform/providers/yfinance/tests/test_yfinance_helpers.py @@ -20,12 +20,14 @@ def mock_futures_csv(monkeypatch): def test_get_futures_data(mock_futures_csv): + """Test get_futures_data.""" df = get_futures_data() assert not df.empty assert df.equals(MOCK_FUTURES_DATA) def test_df_transform_numbers(): + """Test df_transform_numbers.""" data = pd.DataFrame( {"Value": ["1M", "2.5B", "3T"], "% Change": ["1%", "-2%", "3.5%"]} ) diff --git a/openbb_platform/pyproject.toml b/openbb_platform/pyproject.toml index c819c502c08..3eb6a6b8b6a 100644 --- a/openbb_platform/pyproject.toml +++ b/openbb_platform/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "openbb" -version = "4.1.6" +version = "4.1.7" description = "OpenBB" authors = ["OpenBB Team "] readme = "README.md" @@ -8,51 +8,51 @@ packages = [{ include = "openbb" }] [tool.poetry.dependencies] python = ">=3.8,<3.12" -openbb-core = "^1.1.5" +openbb-core = "^1.1.6" -openbb-benzinga = "^1.1.4" -openbb-federal-reserve = "^1.1.4" -openbb-fmp = "^1.1.4" -openbb-fred = "^1.1.4" -openbb-intrinio = "^1.1.4" -openbb-oecd = "^1.1.4" -openbb-polygon = "^1.1.4" -openbb-sec = "^1.1.4" -openbb-tiingo = "^1.1.4" -openbb-tradingeconomics = "^1.1.4" -openbb-yfinance = "^1.1.4" +openbb-benzinga = "^1.1.5" +openbb-federal-reserve = "^1.1.5" +openbb-fmp = "^1.1.5" +openbb-fred = "^1.1.5" +openbb-intrinio = "^1.1.5" +openbb-oecd = "^1.1.5" +openbb-polygon = "^1.1.5" +openbb-sec = "^1.1.5" +openbb-tiingo = "^1.1.5" +openbb-tradingeconomics = "^1.1.5" +openbb-yfinance = "^1.1.5" -openbb-commodity = "^1.0.2" -openbb-crypto = "^1.1.4" -openbb-currency = "^1.1.4" -openbb-derivatives = "^1.1.4" -openbb-economy = "^1.1.4" -openbb-equity = "^1.1.4" -openbb-etf = "^1.1.4" -openbb-fixedincome = "^1.1.4" -openbb-index = "^1.1.4" -openbb-news = "^1.1.4" -openbb-regulators = "^1.1.4" +openbb-commodity = "^1.0.4" +openbb-crypto = "^1.1.5" +openbb-currency = "^1.1.5" +openbb-derivatives = "^1.1.5" +openbb-economy = "^1.1.5" +openbb-equity = "^1.1.5" +openbb-etf = "^1.1.5" +openbb-fixedincome = "^1.1.5" +openbb-index = "^1.1.5" +openbb-news = "^1.1.5" +openbb-regulators = "^1.1.5" # Community dependencies -openbb-alpha-vantage = { version = "^1.1.4", optional = true } -openbb-biztoc = { version = "^1.1.4", optional = true } -openbb-cboe = { version = "^1.1.4", optional = true } -openbb-ecb = { version = "^1.1.4", optional = true } -openbb-finra = { version = "^1.1.4", optional = true } -openbb-finviz = { version = "^1.0.3", optional = true } -openbb-government-us = { version = "^1.1.4", optional = true } -openbb-nasdaq = { version = "^1.1.4", optional = true } -openbb-seeking-alpha = { version = "^1.1.4", optional = true } -openbb-stockgrid = { version = "^1.1.4", optional = true } -openbb-tmx = { version = "^1.0.1", optional = true } -openbb-tradier = { version = "^1.0.1", optional = true } -openbb-wsj = { version = "^1.1.4", optional = true } +openbb-alpha-vantage = { version = "^1.1.5", optional = true } +openbb-biztoc = { version = "^1.1.5", optional = true } +openbb-cboe = { version = "^1.1.5", optional = true } +openbb-ecb = { version = "^1.1.5", optional = true } +openbb-finra = { version = "^1.1.5", optional = true } +openbb-finviz = { version = "^1.0.4", optional = true } +openbb-government-us = { version = "^1.1.5", optional = true } +openbb-nasdaq = { version = "^1.1.5", optional = true } +openbb-seeking-alpha = { version = "^1.1.5", optional = true } +openbb-stockgrid = { version = "^1.1.5", optional = true } +openbb-tmx = { version = "^1.0.2", optional = true } +openbb-tradier = { version = "^1.0.2", optional = true } +openbb-wsj = { version = "^1.1.5", optional = true } -openbb-charting = { version = "^2.0.2", optional = true } -openbb-econometrics = { version = "^1.1.4", optional = true } -openbb-quantitative = { version = "^1.1.4", optional = true } -openbb-technical = { version = "^1.1.5", optional = true } +openbb-charting = { version = "^2.0.3", optional = true } +openbb-econometrics = { version = "^1.1.5", optional = true } +openbb-quantitative = { version = "^1.1.5", optional = true } +openbb-technical = { version = "^1.1.6", optional = true } [tool.poetry.extras] alpha_vantage = ["openbb-alpha-vantage"] diff --git a/openbb_platform/tests/conftest.py b/openbb_platform/tests/conftest.py index 5348bc9d309..0c35960fb62 100644 --- a/openbb_platform/tests/conftest.py +++ b/openbb_platform/tests/conftest.py @@ -1,3 +1,5 @@ +"""Configuration for pytest.""" + # TODO: See if we can dynamically import the test modules under the openbb_platform # TODO: Add global fixture for headers here @@ -6,4 +8,5 @@ import os def pytest_configure(): + """Set environment variables for testing.""" os.environ["OPENBB_AUTO_BUILD"] = "false" diff --git a/openbb_platform/tests/test_auto_build.py b/openbb_platform/tests/test_auto_build.py new file mode 100644 index 00000000000..bd6acd65fd6 --- /dev/null +++ b/openbb_platform/tests/test_auto_build.py @@ -0,0 +1,35 @@ +"""Test the auto_build feature.""" + +import importlib +import sys +from unittest.mock import patch + +import pytest + +# pylint: disable=redefined-outer-name, unused-import, import-outside-toplevel + + +@pytest.fixture(autouse=True) +def setup_mocks(): + """Set up mocks for the test.""" + with patch( + "openbb_core.app.static.package_builder.PackageBuilder.auto_build" + ) as mock_auto_build: + mock_auto_build.return_value = None + yield mock_auto_build + + +@pytest.fixture +def openbb_module(setup_mocks): + """Reload the openbb module.""" + if "openbb" in sys.modules: + importlib.reload(sys.modules["openbb"]) + else: + pass + return setup_mocks + + +@pytest.mark.integration +def test_autobuild_called(openbb_module): + """Test that auto_build is called upon importing openbb.""" + openbb_module.assert_called_once() diff --git a/openbb_platform/tests/test_extension_map.py b/openbb_platform/tests/test_extension_map.py index aa24ace5633..b3a4c742b36 100644 --- a/openbb_platform/tests/test_extension_map.py +++ b/openbb_platform/tests/test_extension_map.py @@ -1,3 +1,5 @@ +"""Test the extension map.""" + import json from pathlib import Path from typing import Dict @@ -6,12 +8,10 @@ from poetry.core.constraints.version import Version, VersionConstraint, parse_co from poetry.core.pyproject.toml import PyProjectTOML -def load_ext_map(file: Path) -> Dict[str, Version]: - """Load the extension map from extension_map.json.""" +def create_ext_map(extensions: dict) -> Dict[str, Version]: + """Create the extension map from extension.""" ext_map = {} - with open(file) as f: - ext_map_json = json.load(f) - for _, v in ext_map_json.items(): + for _, v in extensions.items(): for value in v: name, version = value.split("@") ext_map[name] = Version.parse(version) @@ -36,9 +36,9 @@ def load_req_ext(file: Path) -> Dict[str, VersionConstraint]: def test_extension_map(): """Ensure only required extensions are built and versions respect pyproject.toml""" this_dir = Path(__file__).parent - ext_map = load_ext_map( - Path(this_dir, "..", "openbb", "assets", "extension_map.json") - ) + with open(Path(this_dir, "..", "openbb", "assets", "reference.json")) as f: + reference = json.load(f) + ext_map = create_ext_map(reference.get("info", {}).get("extensions", {})) req_ext = load_req_ext(Path(this_dir, "..", "pyproject.toml")) for ext in req_ext: diff --git a/poetry.lock b/poetry.lock index f67bc7728cd..5d6d1804b87 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,14 +1,14 @@ -# This file is automatically @generated by Poetry 1.8.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. [[package]] name = "absl-py" -version = "1.4.0" +version = "2.1.0" description = "Abseil Python Common Libraries, see https://github.com/abseil/abseil-py." optional = true -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "absl-py-1.4.0.tar.gz", hash = "sha256:d2c244d01048ba476e7c080bd2c6df5e141d211de80223460d5b3b8a2a58433d"}, - {file = "absl_py-1.4.0-py3-none-any.whl", hash = "sha256:0d3fe606adfa4f7db64792dd4c7aee4ee0c38ab75dfd353b7a83ed3e957fcb47"}, + {file = "absl-py-2.1.0.tar.gz", hash = "sha256:7820790efbb316739cde8b4e19357243fc3608a152024288513dd968d7d959ff"}, + {file = "absl_py-2.1.0-py3-none-any.whl", hash = "sha256:526a04eadab8b4ee719ce68f204172ead1027549089702d99b9059f129ff1308"}, ] [[package]] @@ -27,13 +27,13 @@ triad = ">=0.6.1" [[package]] name = "aiodns" -version = "3.0.0" +version = "3.2.0" description = "Simple DNS resolver for asyncio" optional = false python-versions = "*" files = [ - {file = "aiodns-3.0.0-py3-none-any.whl", hash = "sha256:2b19bc5f97e5c936638d28e665923c093d8af2bf3aa88d35c43417fa25d136a2"}, - {file = "aiodns-3.0.0.tar.gz", hash = "sha256:946bdfabe743fceeeb093c8a010f5d1645f708a241be849e17edfb0e49e08cd6"}, + {file = "aiodns-3.2.0-py3-none-any.whl", hash = "sha256:e443c0c27b07da3174a109fd9e736d69058d808f144d3c9d56dbd1776964c5f5"}, + {file = "aiodns-3.2.0.tar.gz", hash = "sha256:62869b23409349c21b072883ec8998316b234c9a9e36675756e8e317e8768f72"}, ] [package.dependencies] @@ -52,111 +52,99 @@ files = [ [[package]] name = "aiohttp" -version = "3.8.5" +version = "3.9.5" description = "Async http client/server framework (asyncio)" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8"}, - {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84"}, - {file = "aiohttp-3.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825"}, - {file = "aiohttp-3.8.5-cp310-cp310-win32.whl", hash = "sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802"}, - {file = "aiohttp-3.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c"}, - {file = "aiohttp-3.8.5-cp311-cp311-win32.whl", hash = "sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945"}, - {file = "aiohttp-3.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755"}, - {file = "aiohttp-3.8.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824"}, - {file = "aiohttp-3.8.5-cp36-cp36m-win32.whl", hash = "sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e"}, - {file = "aiohttp-3.8.5-cp36-cp36m-win_amd64.whl", hash = "sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-win32.whl", hash = "sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22"}, - {file = "aiohttp-3.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35"}, - {file = "aiohttp-3.8.5-cp38-cp38-win32.whl", hash = "sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c"}, - {file = "aiohttp-3.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91"}, - {file = "aiohttp-3.8.5-cp39-cp39-win32.whl", hash = "sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67"}, - {file = "aiohttp-3.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c"}, - {file = "aiohttp-3.8.5.tar.gz", hash = "sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fcde4c397f673fdec23e6b05ebf8d4751314fa7c24f93334bf1f1364c1c69ac7"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d6b3f1fabe465e819aed2c421a6743d8debbde79b6a8600739300630a01bf2c"}, + {file = "aiohttp-3.9.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ae79c1bc12c34082d92bf9422764f799aee4746fd7a392db46b7fd357d4a17a"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d3ebb9e1316ec74277d19c5f482f98cc65a73ccd5430540d6d11682cd857430"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84dabd95154f43a2ea80deffec9cb44d2e301e38a0c9d331cc4aa0166fe28ae3"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c8a02fbeca6f63cb1f0475c799679057fc9268b77075ab7cf3f1c600e81dd46b"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c26959ca7b75ff768e2776d8055bf9582a6267e24556bb7f7bd29e677932be72"}, + {file = "aiohttp-3.9.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:714d4e5231fed4ba2762ed489b4aec07b2b9953cf4ee31e9871caac895a839c0"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e7a6a8354f1b62e15d48e04350f13e726fa08b62c3d7b8401c0a1314f02e3558"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c413016880e03e69d166efb5a1a95d40f83d5a3a648d16486592c49ffb76d0db"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ff84aeb864e0fac81f676be9f4685f0527b660f1efdc40dcede3c251ef1e867f"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ad7f2919d7dac062f24d6f5fe95d401597fbb015a25771f85e692d043c9d7832"}, + {file = "aiohttp-3.9.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:702e2c7c187c1a498a4e2b03155d52658fdd6fda882d3d7fbb891a5cf108bb10"}, + {file = "aiohttp-3.9.5-cp310-cp310-win32.whl", hash = "sha256:67c3119f5ddc7261d47163ed86d760ddf0e625cd6246b4ed852e82159617b5fb"}, + {file = "aiohttp-3.9.5-cp310-cp310-win_amd64.whl", hash = "sha256:471f0ef53ccedec9995287f02caf0c068732f026455f07db3f01a46e49d76bbb"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ae53e33ee7476dd3d1132f932eeb39bf6125083820049d06edcdca4381f342"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c088c4d70d21f8ca5c0b8b5403fe84a7bc8e024161febdd4ef04575ef35d474d"}, + {file = "aiohttp-3.9.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:639d0042b7670222f33b0028de6b4e2fad6451462ce7df2af8aee37dcac55424"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f26383adb94da5e7fb388d441bf09c61e5e35f455a3217bfd790c6b6bc64b2ee"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66331d00fb28dc90aa606d9a54304af76b335ae204d1836f65797d6fe27f1ca2"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4ff550491f5492ab5ed3533e76b8567f4b37bd2995e780a1f46bca2024223233"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f22eb3a6c1080d862befa0a89c380b4dafce29dc6cd56083f630073d102eb595"}, + {file = "aiohttp-3.9.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a81b1143d42b66ffc40a441379387076243ef7b51019204fd3ec36b9f69e77d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f64fd07515dad67f24b6ea4a66ae2876c01031de91c93075b8093f07c0a2d93d"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:93e22add827447d2e26d67c9ac0161756007f152fdc5210277d00a85f6c92323"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:55b39c8684a46e56ef8c8d24faf02de4a2b2ac60d26cee93bc595651ff545de9"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4715a9b778f4293b9f8ae7a0a7cef9829f02ff8d6277a39d7f40565c737d3771"}, + {file = "aiohttp-3.9.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:afc52b8d969eff14e069a710057d15ab9ac17cd4b6753042c407dcea0e40bf75"}, + {file = "aiohttp-3.9.5-cp311-cp311-win32.whl", hash = "sha256:b3df71da99c98534be076196791adca8819761f0bf6e08e07fd7da25127150d6"}, + {file = "aiohttp-3.9.5-cp311-cp311-win_amd64.whl", hash = "sha256:88e311d98cc0bf45b62fc46c66753a83445f5ab20038bcc1b8a1cc05666f428a"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c7a4b7a6cf5b6eb11e109a9755fd4fda7d57395f8c575e166d363b9fc3ec4678"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0a158704edf0abcac8ac371fbb54044f3270bdbc93e254a82b6c82be1ef08f3c"}, + {file = "aiohttp-3.9.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d153f652a687a8e95ad367a86a61e8d53d528b0530ef382ec5aaf533140ed00f"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82a6a97d9771cb48ae16979c3a3a9a18b600a8505b1115cfe354dfb2054468b4"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:60cdbd56f4cad9f69c35eaac0fbbdf1f77b0ff9456cebd4902f3dd1cf096464c"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8676e8fd73141ded15ea586de0b7cda1542960a7b9ad89b2b06428e97125d4fa"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da00da442a0e31f1c69d26d224e1efd3a1ca5bcbf210978a2ca7426dfcae9f58"}, + {file = "aiohttp-3.9.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:18f634d540dd099c262e9f887c8bbacc959847cfe5da7a0e2e1cf3f14dbf2daf"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:320e8618eda64e19d11bdb3bd04ccc0a816c17eaecb7e4945d01deee2a22f95f"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2faa61a904b83142747fc6a6d7ad8fccff898c849123030f8e75d5d967fd4a81"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:8c64a6dc3fe5db7b1b4d2b5cb84c4f677768bdc340611eca673afb7cf416ef5a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:393c7aba2b55559ef7ab791c94b44f7482a07bf7640d17b341b79081f5e5cd1a"}, + {file = "aiohttp-3.9.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c671dc117c2c21a1ca10c116cfcd6e3e44da7fcde37bf83b2be485ab377b25da"}, + {file = "aiohttp-3.9.5-cp312-cp312-win32.whl", hash = "sha256:5a7ee16aab26e76add4afc45e8f8206c95d1d75540f1039b84a03c3b3800dd59"}, + {file = "aiohttp-3.9.5-cp312-cp312-win_amd64.whl", hash = "sha256:5ca51eadbd67045396bc92a4345d1790b7301c14d1848feaac1d6a6c9289e888"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:694d828b5c41255e54bc2dddb51a9f5150b4eefa9886e38b52605a05d96566e8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0605cc2c0088fcaae79f01c913a38611ad09ba68ff482402d3410bf59039bfb8"}, + {file = "aiohttp-3.9.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4558e5012ee03d2638c681e156461d37b7a113fe13970d438d95d10173d25f78"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbc053ac75ccc63dc3a3cc547b98c7258ec35a215a92bd9f983e0aac95d3d5b"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4109adee842b90671f1b689901b948f347325045c15f46b39797ae1bf17019de"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6ea1a5b409a85477fd8e5ee6ad8f0e40bf2844c270955e09360418cfd09abac"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3c2890ca8c59ee683fd09adf32321a40fe1cf164e3387799efb2acebf090c11"}, + {file = "aiohttp-3.9.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3916c8692dbd9d55c523374a3b8213e628424d19116ac4308e434dbf6d95bbdd"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8d1964eb7617907c792ca00b341b5ec3e01ae8c280825deadbbd678447b127e1"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d5ab8e1f6bee051a4bf6195e38a5c13e5e161cb7bad83d8854524798bd9fcd6e"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52c27110f3862a1afbcb2af4281fc9fdc40327fa286c4625dfee247c3ba90156"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7f64cbd44443e80094309875d4f9c71d0401e966d191c3d469cde4642bc2e031"}, + {file = "aiohttp-3.9.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8b4f72fbb66279624bfe83fd5eb6aea0022dad8eec62b71e7bf63ee1caadeafe"}, + {file = "aiohttp-3.9.5-cp38-cp38-win32.whl", hash = "sha256:6380c039ec52866c06d69b5c7aad5478b24ed11696f0e72f6b807cfb261453da"}, + {file = "aiohttp-3.9.5-cp38-cp38-win_amd64.whl", hash = "sha256:da22dab31d7180f8c3ac7c7635f3bcd53808f374f6aa333fe0b0b9e14b01f91a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1732102949ff6087589408d76cd6dea656b93c896b011ecafff418c9661dc4ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c6021d296318cb6f9414b48e6a439a7f5d1f665464da507e8ff640848ee2a58a"}, + {file = "aiohttp-3.9.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:239f975589a944eeb1bad26b8b140a59a3a320067fb3cd10b75c3092405a1372"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b7b30258348082826d274504fbc7c849959f1989d86c29bc355107accec6cfb"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd2adf5c87ff6d8b277814a28a535b59e20bfea40a101db6b3bdca7e9926bc24"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e9a3d838441bebcf5cf442700e3963f58b5c33f015341f9ea86dcd7d503c07e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e3a1ae66e3d0c17cf65c08968a5ee3180c5a95920ec2731f53343fac9bad106"}, + {file = "aiohttp-3.9.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9c69e77370cce2d6df5d12b4e12bdcca60c47ba13d1cbbc8645dd005a20b738b"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf56238f4bbf49dab8c2dc2e6b1b68502b1e88d335bea59b3f5b9f4c001475"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d1469f228cd9ffddd396d9948b8c9cd8022b6d1bf1e40c6f25b0fb90b4f893ed"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:45731330e754f5811c314901cebdf19dd776a44b31927fa4b4dbecab9e457b0c"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3fcb4046d2904378e3aeea1df51f697b0467f2aac55d232c87ba162709478c46"}, + {file = "aiohttp-3.9.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8cf142aa6c1a751fcb364158fd710b8a9be874b81889c2bd13aa8893197455e2"}, + {file = "aiohttp-3.9.5-cp39-cp39-win32.whl", hash = "sha256:7b179eea70833c8dee51ec42f3b4097bd6370892fa93f510f76762105568cf09"}, + {file = "aiohttp-3.9.5-cp39-cp39-win_amd64.whl", hash = "sha256:38d80498e2e169bc61418ff36170e0aad0cd268da8b38a17c4cf29d254a8b3f1"}, + {file = "aiohttp-3.9.5.tar.gz", hash = "sha256:edea7d15772ceeb29db4aff55e482d4bcfb6ae160ce144f2682de02f6d693551"}, ] [package.dependencies] aiosignal = ">=1.1.2" -async-timeout = ">=4.0.0a3,<5.0" +async-timeout = {version = ">=4.0,<5.0", markers = "python_version < \"3.11\""} attrs = ">=17.3.0" -charset-normalizer = ">=2.0,<4.0" frozenlist = ">=1.1.1" multidict = ">=4.5,<7.0" yarl = ">=1.0,<2.0" [package.extras] -speedups = ["Brotli", "aiodns", "cchardet"] +speedups = ["Brotli", "aiodns", "brotlicffi"] [[package]] name = "aiosignal" @@ -174,18 +162,21 @@ frozenlist = ">=1.1.0" [[package]] name = "aiosqlite" -version = "0.19.0" +version = "0.20.0" description = "asyncio bridge to the standard sqlite3 module" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "aiosqlite-0.19.0-py3-none-any.whl", hash = "sha256:edba222e03453e094a3ce605db1b970c4b3376264e56f32e2a4959f948d66a96"}, - {file = "aiosqlite-0.19.0.tar.gz", hash = "sha256:95ee77b91c8d2808bd08a59fbebf66270e9090c3d92ffbf260dc0db0b979577d"}, + {file = "aiosqlite-0.20.0-py3-none-any.whl", hash = "sha256:36a1deaca0cac40ebe32aac9977a6e2bbc7f5189f23f4a54d5908986729e5bd6"}, + {file = "aiosqlite-0.20.0.tar.gz", hash = "sha256:6d35c8c256637f4672f843c31021464090805bf925385ac39473fb16eaaca3d7"}, ] +[package.dependencies] +typing_extensions = ">=4.0" + [package.extras] -dev = ["aiounittest (==1.4.1)", "attribution (==1.6.2)", "black (==23.3.0)", "coverage[toml] (==7.2.3)", "flake8 (==5.0.4)", "flake8-bugbear (==23.3.12)", "flit (==3.7.1)", "mypy (==1.2.0)", "ufmt (==2.1.0)", "usort (==1.0.6)"] -docs = ["sphinx (==6.1.3)", "sphinx-mdinclude (==0.5.3)"] +dev = ["attribution (==1.7.0)", "black (==24.2.0)", "coverage[toml] (==7.4.1)", "flake8 (==7.0.0)", "flake8-bugbear (==24.2.6)", "flit (==3.9.0)", "mypy (==1.8.0)", "ufmt (==2.3.0)", "usort (==1.0.8.post1)"] +docs = ["sphinx (==7.2.6)", "sphinx-mdinclude (==0.5.3)"] [[package]] name = "alabaster" @@ -215,53 +206,40 @@ requests = "*" [[package]] name = "altair" -version = "5.0.1" +version = "5.3.0" description = "Vega-Altair: A declarative statistical visualization library for Python." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "altair-5.0.1-py3-none-any.whl", hash = "sha256:9f3552ed5497d4dfc14cf48a76141d8c29ee56eae2873481b4b28134268c9bbe"}, - {file = "altair-5.0.1.tar.gz", hash = "sha256:087d7033cb2d6c228493a053e12613058a5d47faf6a36aea3ff60305fd8b4cb0"}, + {file = "altair-5.3.0-py3-none-any.whl", hash = "sha256:7084a1dab4d83c5e7e5246b92dc1b4451a6c68fd057f3716ee9d315c8980e59a"}, + {file = "altair-5.3.0.tar.gz", hash = "sha256:5a268b1a0983b23d8f9129f819f956174aa7aea2719ed55a52eba9979b9f6675"}, ] [package.dependencies] jinja2 = "*" jsonschema = ">=3.0" numpy = "*" -pandas = ">=0.18" +packaging = "*" +pandas = ">=0.25" toolz = "*" typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] -dev = ["black (<24)", "hatch", "ipython", "m2r", "mypy", "pandas-stubs", "pytest", "pytest-cov", "ruff", "types-jsonschema", "types-setuptools", "vega-datasets", "vl-convert-python"] -doc = ["docutils", "geopandas", "jinja2", "myst-parser", "numpydoc", "pillow", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinxext-altair"] +all = ["altair-tiles (>=0.3.0)", "anywidget (>=0.9.0)", "pyarrow (>=11)", "vega-datasets (>=0.9.0)", "vegafusion[embed] (>=1.6.6)", "vl-convert-python (>=1.3.0)"] +dev = ["geopandas", "hatch", "ipython", "m2r", "mypy", "pandas-stubs", "pytest", "pytest-cov", "ruff (>=0.3.0)", "types-jsonschema", "types-setuptools"] +doc = ["docutils", "jinja2", "myst-parser", "numpydoc", "pillow (>=9,<10)", "pydata-sphinx-theme (>=0.14.1)", "scipy", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinxext-altair"] [[package]] name = "altgraph" -version = "0.17.3" +version = "0.17.4" description = "Python graph (network) package" optional = true python-versions = "*" files = [ - {file = "altgraph-0.17.3-py2.py3-none-any.whl", hash = "sha256:c8ac1ca6772207179ed8003ce7687757c04b0b71536f81e2ac5755c6226458fe"}, - {file = "altgraph-0.17.3.tar.gz", hash = "sha256:ad33358114df7c9416cdb8fa1eaa5852166c505118717021c6a8c7c7abbd03dd"}, + {file = "altgraph-0.17.4-py2.py3-none-any.whl", hash = "sha256:642743b4750de17e655e6711601b077bc6598dbfa3ba5fa2b2a35ce12b508dff"}, + {file = "altgraph-0.17.4.tar.gz", hash = "sha256:1b5afbb98f6c4dcadb2e2ae6ab9fa994bbb8c1d75f4fa96d340f9437ae454406"}, ] -[[package]] -name = "ansi2html" -version = "1.8.0" -description = "" -optional = true -python-versions = ">=3.6" -files = [ - {file = "ansi2html-1.8.0-py3-none-any.whl", hash = "sha256:ef9cc9682539dbe524fbf8edad9c9462a308e04bce1170c32daa8fdfd0001785"}, - {file = "ansi2html-1.8.0.tar.gz", hash = "sha256:38b82a298482a1fa2613f0f9c9beb3db72a8f832eeac58eb2e47bf32cd37f6d5"}, -] - -[package.extras] -docs = ["Sphinx", "setuptools-scm", "sphinx-rtd-theme"] -test = ["pytest", "pytest-cov"] - [[package]] name = "ansiwrap" version = "0.8.4" @@ -321,13 +299,13 @@ files = [ [[package]] name = "appnope" -version = "0.1.3" +version = "0.1.4" description = "Disable App Nap on macOS >= 10.9" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, - {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, ] [[package]] @@ -371,22 +349,23 @@ statsmodels = ">=0.11" [[package]] name = "argon2-cffi" -version = "21.3.0" -description = "The secure Argon2 password hashing algorithm." +version = "23.1.0" +description = "Argon2 for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "argon2-cffi-21.3.0.tar.gz", hash = "sha256:d384164d944190a7dd7ef22c6aa3ff197da12962bd04b17f64d4e93d934dba5b"}, - {file = "argon2_cffi-21.3.0-py3-none-any.whl", hash = "sha256:8c976986f2c5c0e5000919e6de187906cfd81fb1c72bf9d88c01177e77da7f80"}, + {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, + {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, ] [package.dependencies] argon2-cffi-bindings = "*" [package.extras] -dev = ["cogapp", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "pre-commit", "pytest", "sphinx", "sphinx-notfound-page", "tomli"] -docs = ["furo", "sphinx", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] +dev = ["argon2-cffi[tests,typing]", "tox (>4)"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-notfound-page"] +tests = ["hypothesis", "pytest"] +typing = ["mypy"] [[package]] name = "argon2-cffi-bindings" @@ -427,17 +406,22 @@ tests = ["pytest"] [[package]] name = "arrow" -version = "1.2.3" +version = "1.3.0" description = "Better dates & times for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "arrow-1.2.3-py3-none-any.whl", hash = "sha256:5a49ab92e3b7b71d96cd6bfcc4df14efefc9dfa96ea19045815914a6ab6b1fe2"}, - {file = "arrow-1.2.3.tar.gz", hash = "sha256:3934b30ca1b9f292376d9db15b19446088d12ec58629bc3f0da28fd55fb633a1"}, + {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, + {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, ] [package.dependencies] python-dateutil = ">=2.7.0" +types-python-dateutil = ">=2.8.10" + +[package.extras] +doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] +test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"] [[package]] name = "ascii-magic" @@ -467,13 +451,13 @@ files = [ [[package]] name = "astroid" -version = "2.15.6" +version = "2.15.8" description = "An abstract syntax tree for Python with inference support." optional = false python-versions = ">=3.7.2" files = [ - {file = "astroid-2.15.6-py3-none-any.whl", hash = "sha256:389656ca57b6108f939cf5d2f9a2a825a3be50ba9d589670f393236e0a03b91c"}, - {file = "astroid-2.15.6.tar.gz", hash = "sha256:903f024859b7c7687d7a7f3a3f73b17301f8e42dfd9cc9df9d4418172d3e2dbd"}, + {file = "astroid-2.15.8-py3-none-any.whl", hash = "sha256:1aa149fc5c6589e3d0ece885b4491acd80af4f087baafa3fb5203b113e68cd3c"}, + {file = "astroid-2.15.8.tar.gz", hash = "sha256:6c107453dffee9055899705de3c9ead36e74119cee151e5a9aaf7f0b0e020a6a"}, ] [package.dependencies] @@ -536,30 +520,31 @@ test-all = ["coverage[toml]", "ipython (>=4.2)", "objgraph", "pytest (>=7.0)", " [[package]] name = "asttokens" -version = "2.2.1" +version = "2.4.1" description = "Annotate AST trees with source code positions" optional = false python-versions = "*" files = [ - {file = "asttokens-2.2.1-py2.py3-none-any.whl", hash = "sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c"}, - {file = "asttokens-2.2.1.tar.gz", hash = "sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3"}, + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, ] [package.dependencies] -six = "*" +six = ">=1.12.0" [package.extras] -test = ["astroid", "pytest"] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] [[package]] name = "async-timeout" -version = "4.0.2" +version = "4.0.3" description = "Timeout context manager for asyncio programs" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, ] [[package]] @@ -591,18 +576,21 @@ tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy" [[package]] name = "babel" -version = "2.12.1" +version = "2.14.0" description = "Internationalization utilities" optional = false python-versions = ">=3.7" files = [ - {file = "Babel-2.12.1-py3-none-any.whl", hash = "sha256:b4246fb7677d3b98f501a39d43396d3cafdc8eadb045f4a31be01863f655c610"}, - {file = "Babel-2.12.1.tar.gz", hash = "sha256:cc2d99999cd01d44420ae725a21c9e3711b3aadc7976d6147f622d8581963455"}, + {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, + {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, ] [package.dependencies] pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + [[package]] name = "backcall" version = "0.2.0" @@ -655,24 +643,25 @@ tzdata = ["tzdata"] [[package]] name = "bandit" -version = "1.7.5" +version = "1.7.8" description = "Security oriented static analyser for python code." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "bandit-1.7.5-py3-none-any.whl", hash = "sha256:75665181dc1e0096369112541a056c59d1c5f66f9bb74a8d686c3c362b83f549"}, - {file = "bandit-1.7.5.tar.gz", hash = "sha256:bdfc739baa03b880c2d15d0431b31c658ffc348e907fe197e54e0389dd59e11e"}, + {file = "bandit-1.7.8-py3-none-any.whl", hash = "sha256:509f7af645bc0cd8fd4587abc1a038fc795636671ee8204d502b933aee44f381"}, + {file = "bandit-1.7.8.tar.gz", hash = "sha256:36de50f720856ab24a24dbaa5fee2c66050ed97c1477e0a1159deab1775eab6b"}, ] [package.dependencies] colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} -GitPython = ">=1.0.1" PyYAML = ">=5.3.1" rich = "*" stevedore = ">=1.20.0" [package.extras] -test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "tomli (>=1.1.0)"] +baseline = ["GitPython (>=3.1.30)"] +sarif = ["jschema-to-python (>=1.2.3)", "sarif-om (>=1.0.4)"] +test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)"] toml = ["tomli (>=1.1.0)"] yaml = ["PyYAML"] @@ -692,51 +681,54 @@ tests = ["PyHamcrest (>=2.0.2)", "mypy", "pytest (>=4.6)", "pytest-benchmark", " [[package]] name = "beautifulsoup4" -version = "4.12.2" +version = "4.12.3" description = "Screen-scraping library" optional = false python-versions = ">=3.6.0" files = [ - {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, - {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, ] [package.dependencies] soupsieve = ">1.2" [package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] html5lib = ["html5lib"] lxml = ["lxml"] [[package]] name = "black" -version = "24.2.0" +version = "24.4.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-24.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6981eae48b3b33399c8757036c7f5d48a535b962a7c2310d19361edeef64ce29"}, - {file = "black-24.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d533d5e3259720fdbc1b37444491b024003e012c5173f7d06825a77508085430"}, - {file = "black-24.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61a0391772490ddfb8a693c067df1ef5227257e72b0e4108482b8d41b5aee13f"}, - {file = "black-24.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:992e451b04667116680cb88f63449267c13e1ad134f30087dec8527242e9862a"}, - {file = "black-24.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:163baf4ef40e6897a2a9b83890e59141cc8c2a98f2dda5080dc15c00ee1e62cd"}, - {file = "black-24.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e37c99f89929af50ffaf912454b3e3b47fd64109659026b678c091a4cd450fb2"}, - {file = "black-24.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9de21bafcba9683853f6c96c2d515e364aee631b178eaa5145fc1c61a3cc92"}, - {file = "black-24.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:9db528bccb9e8e20c08e716b3b09c6bdd64da0dd129b11e160bf082d4642ac23"}, - {file = "black-24.2.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d84f29eb3ee44859052073b7636533ec995bd0f64e2fb43aeceefc70090e752b"}, - {file = "black-24.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e08fb9a15c914b81dd734ddd7fb10513016e5ce7e6704bdd5e1251ceee51ac9"}, - {file = "black-24.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:810d445ae6069ce64030c78ff6127cd9cd178a9ac3361435708b907d8a04c693"}, - {file = "black-24.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:ba15742a13de85e9b8f3239c8f807723991fbfae24bad92d34a2b12e81904982"}, - {file = "black-24.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7e53a8c630f71db01b28cd9602a1ada68c937cbf2c333e6ed041390d6968faf4"}, - {file = "black-24.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:93601c2deb321b4bad8f95df408e3fb3943d85012dddb6121336b8e24a0d1218"}, - {file = "black-24.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0057f800de6acc4407fe75bb147b0c2b5cbb7c3ed110d3e5999cd01184d53b0"}, - {file = "black-24.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:faf2ee02e6612577ba0181f4347bcbcf591eb122f7841ae5ba233d12c39dcb4d"}, - {file = "black-24.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:057c3dc602eaa6fdc451069bd027a1b2635028b575a6c3acfd63193ced20d9c8"}, - {file = "black-24.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:08654d0797e65f2423f850fc8e16a0ce50925f9337fb4a4a176a7aa4026e63f8"}, - {file = "black-24.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ca610d29415ee1a30a3f30fab7a8f4144e9d34c89a235d81292a1edb2b55f540"}, - {file = "black-24.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:4dd76e9468d5536abd40ffbc7a247f83b2324f0c050556d9c371c2b9a9a95e31"}, - {file = "black-24.2.0-py3-none-any.whl", hash = "sha256:e8a6ae970537e67830776488bca52000eaa37fa63b9988e8c487458d9cd5ace6"}, - {file = "black-24.2.0.tar.gz", hash = "sha256:bce4f25c27c3435e4dace4815bcb2008b87e167e3bf4ee47ccdc5ce906eb4894"}, + {file = "black-24.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6ad001a9ddd9b8dfd1b434d566be39b1cd502802c8d38bbb1ba612afda2ef436"}, + {file = "black-24.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3a3a092b8b756c643fe45f4624dbd5a389f770a4ac294cf4d0fce6af86addaf"}, + {file = "black-24.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dae79397f367ac8d7adb6c779813328f6d690943f64b32983e896bcccd18cbad"}, + {file = "black-24.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:71d998b73c957444fb7c52096c3843875f4b6b47a54972598741fe9a7f737fcb"}, + {file = "black-24.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8e5537f456a22cf5cfcb2707803431d2feeb82ab3748ade280d6ccd0b40ed2e8"}, + {file = "black-24.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64e60a7edd71fd542a10a9643bf369bfd2644de95ec71e86790b063aa02ff745"}, + {file = "black-24.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cd5b4f76056cecce3e69b0d4c228326d2595f506797f40b9233424e2524c070"}, + {file = "black-24.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:64578cf99b6b46a6301bc28bdb89f9d6f9b592b1c5837818a177c98525dbe397"}, + {file = "black-24.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f95cece33329dc4aa3b0e1a771c41075812e46cf3d6e3f1dfe3d91ff09826ed2"}, + {file = "black-24.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4396ca365a4310beef84d446ca5016f671b10f07abdba3e4e4304218d2c71d33"}, + {file = "black-24.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44d99dfdf37a2a00a6f7a8dcbd19edf361d056ee51093b2445de7ca09adac965"}, + {file = "black-24.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:21f9407063ec71c5580b8ad975653c66508d6a9f57bd008bb8691d273705adcd"}, + {file = "black-24.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:652e55bb722ca026299eb74e53880ee2315b181dfdd44dca98e43448620ddec1"}, + {file = "black-24.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7f2966b9b2b3b7104fca9d75b2ee856fe3fdd7ed9e47c753a4bb1a675f2caab8"}, + {file = "black-24.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bb9ca06e556a09f7f7177bc7cb604e5ed2d2df1e9119e4f7d2f1f7071c32e5d"}, + {file = "black-24.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4e71cdebdc8efeb6deaf5f2deb28325f8614d48426bed118ecc2dcaefb9ebf3"}, + {file = "black-24.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6644f97a7ef6f401a150cca551a1ff97e03c25d8519ee0bbc9b0058772882665"}, + {file = "black-24.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:75a2d0b4f5eb81f7eebc31f788f9830a6ce10a68c91fbe0fade34fff7a2836e6"}, + {file = "black-24.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb949f56a63c5e134dfdca12091e98ffb5fd446293ebae123d10fc1abad00b9e"}, + {file = "black-24.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:7852b05d02b5b9a8c893ab95863ef8986e4dda29af80bbbda94d7aee1abf8702"}, + {file = "black-24.4.0-py3-none-any.whl", hash = "sha256:74eb9b5420e26b42c00a3ff470dc0cd144b80a766128b1771d07643165e08d0e"}, + {file = "black-24.4.0.tar.gz", hash = "sha256:f07b69fda20578367eaebbd670ff8fc653ab181e1ff95d84497f9fa20e7d0641"}, ] [package.dependencies] @@ -756,13 +748,13 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "bleach" -version = "6.0.0" +version = "6.1.0" description = "An easy safelist-based HTML-sanitizing tool." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "bleach-6.0.0-py3-none-any.whl", hash = "sha256:33c16e3353dbd13028ab4799a0f89a83f113405c766e9c122df8a06f5b85b3f4"}, - {file = "bleach-6.0.0.tar.gz", hash = "sha256:1a1a85c1595e07d8db14c5f09f09e6433502c51c595970edc090551f0db99414"}, + {file = "bleach-6.1.0-py3-none-any.whl", hash = "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6"}, + {file = "bleach-6.1.0.tar.gz", hash = "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe"}, ] [package.dependencies] @@ -770,147 +762,145 @@ six = ">=1.9.0" webencodings = "*" [package.extras] -css = ["tinycss2 (>=1.1.0,<1.2)"] +css = ["tinycss2 (>=1.1.0,<1.3)"] [[package]] name = "blinker" -version = "1.6.2" +version = "1.7.0" description = "Fast, simple object-to-object and broadcast signaling" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "blinker-1.6.2-py3-none-any.whl", hash = "sha256:c3d739772abb7bc2860abf5f2ec284223d9ad5c76da018234f6f50d6f31ab1f0"}, - {file = "blinker-1.6.2.tar.gz", hash = "sha256:4afd3de66ef3a9f8067559fb7a1cbe555c17dcbe15971b05d1b625c3e7abe213"}, + {file = "blinker-1.7.0-py3-none-any.whl", hash = "sha256:c3f865d4d54db7abc53758a01601cf343fe55b84c1de4e3fa910e420b438d5b9"}, + {file = "blinker-1.7.0.tar.gz", hash = "sha256:e6820ff6fa4e4d1d8e2747c2283749c3f547e4fee112b98555cdcdae32996182"}, ] [[package]] name = "brotli" -version = "1.0.9" +version = "1.1.0" description = "Python bindings for the Brotli compression library" optional = true python-versions = "*" files = [ - {file = "Brotli-1.0.9-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:268fe94547ba25b58ebc724680609c8ee3e5a843202e9a381f6f9c5e8bdb5c70"}, - {file = "Brotli-1.0.9-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:c2415d9d082152460f2bd4e382a1e85aed233abc92db5a3880da2257dc7daf7b"}, - {file = "Brotli-1.0.9-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5913a1177fc36e30fcf6dc868ce23b0453952c78c04c266d3149b3d39e1410d6"}, - {file = "Brotli-1.0.9-cp27-cp27m-win32.whl", hash = "sha256:afde17ae04d90fbe53afb628f7f2d4ca022797aa093e809de5c3cf276f61bbfa"}, - {file = "Brotli-1.0.9-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7cb81373984cc0e4682f31bc3d6be9026006d96eecd07ea49aafb06897746452"}, - {file = "Brotli-1.0.9-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:db844eb158a87ccab83e868a762ea8024ae27337fc7ddcbfcddd157f841fdfe7"}, - {file = "Brotli-1.0.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9744a863b489c79a73aba014df554b0e7a0fc44ef3f8a0ef2a52919c7d155031"}, - {file = "Brotli-1.0.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a72661af47119a80d82fa583b554095308d6a4c356b2a554fdc2799bc19f2a43"}, - {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ee83d3e3a024a9618e5be64648d6d11c37047ac48adff25f12fa4226cf23d1c"}, - {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:19598ecddd8a212aedb1ffa15763dd52a388518c4550e615aed88dc3753c0f0c"}, - {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:44bb8ff420c1d19d91d79d8c3574b8954288bdff0273bf788954064d260d7ab0"}, - {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e23281b9a08ec338469268f98f194658abfb13658ee98e2b7f85ee9dd06caa91"}, - {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3496fc835370da351d37cada4cf744039616a6db7d13c430035e901443a34daa"}, - {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83bb06a0192cccf1eb8d0a28672a1b79c74c3a8a5f2619625aeb6f28b3a82bb"}, - {file = "Brotli-1.0.9-cp310-cp310-win32.whl", hash = "sha256:26d168aac4aaec9a4394221240e8a5436b5634adc3cd1cdf637f6645cecbf181"}, - {file = "Brotli-1.0.9-cp310-cp310-win_amd64.whl", hash = "sha256:622a231b08899c864eb87e85f81c75e7b9ce05b001e59bbfbf43d4a71f5f32b2"}, - {file = "Brotli-1.0.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cc0283a406774f465fb45ec7efb66857c09ffefbe49ec20b7882eff6d3c86d3a"}, - {file = "Brotli-1.0.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:11d3283d89af7033236fa4e73ec2cbe743d4f6a81d41bd234f24bf63dde979df"}, - {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c1306004d49b84bd0c4f90457c6f57ad109f5cc6067a9664e12b7b79a9948ad"}, - {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1375b5d17d6145c798661b67e4ae9d5496920d9265e2f00f1c2c0b5ae91fbde"}, - {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cab1b5964b39607a66adbba01f1c12df2e55ac36c81ec6ed44f2fca44178bf1a"}, - {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8ed6a5b3d23ecc00ea02e1ed8e0ff9a08f4fc87a1f58a2530e71c0f48adf882f"}, - {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cb02ed34557afde2d2da68194d12f5719ee96cfb2eacc886352cb73e3808fc5d"}, - {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b3523f51818e8f16599613edddb1ff924eeb4b53ab7e7197f85cbc321cdca32f"}, - {file = "Brotli-1.0.9-cp311-cp311-win32.whl", hash = "sha256:ba72d37e2a924717990f4d7482e8ac88e2ef43fb95491eb6e0d124d77d2a150d"}, - {file = "Brotli-1.0.9-cp311-cp311-win_amd64.whl", hash = "sha256:3ffaadcaeafe9d30a7e4e1e97ad727e4f5610b9fa2f7551998471e3736738679"}, - {file = "Brotli-1.0.9-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:c83aa123d56f2e060644427a882a36b3c12db93727ad7a7b9efd7d7f3e9cc2c4"}, - {file = "Brotli-1.0.9-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:6b2ae9f5f67f89aade1fab0f7fd8f2832501311c363a21579d02defa844d9296"}, - {file = "Brotli-1.0.9-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:68715970f16b6e92c574c30747c95cf8cf62804569647386ff032195dc89a430"}, - {file = "Brotli-1.0.9-cp35-cp35m-win32.whl", hash = "sha256:defed7ea5f218a9f2336301e6fd379f55c655bea65ba2476346340a0ce6f74a1"}, - {file = "Brotli-1.0.9-cp35-cp35m-win_amd64.whl", hash = "sha256:88c63a1b55f352b02c6ffd24b15ead9fc0e8bf781dbe070213039324922a2eea"}, - {file = "Brotli-1.0.9-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:503fa6af7da9f4b5780bb7e4cbe0c639b010f12be85d02c99452825dd0feef3f"}, - {file = "Brotli-1.0.9-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:40d15c79f42e0a2c72892bf407979febd9cf91f36f495ffb333d1d04cebb34e4"}, - {file = "Brotli-1.0.9-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:93130612b837103e15ac3f9cbacb4613f9e348b58b3aad53721d92e57f96d46a"}, - {file = "Brotli-1.0.9-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87fdccbb6bb589095f413b1e05734ba492c962b4a45a13ff3408fa44ffe6479b"}, - {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:6d847b14f7ea89f6ad3c9e3901d1bc4835f6b390a9c71df999b0162d9bb1e20f"}, - {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:495ba7e49c2db22b046a53b469bbecea802efce200dffb69b93dd47397edc9b6"}, - {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:4688c1e42968ba52e57d8670ad2306fe92e0169c6f3af0089be75bbac0c64a3b"}, - {file = "Brotli-1.0.9-cp36-cp36m-win32.whl", hash = "sha256:61a7ee1f13ab913897dac7da44a73c6d44d48a4adff42a5701e3239791c96e14"}, - {file = "Brotli-1.0.9-cp36-cp36m-win_amd64.whl", hash = "sha256:1c48472a6ba3b113452355b9af0a60da5c2ae60477f8feda8346f8fd48e3e87c"}, - {file = "Brotli-1.0.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b78a24b5fd13c03ee2b7b86290ed20efdc95da75a3557cc06811764d5ad1126"}, - {file = "Brotli-1.0.9-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:9d12cf2851759b8de8ca5fde36a59c08210a97ffca0eb94c532ce7b17c6a3d1d"}, - {file = "Brotli-1.0.9-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:6c772d6c0a79ac0f414a9f8947cc407e119b8598de7621f39cacadae3cf57d12"}, - {file = "Brotli-1.0.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29d1d350178e5225397e28ea1b7aca3648fcbab546d20e7475805437bfb0a130"}, - {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7bbff90b63328013e1e8cb50650ae0b9bac54ffb4be6104378490193cd60f85a"}, - {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ec1947eabbaf8e0531e8e899fc1d9876c179fc518989461f5d24e2223395a9e3"}, - {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:12effe280b8ebfd389022aa65114e30407540ccb89b177d3fbc9a4f177c4bd5d"}, - {file = "Brotli-1.0.9-cp37-cp37m-win32.whl", hash = "sha256:f909bbbc433048b499cb9db9e713b5d8d949e8c109a2a548502fb9aa8630f0b1"}, - {file = "Brotli-1.0.9-cp37-cp37m-win_amd64.whl", hash = "sha256:97f715cf371b16ac88b8c19da00029804e20e25f30d80203417255d239f228b5"}, - {file = "Brotli-1.0.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e16eb9541f3dd1a3e92b89005e37b1257b157b7256df0e36bd7b33b50be73bcb"}, - {file = "Brotli-1.0.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:160c78292e98d21e73a4cc7f76a234390e516afcd982fa17e1422f7c6a9ce9c8"}, - {file = "Brotli-1.0.9-cp38-cp38-manylinux1_i686.whl", hash = "sha256:b663f1e02de5d0573610756398e44c130add0eb9a3fc912a09665332942a2efb"}, - {file = "Brotli-1.0.9-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5b6ef7d9f9c38292df3690fe3e302b5b530999fa90014853dcd0d6902fb59f26"}, - {file = "Brotli-1.0.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a674ac10e0a87b683f4fa2b6fa41090edfd686a6524bd8dedbd6138b309175c"}, - {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e2d9e1cbc1b25e22000328702b014227737756f4b5bf5c485ac1d8091ada078b"}, - {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b336c5e9cf03c7be40c47b5fd694c43c9f1358a80ba384a21969e0b4e66a9b17"}, - {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:85f7912459c67eaab2fb854ed2bc1cc25772b300545fe7ed2dc03954da638649"}, - {file = "Brotli-1.0.9-cp38-cp38-win32.whl", hash = "sha256:35a3edbe18e876e596553c4007a087f8bcfd538f19bc116917b3c7522fca0429"}, - {file = "Brotli-1.0.9-cp38-cp38-win_amd64.whl", hash = "sha256:269a5743a393c65db46a7bb982644c67ecba4b8d91b392403ad8a861ba6f495f"}, - {file = "Brotli-1.0.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2aad0e0baa04517741c9bb5b07586c642302e5fb3e75319cb62087bd0995ab19"}, - {file = "Brotli-1.0.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5cb1e18167792d7d21e21365d7650b72d5081ed476123ff7b8cac7f45189c0c7"}, - {file = "Brotli-1.0.9-cp39-cp39-manylinux1_i686.whl", hash = "sha256:16d528a45c2e1909c2798f27f7bf0a3feec1dc9e50948e738b961618e38b6a7b"}, - {file = "Brotli-1.0.9-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:56d027eace784738457437df7331965473f2c0da2c70e1a1f6fdbae5402e0389"}, - {file = "Brotli-1.0.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bf919756d25e4114ace16a8ce91eb340eb57a08e2c6950c3cebcbe3dff2a5e7"}, - {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e4c4e92c14a57c9bd4cb4be678c25369bf7a092d55fd0866f759e425b9660806"}, - {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e48f4234f2469ed012a98f4b7874e7f7e173c167bed4934912a29e03167cf6b1"}, - {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9ed4c92a0665002ff8ea852353aeb60d9141eb04109e88928026d3c8a9e5433c"}, - {file = "Brotli-1.0.9-cp39-cp39-win32.whl", hash = "sha256:cfc391f4429ee0a9370aa93d812a52e1fee0f37a81861f4fdd1f4fb28e8547c3"}, - {file = "Brotli-1.0.9-cp39-cp39-win_amd64.whl", hash = "sha256:854c33dad5ba0fbd6ab69185fec8dab89e13cda6b7d191ba111987df74f38761"}, - {file = "Brotli-1.0.9-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9749a124280a0ada4187a6cfd1ffd35c350fb3af79c706589d98e088c5044267"}, - {file = "Brotli-1.0.9-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:73fd30d4ce0ea48010564ccee1a26bfe39323fde05cb34b5863455629db61dc7"}, - {file = "Brotli-1.0.9-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:02177603aaca36e1fd21b091cb742bb3b305a569e2402f1ca38af471777fb019"}, - {file = "Brotli-1.0.9-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:76ffebb907bec09ff511bb3acc077695e2c32bc2142819491579a695f77ffd4d"}, - {file = "Brotli-1.0.9-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b43775532a5904bc938f9c15b77c613cb6ad6fb30990f3b0afaea82797a402d8"}, - {file = "Brotli-1.0.9-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5bf37a08493232fbb0f8229f1824b366c2fc1d02d64e7e918af40acd15f3e337"}, - {file = "Brotli-1.0.9-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:330e3f10cd01da535c70d09c4283ba2df5fb78e915bea0a28becad6e2ac010be"}, - {file = "Brotli-1.0.9-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e1abbeef02962596548382e393f56e4c94acd286bd0c5afba756cffc33670e8a"}, - {file = "Brotli-1.0.9-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3148362937217b7072cf80a2dcc007f09bb5ecb96dae4617316638194113d5be"}, - {file = "Brotli-1.0.9-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:336b40348269f9b91268378de5ff44dc6fbaa2268194f85177b53463d313842a"}, - {file = "Brotli-1.0.9-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b8b09a16a1950b9ef495a0f8b9d0a87599a9d1f179e2d4ac014b2ec831f87e7"}, - {file = "Brotli-1.0.9-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c8e521a0ce7cf690ca84b8cc2272ddaf9d8a50294fd086da67e517439614c755"}, - {file = "Brotli-1.0.9.zip", hash = "sha256:4d1b810aa0ed773f81dceda2cc7b403d01057458730e309856356d4ef4188438"}, + {file = "Brotli-1.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1140c64812cb9b06c922e77f1c26a75ec5e3f0fb2bf92cc8c58720dec276752"}, + {file = "Brotli-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c8fd5270e906eef71d4a8d19b7c6a43760c6abcfcc10c9101d14eb2357418de9"}, + {file = "Brotli-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ae56aca0402a0f9a3431cddda62ad71666ca9d4dc3a10a142b9dce2e3c0cda3"}, + {file = "Brotli-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:43ce1b9935bfa1ede40028054d7f48b5469cd02733a365eec8a329ffd342915d"}, + {file = "Brotli-1.1.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7c4855522edb2e6ae7fdb58e07c3ba9111e7621a8956f481c68d5d979c93032e"}, + {file = "Brotli-1.1.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:38025d9f30cf4634f8309c6874ef871b841eb3c347e90b0851f63d1ded5212da"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e6a904cb26bfefc2f0a6f240bdf5233be78cd2488900a2f846f3c3ac8489ab80"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a37b8f0391212d29b3a91a799c8e4a2855e0576911cdfb2515487e30e322253d"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e84799f09591700a4154154cab9787452925578841a94321d5ee8fb9a9a328f0"}, + {file = "Brotli-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f66b5337fa213f1da0d9000bc8dc0cb5b896b726eefd9c6046f699b169c41b9e"}, + {file = "Brotli-1.1.0-cp310-cp310-win32.whl", hash = "sha256:be36e3d172dc816333f33520154d708a2657ea63762ec16b62ece02ab5e4daf2"}, + {file = "Brotli-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:0c6244521dda65ea562d5a69b9a26120769b7a9fb3db2fe9545935ed6735b128"}, + {file = "Brotli-1.1.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a3daabb76a78f829cafc365531c972016e4aa8d5b4bf60660ad8ecee19df7ccc"}, + {file = "Brotli-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c8146669223164fc87a7e3de9f81e9423c67a79d6b3447994dfb9c95da16e2d6"}, + {file = "Brotli-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:30924eb4c57903d5a7526b08ef4a584acc22ab1ffa085faceb521521d2de32dd"}, + {file = "Brotli-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ceb64bbc6eac5a140ca649003756940f8d6a7c444a68af170b3187623b43bebf"}, + {file = "Brotli-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a469274ad18dc0e4d316eefa616d1d0c2ff9da369af19fa6f3daa4f09671fd61"}, + {file = "Brotli-1.1.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:524f35912131cc2cabb00edfd8d573b07f2d9f21fa824bd3fb19725a9cf06327"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5b3cc074004d968722f51e550b41a27be656ec48f8afaeeb45ebf65b561481dd"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:19c116e796420b0cee3da1ccec3b764ed2952ccfcc298b55a10e5610ad7885f9"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:510b5b1bfbe20e1a7b3baf5fed9e9451873559a976c1a78eebaa3b86c57b4265"}, + {file = "Brotli-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a1fd8a29719ccce974d523580987b7f8229aeace506952fa9ce1d53a033873c8"}, + {file = "Brotli-1.1.0-cp311-cp311-win32.whl", hash = "sha256:39da8adedf6942d76dc3e46653e52df937a3c4d6d18fdc94a7c29d263b1f5b50"}, + {file = "Brotli-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:aac0411d20e345dc0920bdec5548e438e999ff68d77564d5e9463a7ca9d3e7b1"}, + {file = "Brotli-1.1.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:316cc9b17edf613ac76b1f1f305d2a748f1b976b033b049a6ecdfd5612c70409"}, + {file = "Brotli-1.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:caf9ee9a5775f3111642d33b86237b05808dafcd6268faa492250e9b78046eb2"}, + {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70051525001750221daa10907c77830bc889cb6d865cc0b813d9db7fefc21451"}, + {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7f4bf76817c14aa98cc6697ac02f3972cb8c3da93e9ef16b9c66573a68014f91"}, + {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0c5516f0aed654134a2fc936325cc2e642f8a0e096d075209672eb321cff408"}, + {file = "Brotli-1.1.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6c3020404e0b5eefd7c9485ccf8393cfb75ec38ce75586e046573c9dc29967a0"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4ed11165dd45ce798d99a136808a794a748d5dc38511303239d4e2363c0695dc"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:4093c631e96fdd49e0377a9c167bfd75b6d0bad2ace734c6eb20b348bc3ea180"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e4c4629ddad63006efa0ef968c8e4751c5868ff0b1c5c40f76524e894c50248"}, + {file = "Brotli-1.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:861bf317735688269936f755fa136a99d1ed526883859f86e41a5d43c61d8966"}, + {file = "Brotli-1.1.0-cp312-cp312-win32.whl", hash = "sha256:5f4d5ea15c9382135076d2fb28dde923352fe02951e66935a9efaac8f10e81b0"}, + {file = "Brotli-1.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:906bc3a79de8c4ae5b86d3d75a8b77e44404b0f4261714306e3ad248d8ab0951"}, + {file = "Brotli-1.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a090ca607cbb6a34b0391776f0cb48062081f5f60ddcce5d11838e67a01928d1"}, + {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2de9d02f5bda03d27ede52e8cfe7b865b066fa49258cbab568720aa5be80a47d"}, + {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2333e30a5e00fe0fe55903c8832e08ee9c3b1382aacf4db26664a16528d51b4b"}, + {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4d4a848d1837973bf0f4b5e54e3bec977d99be36a7895c61abb659301b02c112"}, + {file = "Brotli-1.1.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:fdc3ff3bfccdc6b9cc7c342c03aa2400683f0cb891d46e94b64a197910dc4064"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:5eeb539606f18a0b232d4ba45adccde4125592f3f636a6182b4a8a436548b914"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:fd5f17ff8f14003595ab414e45fce13d073e0762394f957182e69035c9f3d7c2"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:069a121ac97412d1fe506da790b3e69f52254b9df4eb665cd42460c837193354"}, + {file = "Brotli-1.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e93dfc1a1165e385cc8239fab7c036fb2cd8093728cbd85097b284d7b99249a2"}, + {file = "Brotli-1.1.0-cp36-cp36m-win32.whl", hash = "sha256:a599669fd7c47233438a56936988a2478685e74854088ef5293802123b5b2460"}, + {file = "Brotli-1.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d143fd47fad1db3d7c27a1b1d66162e855b5d50a89666af46e1679c496e8e579"}, + {file = "Brotli-1.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:11d00ed0a83fa22d29bc6b64ef636c4552ebafcef57154b4ddd132f5638fbd1c"}, + {file = "Brotli-1.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f733d788519c7e3e71f0855c96618720f5d3d60c3cb829d8bbb722dddce37985"}, + {file = "Brotli-1.1.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:929811df5462e182b13920da56c6e0284af407d1de637d8e536c5cd00a7daf60"}, + {file = "Brotli-1.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0b63b949ff929fbc2d6d3ce0e924c9b93c9785d877a21a1b678877ffbbc4423a"}, + {file = "Brotli-1.1.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d192f0f30804e55db0d0e0a35d83a9fead0e9a359a9ed0285dbacea60cc10a84"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f296c40e23065d0d6650c4aefe7470d2a25fffda489bcc3eb66083f3ac9f6643"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:919e32f147ae93a09fe064d77d5ebf4e35502a8df75c29fb05788528e330fe74"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:23032ae55523cc7bccb4f6a0bf368cd25ad9bcdcc1990b64a647e7bbcce9cb5b"}, + {file = "Brotli-1.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:224e57f6eac61cc449f498cc5f0e1725ba2071a3d4f48d5d9dffba42db196438"}, + {file = "Brotli-1.1.0-cp37-cp37m-win32.whl", hash = "sha256:587ca6d3cef6e4e868102672d3bd9dc9698c309ba56d41c2b9c85bbb903cdb95"}, + {file = "Brotli-1.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2954c1c23f81c2eaf0b0717d9380bd348578a94161a65b3a2afc62c86467dd68"}, + {file = "Brotli-1.1.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:efa8b278894b14d6da122a72fefcebc28445f2d3f880ac59d46c90f4c13be9a3"}, + {file = "Brotli-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:03d20af184290887bdea3f0f78c4f737d126c74dc2f3ccadf07e54ceca3bf208"}, + {file = "Brotli-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6172447e1b368dcbc458925e5ddaf9113477b0ed542df258d84fa28fc45ceea7"}, + {file = "Brotli-1.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a743e5a28af5f70f9c080380a5f908d4d21d40e8f0e0c8901604d15cfa9ba751"}, + {file = "Brotli-1.1.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0541e747cce78e24ea12d69176f6a7ddb690e62c425e01d31cc065e69ce55b48"}, + {file = "Brotli-1.1.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cdbc1fc1bc0bff1cef838eafe581b55bfbffaed4ed0318b724d0b71d4d377619"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:890b5a14ce214389b2cc36ce82f3093f96f4cc730c1cffdbefff77a7c71f2a97"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ab4fbee0b2d9098c74f3057b2bc055a8bd92ccf02f65944a241b4349229185a"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:141bd4d93984070e097521ed07e2575b46f817d08f9fa42b16b9b5f27b5ac088"}, + {file = "Brotli-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fce1473f3ccc4187f75b4690cfc922628aed4d3dd013d047f95a9b3919a86596"}, + {file = "Brotli-1.1.0-cp38-cp38-win32.whl", hash = "sha256:db85ecf4e609a48f4b29055f1e144231b90edc90af7481aa731ba2d059226b1b"}, + {file = "Brotli-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:3d7954194c36e304e1523f55d7042c59dc53ec20dd4e9ea9d151f1b62b4415c0"}, + {file = "Brotli-1.1.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5fb2ce4b8045c78ebbc7b8f3c15062e435d47e7393cc57c25115cfd49883747a"}, + {file = "Brotli-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7905193081db9bfa73b1219140b3d315831cbff0d8941f22da695832f0dd188f"}, + {file = "Brotli-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a77def80806c421b4b0af06f45d65a136e7ac0bdca3c09d9e2ea4e515367c7e9"}, + {file = "Brotli-1.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dadd1314583ec0bf2d1379f7008ad627cd6336625d6679cf2f8e67081b83acf"}, + {file = "Brotli-1.1.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:901032ff242d479a0efa956d853d16875d42157f98951c0230f69e69f9c09bac"}, + {file = "Brotli-1.1.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:22fc2a8549ffe699bfba2256ab2ed0421a7b8fadff114a3d201794e45a9ff578"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ae15b066e5ad21366600ebec29a7ccbc86812ed267e4b28e860b8ca16a2bc474"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:949f3b7c29912693cee0afcf09acd6ebc04c57af949d9bf77d6101ebb61e388c"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:89f4988c7203739d48c6f806f1e87a1d96e0806d44f0fba61dba81392c9e474d"}, + {file = "Brotli-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:de6551e370ef19f8de1807d0a9aa2cdfdce2e85ce88b122fe9f6b2b076837e59"}, + {file = "Brotli-1.1.0-cp39-cp39-win32.whl", hash = "sha256:f0d8a7a6b5983c2496e364b969f0e526647a06b075d034f3297dc66f3b360c64"}, + {file = "Brotli-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:cdad5b9014d83ca68c25d2e9444e28e967ef16e80f6b436918c700c117a85467"}, + {file = "Brotli-1.1.0.tar.gz", hash = "sha256:81de08ac11bcb85841e440c13611c00b67d3bf82698314928d0b676362546724"}, ] [[package]] name = "brotlicffi" -version = "1.0.9.2" +version = "1.1.0.0" description = "Python CFFI bindings to the Brotli library" optional = true -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "brotlicffi-1.0.9.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:408ec4359f9763280d5c4e0ad29c51d1240b25fdd18719067e972163b4125b98"}, - {file = "brotlicffi-1.0.9.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:2e4629f7690ded66c8818715c6d4dd6a7ff6a4f10fad6186fe99850f781ce210"}, - {file = "brotlicffi-1.0.9.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:137c4635edcdf593de5ce9d0daa596bf499591b16b8fca5fd72a490deb54b2ee"}, - {file = "brotlicffi-1.0.9.2-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:af8a1b7bcfccf9c41a3c8654994d6a81821fdfe4caddcfe5045bfda936546ca3"}, - {file = "brotlicffi-1.0.9.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9078432af4785f35ab3840587eed7fb131e3fc77eb2a739282b649b343c584dd"}, - {file = "brotlicffi-1.0.9.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7bb913d5bf3b4ce2ec59872711dc9faaff5f320c3c3827cada2d8a7b793a7753"}, - {file = "brotlicffi-1.0.9.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:16a0c9392a1059e2e62839fbd037d2e7e03c8ae5da65e9746f582464f7fab1bb"}, - {file = "brotlicffi-1.0.9.2-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:94d2810efc5723f1447b332223b197466190518a3eeca93b9f357efb5b22c6dc"}, - {file = "brotlicffi-1.0.9.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:9e70f3e20f317d70912b10dbec48b29114d3dbd0e9d88475cb328e6c086f0546"}, - {file = "brotlicffi-1.0.9.2-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:586f0ea3c2eed455d5f2330b9ab4a591514c8de0ee53d445645efcfbf053c69f"}, - {file = "brotlicffi-1.0.9.2-cp35-abi3-manylinux1_i686.whl", hash = "sha256:4454c3baedc277fd6e65f983e3eb8e77f4bc15060f69370a0201746e2edeca81"}, - {file = "brotlicffi-1.0.9.2-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:52c1c12dad6eb1d44213a0a76acf5f18f64653bd801300bef5e2f983405bdde5"}, - {file = "brotlicffi-1.0.9.2-cp35-abi3-manylinux2010_i686.whl", hash = "sha256:21cd400d24b344c218d8e32b394849e31b7c15784667575dbda9f65c46a64b0a"}, - {file = "brotlicffi-1.0.9.2-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:71061f8bc86335b652e442260c4367b782a92c6e295cf5a10eff84c7d19d8cf5"}, - {file = "brotlicffi-1.0.9.2-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:15e0db52c56056be6310fc116b3d7c6f34185594e261f23790b2fb6489998363"}, - {file = "brotlicffi-1.0.9.2-cp35-abi3-win32.whl", hash = "sha256:551305703d12a2dd1ae43d3dde35dee20b1cb49b5796279d4d34e2c6aec6be4d"}, - {file = "brotlicffi-1.0.9.2-cp35-abi3-win_amd64.whl", hash = "sha256:2be4fb8a7cb482f226af686cd06d2a2cab164ccdf99e460f8e3a5ec9a5337da2"}, - {file = "brotlicffi-1.0.9.2-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:8e7221d8a084d32d15c7b58e0ce0573972375c5038423dbe83f217cfe512e680"}, - {file = "brotlicffi-1.0.9.2-pp27-pypy_73-manylinux1_x86_64.whl", hash = "sha256:75a46bc5ed2753e1648cc211dcb2c1ac66116038766822dc104023f67ff4dfd8"}, - {file = "brotlicffi-1.0.9.2-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:1e27c43ef72a278f9739b12b2df80ee72048cd4cbe498f8bbe08aaaa67a5d5c8"}, - {file = "brotlicffi-1.0.9.2-pp27-pypy_73-win32.whl", hash = "sha256:feb942814285bdc5e97efc77a04e48283c17dfab9ea082d79c0a7b9e53ef1eab"}, - {file = "brotlicffi-1.0.9.2-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a6208d82c3172eeeb3be83ed4efd5831552c7cd47576468e50fcf0fb23fcf97f"}, - {file = "brotlicffi-1.0.9.2-pp36-pypy36_pp73-manylinux1_x86_64.whl", hash = "sha256:408c810c599786fb806556ff17e844a903884e6370ca400bcec7fa286149f39c"}, - {file = "brotlicffi-1.0.9.2-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:a73099858ee343e8801710a08be8d194f47715ff21e98d92a19ac461058f52d1"}, - {file = "brotlicffi-1.0.9.2-pp36-pypy36_pp73-win32.whl", hash = "sha256:916b790f967a18a595e61f218c252f83718ac91f24157d622cf0fa710cd26ab7"}, - {file = "brotlicffi-1.0.9.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ba4a00263af40e875ec3d6c7f623cbf8c795b55705da18c64ec36b6bf0848bc5"}, - {file = "brotlicffi-1.0.9.2-pp37-pypy37_pp73-manylinux1_x86_64.whl", hash = "sha256:df78aa47741122b0d5463f1208b7bb18bc9706dee5152d9f56e0ead4865015cd"}, - {file = "brotlicffi-1.0.9.2-pp37-pypy37_pp73-manylinux2010_x86_64.whl", hash = "sha256:9030cd5099252d16bfa4e22659c84a89c102e94f8e81d30764788b72e2d7cfb7"}, - {file = "brotlicffi-1.0.9.2-pp37-pypy37_pp73-win32.whl", hash = "sha256:7e72978f4090a161885b114f87b784f538dcb77dafc6602592c1cf39ae8d243d"}, - {file = "brotlicffi-1.0.9.2.tar.gz", hash = "sha256:0c248a68129d8fc6a217767406c731e498c3e19a7be05ea0a90c3c86637b7d96"}, + {file = "brotlicffi-1.1.0.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9b7ae6bd1a3f0df532b6d67ff674099a96d22bc0948955cb338488c31bfb8851"}, + {file = "brotlicffi-1.1.0.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19ffc919fa4fc6ace69286e0a23b3789b4219058313cf9b45625016bf7ff996b"}, + {file = "brotlicffi-1.1.0.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9feb210d932ffe7798ee62e6145d3a757eb6233aa9a4e7db78dd3690d7755814"}, + {file = "brotlicffi-1.1.0.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84763dbdef5dd5c24b75597a77e1b30c66604725707565188ba54bab4f114820"}, + {file = "brotlicffi-1.1.0.0-cp37-abi3-win32.whl", hash = "sha256:1b12b50e07c3911e1efa3a8971543e7648100713d4e0971b13631cce22c587eb"}, + {file = "brotlicffi-1.1.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:994a4f0681bb6c6c3b0925530a1926b7a189d878e6e5e38fae8efa47c5d9c613"}, + {file = "brotlicffi-1.1.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2e4aeb0bd2540cb91b069dbdd54d458da8c4334ceaf2d25df2f4af576d6766ca"}, + {file = "brotlicffi-1.1.0.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b7b0033b0d37bb33009fb2fef73310e432e76f688af76c156b3594389d81391"}, + {file = "brotlicffi-1.1.0.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:54a07bb2374a1eba8ebb52b6fafffa2afd3c4df85ddd38fcc0511f2bb387c2a8"}, + {file = "brotlicffi-1.1.0.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7901a7dc4b88f1c1475de59ae9be59799db1007b7d059817948d8e4f12e24e35"}, + {file = "brotlicffi-1.1.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ce01c7316aebc7fce59da734286148b1d1b9455f89cf2c8a4dfce7d41db55c2d"}, + {file = "brotlicffi-1.1.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:246f1d1a90279bb6069de3de8d75a8856e073b8ff0b09dcca18ccc14cec85979"}, + {file = "brotlicffi-1.1.0.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc4bc5d82bc56ebd8b514fb8350cfac4627d6b0743382e46d033976a5f80fab6"}, + {file = "brotlicffi-1.1.0.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c26ecb14386a44b118ce36e546ce307f4810bc9598a6e6cb4f7fca725ae7e6"}, + {file = "brotlicffi-1.1.0.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca72968ae4eaf6470498d5c2887073f7efe3b1e7d7ec8be11a06a79cc810e990"}, + {file = "brotlicffi-1.1.0.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:add0de5b9ad9e9aa293c3aa4e9deb2b61e99ad6c1634e01d01d98c03e6a354cc"}, + {file = "brotlicffi-1.1.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9b6068e0f3769992d6b622a1cd2e7835eae3cf8d9da123d7f51ca9c1e9c333e5"}, + {file = "brotlicffi-1.1.0.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8557a8559509b61e65083f8782329188a250102372576093c88930c875a69838"}, + {file = "brotlicffi-1.1.0.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a7ae37e5d79c5bdfb5b4b99f2715a6035e6c5bf538c3746abc8e26694f92f33"}, + {file = "brotlicffi-1.1.0.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:391151ec86bb1c683835980f4816272a87eaddc46bb91cbf44f62228b84d8cca"}, + {file = "brotlicffi-1.1.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:2f3711be9290f0453de8eed5275d93d286abe26b08ab4a35d7452caa1fef532f"}, + {file = "brotlicffi-1.1.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1a807d760763e398bbf2c6394ae9da5815901aa93ee0a37bca5efe78d4ee3171"}, + {file = "brotlicffi-1.1.0.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa8ca0623b26c94fccc3a1fdd895be1743b838f3917300506d04aa3346fd2a14"}, + {file = "brotlicffi-1.1.0.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3de0cf28a53a3238b252aca9fed1593e9d36c1d116748013339f0949bfc84112"}, + {file = "brotlicffi-1.1.0.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6be5ec0e88a4925c91f3dea2bb0013b3a2accda6f77238f76a34a1ea532a1cb0"}, + {file = "brotlicffi-1.1.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d9eb71bb1085d996244439154387266fd23d6ad37161f6f52f1cd41dd95a3808"}, + {file = "brotlicffi-1.1.0.0.tar.gz", hash = "sha256:b77827a689905143f87915310b93b273ab17888fd43ef350d4832c4a71083c13"}, ] [package.dependencies] @@ -956,43 +946,47 @@ dev = ["black (>=20.8b1)", "codecov", "coverage", "cython (>=0.25)", "ffn (>=0.3 [[package]] name = "cachetools" -version = "5.3.1" +version = "5.3.3" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" files = [ - {file = "cachetools-5.3.1-py3-none-any.whl", hash = "sha256:95ef631eeaea14ba2e36f06437f36463aac3a096799e876ee55e5cdccb102590"}, - {file = "cachetools-5.3.1.tar.gz", hash = "sha256:dce83f2d9b4e1f732a8cd44af8e8fab2dbe46201467fc98b3ef8f269092bf62b"}, + {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, + {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, ] [[package]] name = "catboost" -version = "1.2" +version = "1.2.5" description = "CatBoost Python Package" optional = true python-versions = "*" files = [ - {file = "catboost-1.2-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:b7ff06dd4e72ba5ba2d827d0870080485dcd91dfb30b820e377f6a634258c47a"}, - {file = "catboost-1.2-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:93a9ef21b3b1817e6480854f40f0a2daad8393ee92b0b46b952db4097be46855"}, - {file = "catboost-1.2-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:bfcb35e91b6fe42dcc92614d02f13dc47a4484ca5162de84a04c09244085d8d3"}, - {file = "catboost-1.2-cp310-cp310-win_amd64.whl", hash = "sha256:788e617712c8730e7edebac5c8efafd693097ba81b38c1992894e74702b8904e"}, - {file = "catboost-1.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:983c7ec6654baddf19c574a72cfa53e926e89e5ab48941b3bc94c06edca38a49"}, - {file = "catboost-1.2-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:96873ffbf8913457845926221e607aabfabcad2f40615a9d21a7ec1d65bcb8da"}, - {file = "catboost-1.2-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:a0236f6328e33f1e2e5fd6ca619ea5f8759ade06d709bd9c706443b20525fada"}, - {file = "catboost-1.2-cp311-cp311-win_amd64.whl", hash = "sha256:51d0a826b8d77ce4de43a861786a11aa3e6ea7a40b7e3ef5ae085893324d86db"}, - {file = "catboost-1.2-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:aaa3b90b76e7d6feff9955732b06fe3d2646e6bd5a0072d97ccc92fa8f6ef107"}, - {file = "catboost-1.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cf432f9d72b6c2f5cfa91b178e1e85cc627365dd90326ef2970e3ac12254e27f"}, - {file = "catboost-1.2-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:24346ceafcc3225b70ead73fbe19248c2869a4ef0d1d671bf9a8140ed4ab3c91"}, - {file = "catboost-1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:33283992ccd673e3e39d0f71d34c7249cc6deeb1a1e0abfef3d545405c29d417"}, - {file = "catboost-1.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:32b5577dbf509e0d736da9c6b63324a235a1d895b0873307e4a290c194fa5eac"}, - {file = "catboost-1.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:475932765e16e812692b84bae5bfccb9612b12d52c8e936163fd9c70cb279c59"}, - {file = "catboost-1.2-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:30dd2241cf487eb3f06d7c33a807e2eb35b20367268161c08b4c047d7185a8a0"}, - {file = "catboost-1.2-cp38-cp38-win_amd64.whl", hash = "sha256:e616148b739527dcf02945744ea98ecb3c9619098f1b9bf4f83b77158a6fb764"}, - {file = "catboost-1.2-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:de0c55196ab95c6d0245d8c15cd8ec2b82eca6043c4554282809d0301e799654"}, - {file = "catboost-1.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:601a9cdfd5fd8663da39c080213ac69241734b8d4120de3b0d60f3af35c1c4b0"}, - {file = "catboost-1.2-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:234ce778e278757ff7de2b5b2513953bf7877ceb1c477fe8176a279d24931520"}, - {file = "catboost-1.2-cp39-cp39-win_amd64.whl", hash = "sha256:bc67c9ccf1cd61a23eb0f52e255eb787c2752d7fd982c6e257c82a451260084b"}, - {file = "catboost-1.2.tar.gz", hash = "sha256:39e53403727ecfbb48156773ef3006b4e71cc35ab49cc9a0cf044b474c34be0c"}, + {file = "catboost-1.2.5-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:d266bcd87e7afa8c8c4cae1dbdb66f9487368ee2c1d2bbcefda0cbff7cb48ac4"}, + {file = "catboost-1.2.5-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:4143449dae1efc2752cbde2537b90611f36716e4e1e6827fc6856d07de16b431"}, + {file = "catboost-1.2.5-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:a92da61e95919b03d611045f0f3373799deec6f8192d7d1211714a21ff0da65e"}, + {file = "catboost-1.2.5-cp310-cp310-win_amd64.whl", hash = "sha256:ad6ae9387759ca121042db60f4c73014027cb160a9dde1f52d353ca18b471e7c"}, + {file = "catboost-1.2.5-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:68dc17e6850f1ad8256fbbfbfac2c26b7be291c78b0961b135adf3aa6ed503bf"}, + {file = "catboost-1.2.5-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:b6e1617b57deca52c8880ec2439d0fb514d7e9f78479bae8dbfbd2f95bb3b28e"}, + {file = "catboost-1.2.5-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:9e0aac17d1a25e0f67770ba7362c6275db611ebb5dc6179daed84f55c3db976c"}, + {file = "catboost-1.2.5-cp311-cp311-win_amd64.whl", hash = "sha256:901bf56e43334ce42f45b5c62fab1d8a14d54160b6da0645c798b7b7ad415da1"}, + {file = "catboost-1.2.5-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:82a321ba006abdeae9beb6e53c2d407b0eaaeadb4c1b56de1344f693e7512d08"}, + {file = "catboost-1.2.5-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:4180fe03d110acf44d09df7e3fd8e1ef62bfd3ac22ce90185332f52e24e96ac9"}, + {file = "catboost-1.2.5-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:e1925714d40a2a0d9fd086c33f2a668610c07630201527018f3f17a3d530c464"}, + {file = "catboost-1.2.5-cp312-cp312-win_amd64.whl", hash = "sha256:f13acbcf2f3639d3d06808428db3207c7d776314041619cc32578927ec752221"}, + {file = "catboost-1.2.5-cp37-cp37m-macosx_11_0_universal2.whl", hash = "sha256:1d8b06333495a90192618ddc4b0ea15186a35a53f55b7743e4c9758de1bb785d"}, + {file = "catboost-1.2.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:87a556dfdad702d958b2f7bb1b6fc8bee4b1bf9bf3e7736aac3f70cb9522d53a"}, + {file = "catboost-1.2.5-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:d0db06d11dd9446bcb1cd1417bced0c4f956abe3f50f72df79f1b2b6789a6bde"}, + {file = "catboost-1.2.5-cp37-cp37m-win_amd64.whl", hash = "sha256:a1149bedba20fff940ece5ddd8e56420ebe26850b23533dfc6e5e4994049d220"}, + {file = "catboost-1.2.5-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:6e3a9bd84c3a92f7cab0a9c3451df21d930f4ebb4716f85513b4feac2b0ef209"}, + {file = "catboost-1.2.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:51acfea3bf141d25e3bc43e8dfc505920a8e701cb06c8d4164661a118e3e1178"}, + {file = "catboost-1.2.5-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:6acfc79e2be02b34caa26a339ace52c5991b1d9862dcb94f5ced1bd9ca9a8c18"}, + {file = "catboost-1.2.5-cp38-cp38-win_amd64.whl", hash = "sha256:dabd1ea1bda91f72792b7f348d0301e637f98251fc4d50b62ffc872721997f47"}, + {file = "catboost-1.2.5-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:ed9521ce617f370dd7f8214f6b5ea2cdb2bfb47a2be0fb19a03b7c9d4399b4d1"}, + {file = "catboost-1.2.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:6cd81cb508031cb5feccdecb6f309fc9562b7114bc82fa06c17ffdbdb079198c"}, + {file = "catboost-1.2.5-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:86e05596a5330de7a8376f344079c3333fd3254e4300549654e343703f7315b0"}, + {file = "catboost-1.2.5-cp39-cp39-win_amd64.whl", hash = "sha256:c75f57b1df9893d67ed8f04c32d5e8fe3d591ee873a94a2ff8279e32549397b0"}, + {file = "catboost-1.2.5.tar.gz", hash = "sha256:12c31650fa55944e9ab5863d4eef194533914920c358b52a7a7d7b0b855cba9f"}, ] [package.dependencies] @@ -1034,13 +1028,13 @@ ujson = ["ujson (>=5.4.0,<6.0.0)"] [[package]] name = "ccxt" -version = "4.0.33" -description = "A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 130+ exchanges" +version = "4.3.2" +description = "A JavaScript / TypeScript / Python / C# / PHP cryptocurrency trading library with support for 100+ exchanges" optional = false python-versions = "*" files = [ - {file = "ccxt-4.0.33-py2.py3-none-any.whl", hash = "sha256:79985862f5d8c1f3ddff15e49fa8ac0bd4aac5b41fb6ef4c649caa76fc6dc44d"}, - {file = "ccxt-4.0.33.tar.gz", hash = "sha256:f9ac6db84823dfa98d45999ea41d629b8496b7e9c3fccae8b8624f95b7c3ea4a"}, + {file = "ccxt-4.3.2-py2.py3-none-any.whl", hash = "sha256:63f99e173be9f8f95042932db5c008a6c83845978542f3015f83b7fdc939a1e2"}, + {file = "ccxt-4.3.2.tar.gz", hash = "sha256:af3de8ed05c9dba192b0db9b1f1387a1c5ae5c5fb602630d48ef90a9d7949b1d"}, ] [package.dependencies] @@ -1050,93 +1044,83 @@ certifi = ">=2018.1.18" cryptography = ">=2.6.1" requests = ">=2.18.4" setuptools = ">=60.9.0" +typing-extensions = ">=4.4.0" yarl = {version = ">=1.7.2", markers = "python_version >= \"3.5.2\""} [package.extras] -qa = ["flake8 (==3.7.9)"] +qa = ["ruff (==0.0.292)", "tox (>=4.8.0)"] +type = ["mypy (==1.6.1)"] [[package]] name = "certifi" -version = "2023.5.7" +version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, - {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, ] [[package]] name = "cffi" -version = "1.15.1" +version = "1.16.0" description = "Foreign Function Interface for Python calling C code." optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, ] [package.dependencies] @@ -1144,108 +1128,144 @@ pycparser = "*" [[package]] name = "cfgv" -version = "3.3.1" +version = "3.4.0" description = "Validate configuration and produce human readable error messages." optional = false -python-versions = ">=3.6.1" +python-versions = ">=3.8" files = [ - {file = "cfgv-3.3.1-py2.py3-none-any.whl", hash = "sha256:c6a0883f3917a037485059700b9e75da2464e6c27051014ad85ba6aaa5884426"}, - {file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"}, + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, ] [[package]] name = "charset-normalizer" -version = "3.2.0" +version = "3.3.2" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7.0" files = [ - {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, - {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, ] +[[package]] +name = "clarabel" +version = "0.7.1" +description = "Clarabel Conic Interior Point Solver for Rust / Python" +optional = true +python-versions = ">=3.7" +files = [ + {file = "clarabel-0.7.1-cp37-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:32980b578842d17abe3d277df2d31a6b8bff3facf33b169c74d59b2ada10b61b"}, + {file = "clarabel-0.7.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b4d414b9db040effa186f9e048de2c7d3e38b6edcadaaa2432a52b6451ba9999"}, + {file = "clarabel-0.7.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec0fde90a467e07010176b0bd159ab8cb11c59c8ff0a09580af1ac77d7861971"}, + {file = "clarabel-0.7.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:754e2681eb74e7f6fc35612ae58219d76819a0bc1b67771752b6f5425f72c1f8"}, + {file = "clarabel-0.7.1-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:33283d190f1e2a3b8559c928f0eb0d1fefc45aad334fd0566cdf5eaa94606a13"}, + {file = "clarabel-0.7.1-cp37-abi3-win32.whl", hash = "sha256:519f9b1daba08f909c106da8b5fd52937cfbc4ba27086c4cbd9728d168cfbc5c"}, + {file = "clarabel-0.7.1-cp37-abi3-win_amd64.whl", hash = "sha256:33faf5a02465eb5f7f7380d892ce3cf1d293a3efefcea18d637c618f012f5f36"}, + {file = "clarabel-0.7.1.tar.gz", hash = "sha256:a30ab135f475c5bc78329fd7df575291155e6055bcaf02124eb610b8ad176396"}, +] + +[package.dependencies] +numpy = "*" +scipy = "*" + [[package]] name = "click" -version = "8.1.6" +version = "8.1.7" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.7" files = [ - {file = "click-8.1.6-py3-none-any.whl", hash = "sha256:fa244bb30b3b5ee2cae3da8f55c9e5e0c0e86093306301fb418eb9dc40fbded5"}, - {file = "click-8.1.6.tar.gz", hash = "sha256:48ee849951919527a045bfe3bf7baa8a959c423134e1a5b98c05c20ba75a1cbd"}, + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, ] [package.dependencies] @@ -1253,49 +1273,50 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "cloudpickle" -version = "2.2.1" -description = "Extended pickling support for Python objects" +version = "3.0.0" +description = "Pickler class to extend the standard pickle.Pickler functionality" optional = true -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "cloudpickle-2.2.1-py3-none-any.whl", hash = "sha256:61f594d1f4c295fa5cd9014ceb3a1fc4a70b0de1164b94fbc2d854ccba056f9f"}, - {file = "cloudpickle-2.2.1.tar.gz", hash = "sha256:d89684b8de9e34a2a43b3460fbca07d09d6e25ce858df4d5a44240403b6178f5"}, + {file = "cloudpickle-3.0.0-py3-none-any.whl", hash = "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7"}, + {file = "cloudpickle-3.0.0.tar.gz", hash = "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882"}, ] [[package]] name = "cmdstanpy" -version = "1.1.0" +version = "1.2.2" description = "Python interface to CmdStan" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "cmdstanpy-1.1.0-py3-none-any.whl", hash = "sha256:ebceb2255855827bb512bb1e402388e38f4a705ebf71831b97cbfbb3e61fc38a"}, - {file = "cmdstanpy-1.1.0.tar.gz", hash = "sha256:c2312ca93e0444d771973ca17ef4c84c0fd06570c8912daae4c6e7c869272d6b"}, + {file = "cmdstanpy-1.2.2-py3-none-any.whl", hash = "sha256:b18cf61f9cae6babf4b26ab06a2c3572a64fc7781017ededdfa073430f8e29eb"}, + {file = "cmdstanpy-1.2.2.tar.gz", hash = "sha256:09bcadd54a582090d722ba3e76d516db696275ab861ef71805195d0df2dd34a9"}, ] [package.dependencies] numpy = ">=1.21" pandas = "*" +stanio = ">=0.4.0,<2.0.0" tqdm = "*" [package.extras] all = ["xarray"] -docs = ["matplotlib", "numpydoc", "sphinx", "sphinx-gallery", "sphinx-rtd-theme"] -tests = ["flake8", "mypy", "pylint", "pytest", "pytest-cov", "pytest-order", "tqdm", "xarray"] +docs = ["ipykernel", "ipython", "ipywidgets", "matplotlib", "nbsphinx", "pydata-sphinx-theme (<0.9)", "sphinx (>5,<6)", "sphinx-copybutton", "xarray"] +test = ["flake8", "mypy", "pylint", "pytest", "pytest-cov", "pytest-order", "xarray"] [[package]] name = "codespell" -version = "2.2.5" +version = "2.2.6" description = "Codespell" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "codespell-2.2.5-py3-none-any.whl", hash = "sha256:efa037f54b73c84f7bd14ce8e853d5f822cdd6386ef0ff32e957a3919435b9ec"}, - {file = "codespell-2.2.5.tar.gz", hash = "sha256:6d9faddf6eedb692bf80c9a94ec13ab4f5fb585aabae5f3750727148d7b5be56"}, + {file = "codespell-2.2.6-py3-none-any.whl", hash = "sha256:9ee9a3e5df0990604013ac2a9f22fa8e57669c827124a2e961fe8a1da4cacc07"}, + {file = "codespell-2.2.6.tar.gz", hash = "sha256:a8c65d8eb3faa03deabab6b3bbe798bea72e1799c7e9e955d57eca4096abcff9"}, ] [package.extras] -dev = ["Pygments", "build", "chardet", "pytest", "pytest-cov", "pytest-dependency", "ruff", "tomli"] +dev = ["Pygments", "build", "chardet", "pre-commit", "pytest", "pytest-cov", "pytest-dependency", "ruff", "tomli", "twine"] hard-encoding-detection = ["chardet"] toml = ["tomli"] types = ["chardet (>=5.1.0)", "mypy", "pytest", "pytest-cov", "pytest-dependency"] @@ -1313,22 +1334,20 @@ files = [ [[package]] name = "comm" -version = "0.1.3" +version = "0.2.2" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "comm-0.1.3-py3-none-any.whl", hash = "sha256:16613c6211e20223f215fc6d3b266a247b6e2641bf4e0a3ad34cb1aff2aa3f37"}, - {file = "comm-0.1.3.tar.gz", hash = "sha256:a61efa9daffcfbe66fd643ba966f846a624e4e6d6767eda9cf6e993aadaab93e"}, + {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, + {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, ] [package.dependencies] -traitlets = ">=5.3" +traitlets = ">=4" [package.extras] -lint = ["black (>=22.6.0)", "mdformat (>0.7)", "mdformat-gfm (>=0.3.5)", "ruff (>=0.0.156)"] test = ["pytest"] -typing = ["mypy (>=0.990)"] [[package]] name = "commonmark" @@ -1346,63 +1365,72 @@ test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"] [[package]] name = "contourpy" -version = "1.1.0" +version = "1.1.1" description = "Python library for calculating contours of 2D quadrilateral grids" optional = false python-versions = ">=3.8" files = [ - {file = "contourpy-1.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:89f06eff3ce2f4b3eb24c1055a26981bffe4e7264acd86f15b97e40530b794bc"}, - {file = "contourpy-1.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dffcc2ddec1782dd2f2ce1ef16f070861af4fb78c69862ce0aab801495dda6a3"}, - {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25ae46595e22f93592d39a7eac3d638cda552c3e1160255258b695f7b58e5655"}, - {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:17cfaf5ec9862bc93af1ec1f302457371c34e688fbd381f4035a06cd47324f48"}, - {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18a64814ae7bce73925131381603fff0116e2df25230dfc80d6d690aa6e20b37"}, - {file = "contourpy-1.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90c81f22b4f572f8a2110b0b741bb64e5a6427e0a198b2cdc1fbaf85f352a3aa"}, - {file = "contourpy-1.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:53cc3a40635abedbec7f1bde60f8c189c49e84ac180c665f2cd7c162cc454baa"}, - {file = "contourpy-1.1.0-cp310-cp310-win32.whl", hash = "sha256:9b2dd2ca3ac561aceef4c7c13ba654aaa404cf885b187427760d7f7d4c57cff8"}, - {file = "contourpy-1.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:1f795597073b09d631782e7245016a4323cf1cf0b4e06eef7ea6627e06a37ff2"}, - {file = "contourpy-1.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0b7b04ed0961647691cfe5d82115dd072af7ce8846d31a5fac6c142dcce8b882"}, - {file = "contourpy-1.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:27bc79200c742f9746d7dd51a734ee326a292d77e7d94c8af6e08d1e6c15d545"}, - {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:052cc634bf903c604ef1a00a5aa093c54f81a2612faedaa43295809ffdde885e"}, - {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9382a1c0bc46230fb881c36229bfa23d8c303b889b788b939365578d762b5c18"}, - {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5cec36c5090e75a9ac9dbd0ff4a8cf7cecd60f1b6dc23a374c7d980a1cd710e"}, - {file = "contourpy-1.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0cbd657e9bde94cd0e33aa7df94fb73c1ab7799378d3b3f902eb8eb2e04a3a"}, - {file = "contourpy-1.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:181cbace49874f4358e2929aaf7ba84006acb76694102e88dd15af861996c16e"}, - {file = "contourpy-1.1.0-cp311-cp311-win32.whl", hash = "sha256:edb989d31065b1acef3828a3688f88b2abb799a7db891c9e282df5ec7e46221b"}, - {file = "contourpy-1.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:fb3b7d9e6243bfa1efb93ccfe64ec610d85cfe5aec2c25f97fbbd2e58b531256"}, - {file = "contourpy-1.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bcb41692aa09aeb19c7c213411854402f29f6613845ad2453d30bf421fe68fed"}, - {file = "contourpy-1.1.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5d123a5bc63cd34c27ff9c7ac1cd978909e9c71da12e05be0231c608048bb2ae"}, - {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62013a2cf68abc80dadfd2307299bfa8f5aa0dcaec5b2954caeb5fa094171103"}, - {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0b6616375d7de55797d7a66ee7d087efe27f03d336c27cf1f32c02b8c1a5ac70"}, - {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:317267d915490d1e84577924bd61ba71bf8681a30e0d6c545f577363157e5e94"}, - {file = "contourpy-1.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d551f3a442655f3dcc1285723f9acd646ca5858834efeab4598d706206b09c9f"}, - {file = "contourpy-1.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7a117ce7df5a938fe035cad481b0189049e8d92433b4b33aa7fc609344aafa1"}, - {file = "contourpy-1.1.0-cp38-cp38-win32.whl", hash = "sha256:108dfb5b3e731046a96c60bdc46a1a0ebee0760418951abecbe0fc07b5b93b27"}, - {file = "contourpy-1.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4f26b25b4f86087e7d75e63212756c38546e70f2a92d2be44f80114826e1cd4"}, - {file = "contourpy-1.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc00bb4225d57bff7ebb634646c0ee2a1298402ec10a5fe7af79df9a51c1bfd9"}, - {file = "contourpy-1.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:189ceb1525eb0655ab8487a9a9c41f42a73ba52d6789754788d1883fb06b2d8a"}, - {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f2931ed4741f98f74b410b16e5213f71dcccee67518970c42f64153ea9313b9"}, - {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30f511c05fab7f12e0b1b7730ebdc2ec8deedcfb505bc27eb570ff47c51a8f15"}, - {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:143dde50520a9f90e4a2703f367cf8ec96a73042b72e68fcd184e1279962eb6f"}, - {file = "contourpy-1.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e94bef2580e25b5fdb183bf98a2faa2adc5b638736b2c0a4da98691da641316a"}, - {file = "contourpy-1.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ed614aea8462735e7d70141374bd7650afd1c3f3cb0c2dbbcbe44e14331bf002"}, - {file = "contourpy-1.1.0-cp39-cp39-win32.whl", hash = "sha256:71551f9520f008b2950bef5f16b0e3587506ef4f23c734b71ffb7b89f8721999"}, - {file = "contourpy-1.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:438ba416d02f82b692e371858143970ed2eb6337d9cdbbede0d8ad9f3d7dd17d"}, - {file = "contourpy-1.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a698c6a7a432789e587168573a864a7ea374c6be8d4f31f9d87c001d5a843493"}, - {file = "contourpy-1.1.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:397b0ac8a12880412da3551a8cb5a187d3298a72802b45a3bd1805e204ad8439"}, - {file = "contourpy-1.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:a67259c2b493b00e5a4d0f7bfae51fb4b3371395e47d079a4446e9b0f4d70e76"}, - {file = "contourpy-1.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2b836d22bd2c7bb2700348e4521b25e077255ebb6ab68e351ab5aa91ca27e027"}, - {file = "contourpy-1.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:084eaa568400cfaf7179b847ac871582199b1b44d5699198e9602ecbbb5f6104"}, - {file = "contourpy-1.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:911ff4fd53e26b019f898f32db0d4956c9d227d51338fb3b03ec72ff0084ee5f"}, - {file = "contourpy-1.1.0.tar.gz", hash = "sha256:e53046c3863828d21d531cc3b53786e6580eb1ba02477e8681009b6aa0870b21"}, + {file = "contourpy-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:46e24f5412c948d81736509377e255f6040e94216bf1a9b5ea1eaa9d29f6ec1b"}, + {file = "contourpy-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e48694d6a9c5a26ee85b10130c77a011a4fedf50a7279fa0bdaf44bafb4299d"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a66045af6cf00e19d02191ab578a50cb93b2028c3eefed999793698e9ea768ae"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ebf42695f75ee1a952f98ce9775c873e4971732a87334b099dde90b6af6a916"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6aec19457617ef468ff091669cca01fa7ea557b12b59a7908b9474bb9674cf0"}, + {file = "contourpy-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:462c59914dc6d81e0b11f37e560b8a7c2dbab6aca4f38be31519d442d6cde1a1"}, + {file = "contourpy-1.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6d0a8efc258659edc5299f9ef32d8d81de8b53b45d67bf4bfa3067f31366764d"}, + {file = "contourpy-1.1.1-cp310-cp310-win32.whl", hash = "sha256:d6ab42f223e58b7dac1bb0af32194a7b9311065583cc75ff59dcf301afd8a431"}, + {file = "contourpy-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:549174b0713d49871c6dee90a4b499d3f12f5e5f69641cd23c50a4542e2ca1eb"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:407d864db716a067cc696d61fa1ef6637fedf03606e8417fe2aeed20a061e6b2"}, + {file = "contourpy-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe80c017973e6a4c367e037cb31601044dd55e6bfacd57370674867d15a899b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e30aaf2b8a2bac57eb7e1650df1b3a4130e8d0c66fc2f861039d507a11760e1b"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3de23ca4f381c3770dee6d10ead6fff524d540c0f662e763ad1530bde5112532"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:566f0e41df06dfef2431defcfaa155f0acfa1ca4acbf8fd80895b1e7e2ada40e"}, + {file = "contourpy-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04c2f0adaf255bf756cf08ebef1be132d3c7a06fe6f9877d55640c5e60c72c5"}, + {file = "contourpy-1.1.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d0c188ae66b772d9d61d43c6030500344c13e3f73a00d1dc241da896f379bb62"}, + {file = "contourpy-1.1.1-cp311-cp311-win32.whl", hash = "sha256:0683e1ae20dc038075d92e0e0148f09ffcefab120e57f6b4c9c0f477ec171f33"}, + {file = "contourpy-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:8636cd2fc5da0fb102a2504fa2c4bea3cbc149533b345d72cdf0e7a924decc45"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:560f1d68a33e89c62da5da4077ba98137a5e4d3a271b29f2f195d0fba2adcb6a"}, + {file = "contourpy-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:24216552104ae8f3b34120ef84825400b16eb6133af2e27a190fdc13529f023e"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56de98a2fb23025882a18b60c7f0ea2d2d70bbbcfcf878f9067234b1c4818442"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:07d6f11dfaf80a84c97f1a5ba50d129d9303c5b4206f776e94037332e298dda8"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1eaac5257a8f8a047248d60e8f9315c6cff58f7803971170d952555ef6344a7"}, + {file = "contourpy-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19557fa407e70f20bfaba7d55b4d97b14f9480856c4fb65812e8a05fe1c6f9bf"}, + {file = "contourpy-1.1.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:081f3c0880712e40effc5f4c3b08feca6d064cb8cfbb372ca548105b86fd6c3d"}, + {file = "contourpy-1.1.1-cp312-cp312-win32.whl", hash = "sha256:059c3d2a94b930f4dafe8105bcdc1b21de99b30b51b5bce74c753686de858cb6"}, + {file = "contourpy-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:f44d78b61740e4e8c71db1cf1fd56d9050a4747681c59ec1094750a658ceb970"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:70e5a10f8093d228bb2b552beeb318b8928b8a94763ef03b858ef3612b29395d"}, + {file = "contourpy-1.1.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8394e652925a18ef0091115e3cc191fef350ab6dc3cc417f06da66bf98071ae9"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5bd5680f844c3ff0008523a71949a3ff5e4953eb7701b28760805bc9bcff217"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66544f853bfa85c0d07a68f6c648b2ec81dafd30f272565c37ab47a33b220684"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0c02b75acfea5cab07585d25069207e478d12309557f90a61b5a3b4f77f46ce"}, + {file = "contourpy-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41339b24471c58dc1499e56783fedc1afa4bb018bcd035cfb0ee2ad2a7501ef8"}, + {file = "contourpy-1.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f29fb0b3f1217dfe9362ec55440d0743fe868497359f2cf93293f4b2701b8251"}, + {file = "contourpy-1.1.1-cp38-cp38-win32.whl", hash = "sha256:f9dc7f933975367251c1b34da882c4f0e0b2e24bb35dc906d2f598a40b72bfc7"}, + {file = "contourpy-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:498e53573e8b94b1caeb9e62d7c2d053c263ebb6aa259c81050766beb50ff8d9"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba42e3810999a0ddd0439e6e5dbf6d034055cdc72b7c5c839f37a7c274cb4eba"}, + {file = "contourpy-1.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6c06e4c6e234fcc65435223c7b2a90f286b7f1b2733058bdf1345d218cc59e34"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca6fab080484e419528e98624fb5c4282148b847e3602dc8dbe0cb0669469887"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93df44ab351119d14cd1e6b52a5063d3336f0754b72736cc63db59307dabb718"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eafbef886566dc1047d7b3d4b14db0d5b7deb99638d8e1be4e23a7c7ac59ff0f"}, + {file = "contourpy-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efe0fab26d598e1ec07d72cf03eaeeba8e42b4ecf6b9ccb5a356fde60ff08b85"}, + {file = "contourpy-1.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f08e469821a5e4751c97fcd34bcb586bc243c39c2e39321822060ba902eac49e"}, + {file = "contourpy-1.1.1-cp39-cp39-win32.whl", hash = "sha256:bfc8a5e9238232a45ebc5cb3bfee71f1167064c8d382cadd6076f0d51cff1da0"}, + {file = "contourpy-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:c84fdf3da00c2827d634de4fcf17e3e067490c4aea82833625c4c8e6cdea0887"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:229a25f68046c5cf8067d6d6351c8b99e40da11b04d8416bf8d2b1d75922521e"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a10dab5ea1bd4401c9483450b5b0ba5416be799bbd50fc7a6cc5e2a15e03e8a3"}, + {file = "contourpy-1.1.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4f9147051cb8fdb29a51dc2482d792b3b23e50f8f57e3720ca2e3d438b7adf23"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a75cc163a5f4531a256f2c523bd80db509a49fc23721b36dd1ef2f60ff41c3cb"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b53d5769aa1f2d4ea407c65f2d1d08002952fac1d9e9d307aa2e1023554a163"}, + {file = "contourpy-1.1.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11b836b7dbfb74e049c302bbf74b4b8f6cb9d0b6ca1bf86cfa8ba144aedadd9c"}, + {file = "contourpy-1.1.1.tar.gz", hash = "sha256:96ba37c2e24b7212a77da85004c38e7c4d155d3e72a45eeaf22c1f03f607e8ab"}, ] [package.dependencies] -numpy = ">=1.16" +numpy = {version = ">=1.16,<2.0", markers = "python_version <= \"3.11\""} [package.extras] bokeh = ["bokeh", "selenium"] -docs = ["furo", "sphinx-copybutton"] -mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.2.0)", "types-Pillow"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.4.1)", "types-Pillow"] test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] test-no-images = ["pytest", "pytest-cov", "wurlitzer"] @@ -1425,73 +1453,83 @@ dev = ["black", "build", "isort", "pylint"] docs = ["myst-parser", "sphinx", "sphinx-rtd-theme"] tests = ["coverage"] +[[package]] +name = "coreforecast" +version = "0.0.8" +description = "Fast implementations of common forecasting routines" +optional = true +python-versions = ">=3.8" +files = [ + {file = "coreforecast-0.0.8-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:599ca1dd0d8f41396c47107ecc9ce777769d6572f8c2a4494d9688a2e4424895"}, + {file = "coreforecast-0.0.8-py3-none-macosx_11_0_arm64.whl", hash = "sha256:e5c2a1983465563ca2d3078f6ba449214e20eef5056013a62893cd6958cd7497"}, + {file = "coreforecast-0.0.8-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f6ca35496eaada7cbb4b3f07dde2a9612b9c8ae849f2e02dc54e1c528c42248"}, + {file = "coreforecast-0.0.8-py3-none-win_amd64.whl", hash = "sha256:155104b5077fa6b44fc23c3761cca24343cfda0203574a2b7104cc7ee609e5a7"}, + {file = "coreforecast-0.0.8.tar.gz", hash = "sha256:c352306fadf1faa52c68170abbd9ef6b5cb95fec8a0667206e4efe0f397b7f9b"}, +] + +[package.dependencies] +importlib_resources = {version = "*", markers = "python_version < \"3.10\""} +numpy = ">=1.20.0" + [[package]] name = "coverage" -version = "7.2.7" +version = "7.4.4" description = "Code coverage measurement for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "coverage-7.2.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d39b5b4f2a66ccae8b7263ac3c8170994b65266797fb96cbbfd3fb5b23921db8"}, - {file = "coverage-7.2.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d040ef7c9859bb11dfeb056ff5b3872436e3b5e401817d87a31e1750b9ae2fb"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba90a9563ba44a72fda2e85302c3abc71c5589cea608ca16c22b9804262aaeb6"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d9405291c6928619403db1d10bd07888888ec1abcbd9748fdaa971d7d661b2"}, - {file = "coverage-7.2.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31563e97dae5598556600466ad9beea39fb04e0229e61c12eaa206e0aa202063"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebba1cd308ef115925421d3e6a586e655ca5a77b5bf41e02eb0e4562a111f2d1"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb017fd1b2603ef59e374ba2063f593abe0fc45f2ad9abdde5b4d83bd922a353"}, - {file = "coverage-7.2.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62a5c7dad11015c66fbb9d881bc4caa5b12f16292f857842d9d1871595f4495"}, - {file = "coverage-7.2.7-cp310-cp310-win32.whl", hash = "sha256:ee57190f24fba796e36bb6d3aa8a8783c643d8fa9760c89f7a98ab5455fbf818"}, - {file = "coverage-7.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:f75f7168ab25dd93110c8a8117a22450c19976afbc44234cbf71481094c1b850"}, - {file = "coverage-7.2.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06a9a2be0b5b576c3f18f1a241f0473575c4a26021b52b2a85263a00f034d51f"}, - {file = "coverage-7.2.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5baa06420f837184130752b7c5ea0808762083bf3487b5038d68b012e5937dbe"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdec9e8cbf13a5bf63290fc6013d216a4c7232efb51548594ca3631a7f13c3a3"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52edc1a60c0d34afa421c9c37078817b2e67a392cab17d97283b64c5833f427f"}, - {file = "coverage-7.2.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63426706118b7f5cf6bb6c895dc215d8a418d5952544042c8a2d9fe87fcf09cb"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:afb17f84d56068a7c29f5fa37bfd38d5aba69e3304af08ee94da8ed5b0865833"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:48c19d2159d433ccc99e729ceae7d5293fbffa0bdb94952d3579983d1c8c9d97"}, - {file = "coverage-7.2.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e1f928eaf5469c11e886fe0885ad2bf1ec606434e79842a879277895a50942a"}, - {file = "coverage-7.2.7-cp311-cp311-win32.whl", hash = "sha256:33d6d3ea29d5b3a1a632b3c4e4f4ecae24ef170b0b9ee493883f2df10039959a"}, - {file = "coverage-7.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:5b7540161790b2f28143191f5f8ec02fb132660ff175b7747b95dcb77ac26562"}, - {file = "coverage-7.2.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f2f67fe12b22cd130d34d0ef79206061bfb5eda52feb6ce0dba0644e20a03cf4"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a342242fe22407f3c17f4b499276a02b01e80f861f1682ad1d95b04018e0c0d4"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:171717c7cb6b453aebac9a2ef603699da237f341b38eebfee9be75d27dc38e01"}, - {file = "coverage-7.2.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49969a9f7ffa086d973d91cec8d2e31080436ef0fb4a359cae927e742abfaaa6"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b46517c02ccd08092f4fa99f24c3b83d8f92f739b4657b0f146246a0ca6a831d"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a3d33a6b3eae87ceaefa91ffdc130b5e8536182cd6dfdbfc1aa56b46ff8c86de"}, - {file = "coverage-7.2.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:976b9c42fb2a43ebf304fa7d4a310e5f16cc99992f33eced91ef6f908bd8f33d"}, - {file = "coverage-7.2.7-cp312-cp312-win32.whl", hash = "sha256:8de8bb0e5ad103888d65abef8bca41ab93721647590a3f740100cd65c3b00511"}, - {file = "coverage-7.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:9e31cb64d7de6b6f09702bb27c02d1904b3aebfca610c12772452c4e6c21a0d3"}, - {file = "coverage-7.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58c2ccc2f00ecb51253cbe5d8d7122a34590fac9646a960d1430d5b15321d95f"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d22656368f0e6189e24722214ed8d66b8022db19d182927b9a248a2a8a2f67eb"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a895fcc7b15c3fc72beb43cdcbdf0ddb7d2ebc959edac9cef390b0d14f39f8a9"}, - {file = "coverage-7.2.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84606b74eb7de6ff581a7915e2dab7a28a0517fbe1c9239eb227e1354064dcd"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a5f9e1dbd7fbe30196578ca36f3fba75376fb99888c395c5880b355e2875f8a"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:419bfd2caae268623dd469eff96d510a920c90928b60f2073d79f8fe2bbc5959"}, - {file = "coverage-7.2.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2aee274c46590717f38ae5e4650988d1af340fe06167546cc32fe2f58ed05b02"}, - {file = "coverage-7.2.7-cp37-cp37m-win32.whl", hash = "sha256:61b9a528fb348373c433e8966535074b802c7a5d7f23c4f421e6c6e2f1697a6f"}, - {file = "coverage-7.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:b1c546aca0ca4d028901d825015dc8e4d56aac4b541877690eb76490f1dc8ed0"}, - {file = "coverage-7.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:54b896376ab563bd38453cecb813c295cf347cf5906e8b41d340b0321a5433e5"}, - {file = "coverage-7.2.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d376df58cc111dc8e21e3b6e24606b5bb5dee6024f46a5abca99124b2229ef5"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e330fc79bd7207e46c7d7fd2bb4af2963f5f635703925543a70b99574b0fea9"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e9d683426464e4a252bf70c3498756055016f99ddaec3774bf368e76bbe02b6"}, - {file = "coverage-7.2.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d13c64ee2d33eccf7437961b6ea7ad8673e2be040b4f7fd4fd4d4d28d9ccb1e"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7aa5f8a41217360e600da646004f878250a0d6738bcdc11a0a39928d7dc2050"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fa03bce9bfbeeef9f3b160a8bed39a221d82308b4152b27d82d8daa7041fee5"}, - {file = "coverage-7.2.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:245167dd26180ab4c91d5e1496a30be4cd721a5cf2abf52974f965f10f11419f"}, - {file = "coverage-7.2.7-cp38-cp38-win32.whl", hash = "sha256:d2c2db7fd82e9b72937969bceac4d6ca89660db0a0967614ce2481e81a0b771e"}, - {file = "coverage-7.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:2e07b54284e381531c87f785f613b833569c14ecacdcb85d56b25c4622c16c3c"}, - {file = "coverage-7.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:537891ae8ce59ef63d0123f7ac9e2ae0fc8b72c7ccbe5296fec45fd68967b6c9"}, - {file = "coverage-7.2.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06fb182e69f33f6cd1d39a6c597294cff3143554b64b9825d1dc69d18cc2fff2"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201e7389591af40950a6480bd9edfa8ed04346ff80002cec1a66cac4549c1ad7"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6951407391b639504e3b3be51b7ba5f3528adbf1a8ac3302b687ecababf929e"}, - {file = "coverage-7.2.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f48351d66575f535669306aa7d6d6f71bc43372473b54a832222803eb956fd1"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b29019c76039dc3c0fd815c41392a044ce555d9bcdd38b0fb60fb4cd8e475ba9"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81c13a1fc7468c40f13420732805a4c38a105d89848b7c10af65a90beff25250"}, - {file = "coverage-7.2.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:975d70ab7e3c80a3fe86001d8751f6778905ec723f5b110aed1e450da9d4b7f2"}, - {file = "coverage-7.2.7-cp39-cp39-win32.whl", hash = "sha256:7ee7d9d4822c8acc74a5e26c50604dff824710bc8de424904c0982e25c39c6cb"}, - {file = "coverage-7.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb393e5ebc85245347950143969b241d08b52b88a3dc39479822e073a1a8eb27"}, - {file = "coverage-7.2.7-pp37.pp38.pp39-none-any.whl", hash = "sha256:b7b4c971f05e6ae490fef852c218b0e79d4e52f79ef0c8475566584a8fb3e01d"}, - {file = "coverage-7.2.7.tar.gz", hash = "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59"}, + {file = "coverage-7.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e0be5efd5127542ef31f165de269f77560d6cdef525fffa446de6f7e9186cfb2"}, + {file = "coverage-7.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ccd341521be3d1b3daeb41960ae94a5e87abe2f46f17224ba5d6f2b8398016cf"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09fa497a8ab37784fbb20ab699c246053ac294d13fc7eb40ec007a5043ec91f8"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b1a93009cb80730c9bca5d6d4665494b725b6e8e157c1cb7f2db5b4b122ea562"}, + {file = "coverage-7.4.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:690db6517f09336559dc0b5f55342df62370a48f5469fabf502db2c6d1cffcd2"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:09c3255458533cb76ef55da8cc49ffab9e33f083739c8bd4f58e79fecfe288f7"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8ce1415194b4a6bd0cdcc3a1dfbf58b63f910dcb7330fe15bdff542c56949f87"}, + {file = "coverage-7.4.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b91cbc4b195444e7e258ba27ac33769c41b94967919f10037e6355e998af255c"}, + {file = "coverage-7.4.4-cp310-cp310-win32.whl", hash = "sha256:598825b51b81c808cb6f078dcb972f96af96b078faa47af7dfcdf282835baa8d"}, + {file = "coverage-7.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:09ef9199ed6653989ebbcaacc9b62b514bb63ea2f90256e71fea3ed74bd8ff6f"}, + {file = "coverage-7.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0f9f50e7ef2a71e2fae92774c99170eb8304e3fdf9c8c3c7ae9bab3e7229c5cf"}, + {file = "coverage-7.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:623512f8ba53c422fcfb2ce68362c97945095b864cda94a92edbaf5994201083"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0513b9508b93da4e1716744ef6ebc507aff016ba115ffe8ecff744d1322a7b63"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40209e141059b9370a2657c9b15607815359ab3ef9918f0196b6fccce8d3230f"}, + {file = "coverage-7.4.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a2b2b78c78293782fd3767d53e6474582f62443d0504b1554370bde86cc8227"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:73bfb9c09951125d06ee473bed216e2c3742f530fc5acc1383883125de76d9cd"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:1f384c3cc76aeedce208643697fb3e8437604b512255de6d18dae3f27655a384"}, + {file = "coverage-7.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:54eb8d1bf7cacfbf2a3186019bcf01d11c666bd495ed18717162f7eb1e9dd00b"}, + {file = "coverage-7.4.4-cp311-cp311-win32.whl", hash = "sha256:cac99918c7bba15302a2d81f0312c08054a3359eaa1929c7e4b26ebe41e9b286"}, + {file = "coverage-7.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:b14706df8b2de49869ae03a5ccbc211f4041750cd4a66f698df89d44f4bd30ec"}, + {file = "coverage-7.4.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:201bef2eea65e0e9c56343115ba3814e896afe6d36ffd37bab783261db430f76"}, + {file = "coverage-7.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41c9c5f3de16b903b610d09650e5e27adbfa7f500302718c9ffd1c12cf9d6818"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d898fe162d26929b5960e4e138651f7427048e72c853607f2b200909794ed978"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ea79bb50e805cd6ac058dfa3b5c8f6c040cb87fe83de10845857f5535d1db70"}, + {file = "coverage-7.4.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce4b94265ca988c3f8e479e741693d143026632672e3ff924f25fab50518dd51"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:00838a35b882694afda09f85e469c96367daa3f3f2b097d846a7216993d37f4c"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:fdfafb32984684eb03c2d83e1e51f64f0906b11e64482df3c5db936ce3839d48"}, + {file = "coverage-7.4.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:69eb372f7e2ece89f14751fbcbe470295d73ed41ecd37ca36ed2eb47512a6ab9"}, + {file = "coverage-7.4.4-cp312-cp312-win32.whl", hash = "sha256:137eb07173141545e07403cca94ab625cc1cc6bc4c1e97b6e3846270e7e1fea0"}, + {file = "coverage-7.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:d71eec7d83298f1af3326ce0ff1d0ea83c7cb98f72b577097f9083b20bdaf05e"}, + {file = "coverage-7.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d5ae728ff3b5401cc320d792866987e7e7e880e6ebd24433b70a33b643bb0384"}, + {file = "coverage-7.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc4f1358cb0c78edef3ed237ef2c86056206bb8d9140e73b6b89fbcfcbdd40e1"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8130a2aa2acb8788e0b56938786c33c7c98562697bf9f4c7d6e8e5e3a0501e4a"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf271892d13e43bc2b51e6908ec9a6a5094a4df1d8af0bfc360088ee6c684409"}, + {file = "coverage-7.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4cdc86d54b5da0df6d3d3a2f0b710949286094c3a6700c21e9015932b81447e"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae71e7ddb7a413dd60052e90528f2f65270aad4b509563af6d03d53e979feafd"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:38dd60d7bf242c4ed5b38e094baf6401faa114fc09e9e6632374388a404f98e7"}, + {file = "coverage-7.4.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:aa5b1c1bfc28384f1f53b69a023d789f72b2e0ab1b3787aae16992a7ca21056c"}, + {file = "coverage-7.4.4-cp38-cp38-win32.whl", hash = "sha256:dfa8fe35a0bb90382837b238fff375de15f0dcdb9ae68ff85f7a63649c98527e"}, + {file = "coverage-7.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:b2991665420a803495e0b90a79233c1433d6ed77ef282e8e152a324bbbc5e0c8"}, + {file = "coverage-7.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3b799445b9f7ee8bf299cfaed6f5b226c0037b74886a4e11515e569b36fe310d"}, + {file = "coverage-7.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b4d33f418f46362995f1e9d4f3a35a1b6322cb959c31d88ae56b0298e1c22357"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aadacf9a2f407a4688d700e4ebab33a7e2e408f2ca04dbf4aef17585389eff3e"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c95949560050d04d46b919301826525597f07b33beba6187d04fa64d47ac82e"}, + {file = "coverage-7.4.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff7687ca3d7028d8a5f0ebae95a6e4827c5616b31a4ee1192bdfde697db110d4"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5fc1de20b2d4a061b3df27ab9b7c7111e9a710f10dc2b84d33a4ab25065994ec"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:c74880fc64d4958159fbd537a091d2a585448a8f8508bf248d72112723974cbd"}, + {file = "coverage-7.4.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:742a76a12aa45b44d236815d282b03cfb1de3b4323f3e4ec933acfae08e54ade"}, + {file = "coverage-7.4.4-cp39-cp39-win32.whl", hash = "sha256:d89d7b2974cae412400e88f35d86af72208e1ede1a541954af5d944a8ba46c57"}, + {file = "coverage-7.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:9ca28a302acb19b6af89e90f33ee3e1906961f94b54ea37de6737b7ca9d8827c"}, + {file = "coverage-7.4.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:b2c5edc4ac10a7ef6605a966c58929ec6c1bd0917fb8c15cb3363f65aa40e677"}, + {file = "coverage-7.4.4.tar.gz", hash = "sha256:c901df83d097649e257e803be22592aedfd5182f07b3cc87d640bbb9afd50f49"}, ] [package.dependencies] @@ -1502,47 +1540,56 @@ toml = ["tomli"] [[package]] name = "cryptography" -version = "41.0.2" +version = "42.0.5" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." optional = false python-versions = ">=3.7" files = [ - {file = "cryptography-41.0.2-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:01f1d9e537f9a15b037d5d9ee442b8c22e3ae11ce65ea1f3316a41c78756b711"}, - {file = "cryptography-41.0.2-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:079347de771f9282fbfe0e0236c716686950c19dee1b76240ab09ce1624d76d7"}, - {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:439c3cc4c0d42fa999b83ded80a9a1fb54d53c58d6e59234cfe97f241e6c781d"}, - {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f14ad275364c8b4e525d018f6716537ae7b6d369c094805cae45300847e0894f"}, - {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:84609ade00a6ec59a89729e87a503c6e36af98ddcd566d5f3be52e29ba993182"}, - {file = "cryptography-41.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:49c3222bb8f8e800aead2e376cbef687bc9e3cb9b58b29a261210456a7783d83"}, - {file = "cryptography-41.0.2-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:d73f419a56d74fef257955f51b18d046f3506270a5fd2ac5febbfa259d6c0fa5"}, - {file = "cryptography-41.0.2-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:2a034bf7d9ca894720f2ec1d8b7b5832d7e363571828037f9e0c4f18c1b58a58"}, - {file = "cryptography-41.0.2-cp37-abi3-win32.whl", hash = "sha256:d124682c7a23c9764e54ca9ab5b308b14b18eba02722b8659fb238546de83a76"}, - {file = "cryptography-41.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:9c3fe6534d59d071ee82081ca3d71eed3210f76ebd0361798c74abc2bcf347d4"}, - {file = "cryptography-41.0.2-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a719399b99377b218dac6cf547b6ec54e6ef20207b6165126a280b0ce97e0d2a"}, - {file = "cryptography-41.0.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:182be4171f9332b6741ee818ec27daff9fb00349f706629f5cbf417bd50e66fd"}, - {file = "cryptography-41.0.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7a9a3bced53b7f09da251685224d6a260c3cb291768f54954e28f03ef14e3766"}, - {file = "cryptography-41.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:f0dc40e6f7aa37af01aba07277d3d64d5a03dc66d682097541ec4da03cc140ee"}, - {file = "cryptography-41.0.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:674b669d5daa64206c38e507808aae49904c988fa0a71c935e7006a3e1e83831"}, - {file = "cryptography-41.0.2-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7af244b012711a26196450d34f483357e42aeddb04128885d95a69bd8b14b69b"}, - {file = "cryptography-41.0.2-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9b6d717393dbae53d4e52684ef4f022444fc1cce3c48c38cb74fca29e1f08eaa"}, - {file = "cryptography-41.0.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:192255f539d7a89f2102d07d7375b1e0a81f7478925b3bc2e0549ebf739dae0e"}, - {file = "cryptography-41.0.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f772610fe364372de33d76edcd313636a25684edb94cee53fd790195f5989d14"}, - {file = "cryptography-41.0.2-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:b332cba64d99a70c1e0836902720887fb4529ea49ea7f5462cf6640e095e11d2"}, - {file = "cryptography-41.0.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9a6673c1828db6270b76b22cc696f40cde9043eb90373da5c2f8f2158957f42f"}, - {file = "cryptography-41.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:342f3767e25876751e14f8459ad85e77e660537ca0a066e10e75df9c9e9099f0"}, - {file = "cryptography-41.0.2.tar.gz", hash = "sha256:7d230bf856164de164ecb615ccc14c7fc6de6906ddd5b491f3af90d3514c925c"}, + {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_universal2.whl", hash = "sha256:a30596bae9403a342c978fb47d9b0ee277699fa53bbafad14706af51fe543d16"}, + {file = "cryptography-42.0.5-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:b7ffe927ee6531c78f81aa17e684e2ff617daeba7f189f911065b2ea2d526dec"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2424ff4c4ac7f6b8177b53c17ed5d8fa74ae5955656867f5a8affaca36a27abb"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:329906dcc7b20ff3cad13c069a78124ed8247adcac44b10bea1130e36caae0b4"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:b03c2ae5d2f0fc05f9a2c0c997e1bc18c8229f392234e8a0194f202169ccd278"}, + {file = "cryptography-42.0.5-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8837fe1d6ac4a8052a9a8ddab256bc006242696f03368a4009be7ee3075cdb7"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:0270572b8bd2c833c3981724b8ee9747b3ec96f699a9665470018594301439ee"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:b8cac287fafc4ad485b8a9b67d0ee80c66bf3574f655d3b97ef2e1082360faf1"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:16a48c23a62a2f4a285699dba2e4ff2d1cff3115b9df052cdd976a18856d8e3d"}, + {file = "cryptography-42.0.5-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2bce03af1ce5a5567ab89bd90d11e7bbdff56b8af3acbbec1faded8f44cb06da"}, + {file = "cryptography-42.0.5-cp37-abi3-win32.whl", hash = "sha256:b6cd2203306b63e41acdf39aa93b86fb566049aeb6dc489b70e34bcd07adca74"}, + {file = "cryptography-42.0.5-cp37-abi3-win_amd64.whl", hash = "sha256:98d8dc6d012b82287f2c3d26ce1d2dd130ec200c8679b6213b3c73c08b2b7940"}, + {file = "cryptography-42.0.5-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:5e6275c09d2badf57aea3afa80d975444f4be8d3bc58f7f80d2a484c6f9485c8"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4985a790f921508f36f81831817cbc03b102d643b5fcb81cd33df3fa291a1a1"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cde5f38e614f55e28d831754e8a3bacf9ace5d1566235e39d91b35502d6936e"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:7367d7b2eca6513681127ebad53b2582911d1736dc2ffc19f2c3ae49997496bc"}, + {file = "cryptography-42.0.5-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:cd2030f6650c089aeb304cf093f3244d34745ce0cfcc39f20c6fbfe030102e2a"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a2913c5375154b6ef2e91c10b5720ea6e21007412f6437504ffea2109b5a33d7"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:c41fb5e6a5fe9ebcd58ca3abfeb51dffb5d83d6775405305bfa8715b76521922"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3eaafe47ec0d0ffcc9349e1708be2aaea4c6dd4978d76bf6eb0cb2c13636c6fc"}, + {file = "cryptography-42.0.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1b95b98b0d2af784078fa69f637135e3c317091b615cd0905f8b8a087e86fa30"}, + {file = "cryptography-42.0.5-cp39-abi3-win32.whl", hash = "sha256:1f71c10d1e88467126f0efd484bd44bca5e14c664ec2ede64c32f20875c0d413"}, + {file = "cryptography-42.0.5-cp39-abi3-win_amd64.whl", hash = "sha256:a011a644f6d7d03736214d38832e030d8268bcff4a41f728e6030325fea3e400"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:9481ffe3cf013b71b2428b905c4f7a9a4f76ec03065b05ff499bb5682a8d9ad8"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ba334e6e4b1d92442b75ddacc615c5476d4ad55cc29b15d590cc6b86efa487e2"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:ba3e4a42397c25b7ff88cdec6e2a16c2be18720f317506ee25210f6d31925f9c"}, + {file = "cryptography-42.0.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:111a0d8553afcf8eb02a4fea6ca4f59d48ddb34497aa8706a6cf536f1a5ec576"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:cd65d75953847815962c84a4654a84850b2bb4aed3f26fadcc1c13892e1e29f6"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e807b3188f9eb0eaa7bbb579b462c5ace579f1cedb28107ce8b48a9f7ad3679e"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f12764b8fffc7a123f641d7d049d382b73f96a34117e0b637b80643169cec8ac"}, + {file = "cryptography-42.0.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:37dd623507659e08be98eec89323469e8c7b4c1407c85112634ae3dbdb926fdd"}, + {file = "cryptography-42.0.5.tar.gz", hash = "sha256:6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1"}, ] [package.dependencies] -cffi = ">=1.12" +cffi = {version = ">=1.12", markers = "platform_python_implementation != \"PyPy\""} [package.extras] docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.1.1)"] -docstest = ["pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +docstest = ["pyenchant (>=1.6.11)", "readme-renderer", "sphinxcontrib-spelling (>=4.0.1)"] nox = ["nox"] -pep8test = ["black", "check-sdist", "mypy", "ruff"] +pep8test = ["check-sdist", "click", "mypy", "ruff"] sdist = ["build"] ssh = ["bcrypt (>=3.1.5)"] -test = ["pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] +test = ["certifi", "pretend", "pytest (>=6.2.0)", "pytest-benchmark", "pytest-cov", "pytest-xdist"] test-randomorder = ["pytest-randomly"] [[package]] @@ -1577,182 +1624,158 @@ test = ["flake8", "isort", "pytest"] [[package]] name = "cvxpy" -version = "1.2.2" +version = "1.4.3" description = "A domain-specific language for modeling convex optimization problems in Python." optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "cvxpy-1.2.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a0280e486f1eaa942a85ddbd4f660e69335a06d075381c202645679a98f9655e"}, - {file = "cvxpy-1.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1af7a07246e9d8518c819e18b46a888adfe514a809f5d1393b106118fcc2260e"}, - {file = "cvxpy-1.2.2-cp310-cp310-manylinux_2_24_x86_64.whl", hash = "sha256:9d051a0186063e7e71ada198fca1c304645a00881fac63ee482fc47eb241fc06"}, - {file = "cvxpy-1.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:3029fbcd99a0dac4426f989c00db77c2c76389e6366dc1af82de0ed5658f1939"}, - {file = "cvxpy-1.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dbcf638d6948ed1e6324924b1200bce3e75a3bf675a356bbbe06f7758300e0aa"}, - {file = "cvxpy-1.2.2-cp37-cp37m-manylinux_2_24_x86_64.whl", hash = "sha256:b0041dfe7e158307755910dbb72fd360144fc8602640873ddb364cbfc7363b47"}, - {file = "cvxpy-1.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:ab6e635d6849a5c8a82cd4f1a4578a24fa85ba9cd50dcd73ee0b3758acba2d57"}, - {file = "cvxpy-1.2.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:99edcd3bf4b60ea7776fa9b13ae11f828017f00b32a824965c0a397e27548bdf"}, - {file = "cvxpy-1.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:174297709f6d68ea60e6f482e21c54237fe6a1424cc7fd8bbd296afc1b1f6695"}, - {file = "cvxpy-1.2.2-cp38-cp38-manylinux_2_24_x86_64.whl", hash = "sha256:28b37a498821699714ad3fe487837661c34efdfbf156a5b0ce02d64f69930436"}, - {file = "cvxpy-1.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:711391e46dd6a9a01a7ea412de09616c8ef413c0c339f6416da35090607238b9"}, - {file = "cvxpy-1.2.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:129b37ca74e27c07593ef1d2a463f8e6f61f88fd6b87302acf3deab15d135b18"}, - {file = "cvxpy-1.2.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f6fe6952bb2ed2296ad03c9d50a3a31f4753555c6b7babe5a39cad48983678c5"}, - {file = "cvxpy-1.2.2-cp39-cp39-manylinux_2_24_x86_64.whl", hash = "sha256:da2c8338a580dc3430142c3a5022a4806eb87859b7293d11edd3ca376926a9de"}, - {file = "cvxpy-1.2.2-cp39-cp39-win_amd64.whl", hash = "sha256:aad6784de16d64320a1ee7ad4aa1c7910bc59a5a7f49b84b0f7d48cd92190155"}, - {file = "cvxpy-1.2.2.tar.gz", hash = "sha256:c8e91545585eb632ce030fbf2c301d573ec3cf7971f9a387a0f0a61a2feae6b8"}, + {file = "cvxpy-1.4.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f4dc744a6f38328b0511cd57cfd81a517c0568d3b6e994d6dda3f309a1ce47cf"}, + {file = "cvxpy-1.4.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c32199a26d889e74d70bc39f0369680cb7d2625e7c47c42483ca166d37122c2"}, + {file = "cvxpy-1.4.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a4fed75c1714409fd5125269935a68bc3f57c522623a5d7eab68623a19f3a6f"}, + {file = "cvxpy-1.4.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8198e390490a0543caad428fc0d8a5c0914052c22630277d00bfdc7a770c4b11"}, + {file = "cvxpy-1.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:bea83a4a829d7197c307badbbe2f05d6e7aed85ed63badd800b89534b33b38de"}, + {file = "cvxpy-1.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:443313eca702750a7a2878e841de23cc5111085f4069e842d027ebc5c98c10ac"}, + {file = "cvxpy-1.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9ae3d4ec202dc446206d8c6eae83353827842dc0e232f4e4f0d588fb2d59705a"}, + {file = "cvxpy-1.4.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f8ee4d0d1ecb2e09e41a31192ea103c7c1f626204925fb7f6590d11471cb357"}, + {file = "cvxpy-1.4.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeb6f60608d4716ced43105cbeb0df2a787583f51bfbf9465fea5c435f8456ca"}, + {file = "cvxpy-1.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:243d0315140a7572cd4ec2e9bf13c1e407627d78dc5f9491abfa9adc64569268"}, + {file = "cvxpy-1.4.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:69ee039b43e425ffc0cb5581c2befee571bee2b007d5a119fa17695f908d861e"}, + {file = "cvxpy-1.4.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:502c590099a4faeee28247a3d139d618a94ec6d2986dc7cc0db2ac614660ddc5"}, + {file = "cvxpy-1.4.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57a803bb786ab43da0c0a4fbbb0b2438fd13a4b38b68f8f16474a214a78b0823"}, + {file = "cvxpy-1.4.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:331cc160e66b7271b734b8ad0b65456d32445e00c397c35b7f2b105091ecfa84"}, + {file = "cvxpy-1.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:4b4d46fd521b755a6abd57384b2355db28d7165a6d90118278ebd7553e4ba70b"}, + {file = "cvxpy-1.4.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:80dde991c27d4e3b91597a00b85d460a9db03b484ba6a3b940647e324ad30110"}, + {file = "cvxpy-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:06091d3278c65ef996306b5a85a7848055331ef390262f2cf354811f43ddea68"}, + {file = "cvxpy-1.4.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e16bf04f75266c61ee469a0a3b1364c1e1e87d47dc47fedcdc43435c74dd97f3"}, + {file = "cvxpy-1.4.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14882db05fa36cab94262b7e9574c43f87301ab025daefdabaa7659f2623e731"}, + {file = "cvxpy-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:f094da24c46e6b0b936369463d483755eafbb13fd6a8d8d1ca962987d02eb014"}, + {file = "cvxpy-1.4.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b8d652877989ddc28099a367fb7a4bb771d54895e3e1167c835ee3f91606bd13"}, + {file = "cvxpy-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:25d3ac5953effaa5c72ab8d261dbe94d8a1947de0324a7e30053ef3b0cee853e"}, + {file = "cvxpy-1.4.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d612c7bdff73a730c11d6094540705ca9c8312d9ebb6af75c09337123dd66b2"}, + {file = "cvxpy-1.4.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1475fd4c4778067d5ec03b35fe714d6a4074e1e213262a8bddbd9b638e004419"}, + {file = "cvxpy-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:8d30081ef5e906cc6352fc6760f462a6dfcb5150a5a26e21da942b6ae0759293"}, + {file = "cvxpy-1.4.3.tar.gz", hash = "sha256:b1b078c8c05923ad128e7d814b0be1c337ac05262a78b757a8e6f957648ad953"}, ] [package.dependencies] +clarabel = ">=0.5.0" ecos = ">=2" numpy = ">=1.15" -osqp = ">=0.4.1" +osqp = ">=0.6.2" +pybind11 = "*" scipy = ">=1.1.0" -scs = ">=1.1.6" +scs = ">=3.0" + +[package.extras] +cbc = ["cylp (>=0.91.5)"] +clarabel = ["clarabel"] +cvxopt = ["cvxopt"] +diffcp = ["diffcp"] +glop = ["ortools (>=9.5,<9.8)"] +glpk = ["cvxopt"] +glpk-mi = ["cvxopt"] +gurobi = ["gurobipy"] +highs = ["scipy (>=1.6.1)"] +mosek = ["Mosek"] +pdlp = ["ortools (>=9.5,<9.8)"] +piqp = ["piqp"] +proxqp = ["proxsuite"] +scip = ["PySCIPOpt"] +scipy = ["scipy"] +scs = ["setuptools (>65.5.1)"] +xpress = ["xpress"] [[package]] name = "cycler" -version = "0.11.0" +version = "0.12.1" description = "Composable style cycles" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "cycler-0.11.0-py3-none-any.whl", hash = "sha256:3a27e95f763a428a739d2add979fa7494c912a32c17c4c38c4d5f082cad165a3"}, - {file = "cycler-0.11.0.tar.gz", hash = "sha256:9c87405839a19696e837b3b818fed3f5f69f16f1eec1a1ad77e043dcea9c772f"}, + {file = "cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30"}, + {file = "cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c"}, ] +[package.extras] +docs = ["ipython", "matplotlib", "numpydoc", "sphinx"] +tests = ["pytest", "pytest-cov", "pytest-xdist"] + [[package]] name = "cython" -version = "3.0.0" +version = "3.0.10" description = "The Cython compiler for writing C extensions in the Python language." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" files = [ - {file = "Cython-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c7d728e1a49ad01d41181e3a9ea80b8d14e825f4679e4dd837cbf7bca7998a5"}, - {file = "Cython-3.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:626a4a6ef4b7ced87c348ea805488e4bd39dad9d0b39659aa9e1040b62bbfedf"}, - {file = "Cython-3.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33c900d1ca9f622b969ac7d8fc44bdae140a4a6c7d8819413b51f3ccd0586a09"}, - {file = "Cython-3.0.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a65bc50dc1bc2faeafd9425defbdef6a468974f5c4192497ff7f14adccfdcd32"}, - {file = "Cython-3.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3b71b399b10b038b056ad12dce1e317a8aa7a96e99de7e4fa2fa5d1c9415cfb9"}, - {file = "Cython-3.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f42f304c097cc53e9eb5f1a1d150380353d5018a3191f1b77f0de353c762181e"}, - {file = "Cython-3.0.0-cp310-cp310-win32.whl", hash = "sha256:3e234e2549e808d9259fdb23ebcfd145be30c638c65118326ec33a8d29248dc2"}, - {file = "Cython-3.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:829c8333195100448a23863cf64a07e1334fae6a275aefe871458937911531b6"}, - {file = "Cython-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06db81b1a01858fcc406616f8528e686ffb6cf7c3d78fb83767832bfecea8ad8"}, - {file = "Cython-3.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c93634845238645ce7abf63a56b1c5b6248189005c7caff898fd4a0dac1c5e1e"}, - {file = "Cython-3.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa606675c6bd23478b1d174e2a84e3c5a2c660968f97dc455afe0fae198f9d3d"}, - {file = "Cython-3.0.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3355e6f690184f984eeb108b0f5bbc4bcf8b9444f8168933acf79603abf7baf"}, - {file = "Cython-3.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:93a34e1ca8afa4b7075b02ed14a7e4969256297029fb1bfd4cbe48f7290dbcff"}, - {file = "Cython-3.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bb1165ca9e78823f9ad1efa5b3d83156f868eabd679a615d140a3021bb92cd65"}, - {file = "Cython-3.0.0-cp311-cp311-win32.whl", hash = "sha256:2fadde1da055944f5e1e17625055f54ddd11f451889110278ef30e07bd5e1695"}, - {file = "Cython-3.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:254ed1f03a6c237fa64f0c6e44862058de65bfa2e6a3b48ca3c205492e0653aa"}, - {file = "Cython-3.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4e212237b7531759befb92699c452cd65074a78051ae4ee36ff8b237395ecf3d"}, - {file = "Cython-3.0.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f29307463eba53747b31f71394ed087e3e3e264dcc433e62de1d51f5c0c966c"}, - {file = "Cython-3.0.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53328a8af0806bebbdb48a4191883b11ee9d9dfb084d84f58fa5a8ab58baefc9"}, - {file = "Cython-3.0.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5962e70b15e863e72bed6910e8c6ffef77d36cc98e2b31c474378f3b9e49b0e3"}, - {file = "Cython-3.0.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9e69139f4e60ab14c50767a568612ea64d6907e9c8e0289590a170eb495e005f"}, - {file = "Cython-3.0.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c40bdbcb2286f0aeeb5df9ce53d45da2d2a9b36a16b331cd0809d212d22a8fc7"}, - {file = "Cython-3.0.0-cp312-cp312-win32.whl", hash = "sha256:8abb8915eb2e57fa53d918afe641c05d1bcc6ed1913682ec1f28de71f4e3f398"}, - {file = "Cython-3.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:30a4bd2481e59bd7ab2539f835b78edc19fc455811e476916f56026b93afd28b"}, - {file = "Cython-3.0.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0e1e4b7e4bfbf22fecfa5b852f0e499c442d4853b7ebd33ae37cdec9826ed5d8"}, - {file = "Cython-3.0.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b00df42cdd1a285a64491ba23de08ab14169d3257c840428d40eb7e8e9979af"}, - {file = "Cython-3.0.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:650d03ddddc08b051b4659778733f0f173ca7d327415755c05d265a6c1ba02fb"}, - {file = "Cython-3.0.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4965f2ebade17166f21a508d66dd60d2a0b3a3b90abe3f72003baa17ae020dd6"}, - {file = "Cython-3.0.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:4123c8d03167803df31da6b39de167cb9c04ac0aa4e35d4e5aa9d08ad511b84d"}, - {file = "Cython-3.0.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:296c53b6c0030cf82987eef163444e8d7631cc139d995f9d58679d9fd1ddbf31"}, - {file = "Cython-3.0.0-cp36-cp36m-win32.whl", hash = "sha256:0d2c1e172f1c81bafcca703093608e10dc16e3e2d24c5644c17606c7fdb1792c"}, - {file = "Cython-3.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:bc816d8eb3686d6f8d165f4156bac18c1147e1035dc28a76742d0b7fb5b7c032"}, - {file = "Cython-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8d86651347bbdbac1aca1824696c5e4c0a3b162946c422edcca2be12a03744d1"}, - {file = "Cython-3.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84176bd04ce9f3cc8799b47ec6d1959fa1ea5e71424507df7bbf0b0915bbedef"}, - {file = "Cython-3.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35abcf07b8277ec95bbe49a07b5c8760a2d941942ccfe759a94c8d2fe5602e9f"}, - {file = "Cython-3.0.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a44d6b9a29b2bff38bb648577b2fcf6a68cf8b1783eee89c2eb749f69494b98d"}, - {file = "Cython-3.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4dc6bbe7cf079db37f1ebb9b0f10d0d7f29e293bb8688e92d50b5ea7a91d82f3"}, - {file = "Cython-3.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e28763e75e380b8be62b02266a7995a781997c97c119efbdccb8fb954bcd7574"}, - {file = "Cython-3.0.0-cp37-cp37m-win32.whl", hash = "sha256:edae615cb4af51d5173e76ba9aea212424d025c57012e9cdf2f131f774c5ba71"}, - {file = "Cython-3.0.0-cp37-cp37m-win_amd64.whl", hash = "sha256:20c604e974832aaf8b7a1f5455ee7274b34df62a35ee095cd7d2ed7e818e6c53"}, - {file = "Cython-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c85fd2b1cbd9400d60ebe074795bb9a9188752f1612be3b35b0831a24879b91f"}, - {file = "Cython-3.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:090256c687106932339f87f888b95f0d69c617bc9b18801555545b695d29d8ab"}, - {file = "Cython-3.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cec2a67a0a7d9d4399758c0657ca03e5912e37218859cfbf046242cc532bfb3b"}, - {file = "Cython-3.0.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1cdd01ce45333bc264a218c6e183700d6b998f029233f586a53c9b13455c2d2"}, - {file = "Cython-3.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ecee663d2d50ca939fc5db81f2f8a219c2417b4651ad84254c50a03a9cb1aadd"}, - {file = "Cython-3.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:30f10e79393b411af7677c270ea69807acb9fc30205c8ff25561f4deef780ec1"}, - {file = "Cython-3.0.0-cp38-cp38-win32.whl", hash = "sha256:609777d3a7a0a23b225e84d967af4ad2485c8bdfcacef8037cf197e87d431ca0"}, - {file = "Cython-3.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:7f4a6dfd42ae0a45797f50fc4f6add702abf46ab3e7cd61811a6c6a97a40e1a2"}, - {file = "Cython-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2d8158277c8942c0b20ff4c074fe6a51c5b89e6ac60cef606818de8c92773596"}, - {file = "Cython-3.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:54e34f99b2a8c1e11478541b2822e6408c132b98b6b8f5ed89411e5e906631ea"}, - {file = "Cython-3.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:877d1c8745df59dd2061a0636c602729e9533ba13f13aa73a498f68662e1cbde"}, - {file = "Cython-3.0.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204690be60f0ff32eb70b04f28ef0d1e50ffd7b3f77ba06a7dc2389ee3b848e0"}, - {file = "Cython-3.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:06fcb4628ccce2ba5abc8630adbeaf4016f63a359b4c6c3827b2d80e0673981c"}, - {file = "Cython-3.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:090e24cfa31c926d0b13d8bb2ef48175acdd061ae1413343c94a2b12a4a4fa6f"}, - {file = "Cython-3.0.0-cp39-cp39-win32.whl", hash = "sha256:4cd00f2158dc00f7f93a92444d0f663eda124c9c29bbbd658964f4e89c357fe8"}, - {file = "Cython-3.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:5b4cc896d49ce2bae8d6a030f9a4c64965b59c38acfbf4617685e17f7fcf1731"}, - {file = "Cython-3.0.0-py2.py3-none-any.whl", hash = "sha256:ff1aef1a03cfe293237c7a86ae9625b0411b2df30c53d1a7f29a8d381f38a1df"}, - {file = "Cython-3.0.0.tar.gz", hash = "sha256:350b18f9673e63101dbbfcf774ee2f57c20ac4636d255741d76ca79016b1bd82"}, -] - -[[package]] -name = "dash" -version = "2.9.3" -description = "A Python framework for building reactive web-apps. Developed by Plotly." -optional = true -python-versions = ">=3.6" -files = [ - {file = "dash-2.9.3-py3-none-any.whl", hash = "sha256:a749ae1ea9de3fe7b785353a818ec9b629d39c6b7e02462954203bd1e296fd0e"}, - {file = "dash-2.9.3.tar.gz", hash = "sha256:47392f8d6455dc989a697407eb5941f3bad80604df985ab1ac9d4244568ffb34"}, -] - -[package.dependencies] -dash-core-components = "2.0.0" -dash-html-components = "2.0.0" -dash-table = "5.0.0" -Flask = ">=1.0.4" -plotly = ">=5.0.0" - -[package.extras] -celery = ["celery[redis] (>=5.1.2)", "importlib-metadata (<5)", "redis (>=3.5.3)"] -ci = ["black (==21.6b0)", "black (==22.3.0)", "dash-dangerously-set-inner-html", "dash-flow-example (==0.0.5)", "flake8 (==3.9.2)", "flaky (==3.7.0)", "flask-talisman (==1.0.0)", "isort (==4.3.21)", "mimesis", "mock (==4.0.3)", "numpy", "openpyxl", "orjson (==3.5.4)", "orjson (==3.6.7)", "pandas (==1.1.5)", "pandas (>=1.4.0)", "preconditions", "pyarrow", "pyarrow (<3)", "pylint (==2.13.5)", "pytest-mock", "pytest-rerunfailures", "pytest-sugar (==0.9.6)", "xlrd (<2)", "xlrd (>=2.0.1)"] -compress = ["flask-compress"] -dev = ["PyYAML (>=5.4.1)", "coloredlogs (>=15.0.1)", "fire (>=0.4.0)"] -diskcache = ["diskcache (>=5.2.1)", "multiprocess (>=0.70.12)", "psutil (>=5.8.0)"] -testing = ["beautifulsoup4 (>=4.8.2)", "cryptography (<3.4)", "dash-testing-stub (>=0.0.2)", "lxml (>=4.6.2)", "multiprocess (>=0.70.12)", "percy (>=2.0.2)", "psutil (>=5.8.0)", "pytest (>=6.0.2)", "requests[security] (>=2.21.0)", "selenium (>=3.141.0,<=4.2.0)", "waitress (>=1.4.4)"] - -[[package]] -name = "dash-core-components" -version = "2.0.0" -description = "Core component suite for Dash" -optional = true -python-versions = "*" -files = [ - {file = "dash_core_components-2.0.0-py3-none-any.whl", hash = "sha256:52b8e8cce13b18d0802ee3acbc5e888cb1248a04968f962d63d070400af2e346"}, - {file = "dash_core_components-2.0.0.tar.gz", hash = "sha256:c6733874af975e552f95a1398a16c2ee7df14ce43fa60bb3718a3c6e0b63ffee"}, -] - -[[package]] -name = "dash-html-components" -version = "2.0.0" -description = "Vanilla HTML components for Dash" -optional = true -python-versions = "*" -files = [ - {file = "dash_html_components-2.0.0-py3-none-any.whl", hash = "sha256:b42cc903713c9706af03b3f2548bda4be7307a7cf89b7d6eae3da872717d1b63"}, - {file = "dash_html_components-2.0.0.tar.gz", hash = "sha256:8703a601080f02619a6390998e0b3da4a5daabe97a1fd7a9cebc09d015f26e50"}, -] - -[[package]] -name = "dash-table" -version = "5.0.0" -description = "Dash table" -optional = true -python-versions = "*" -files = [ - {file = "dash_table-5.0.0-py3-none-any.whl", hash = "sha256:19036fa352bb1c11baf38068ec62d172f0515f73ca3276c79dee49b95ddc16c9"}, - {file = "dash_table-5.0.0.tar.gz", hash = "sha256:18624d693d4c8ef2ddec99a6f167593437a7ea0bf153aa20f318c170c5bc7308"}, + {file = "Cython-3.0.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e876272548d73583e90babda94c1299537006cad7a34e515a06c51b41f8657aa"}, + {file = "Cython-3.0.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:adc377aa33c3309191e617bf675fdbb51ca727acb9dc1aa23fc698d8121f7e23"}, + {file = "Cython-3.0.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:401aba1869a57aba2922ccb656a6320447e55ace42709b504c2f8e8b166f46e1"}, + {file = "Cython-3.0.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:541fbe725d6534a90b93f8c577eb70924d664b227a4631b90a6e0506d1469591"}, + {file = "Cython-3.0.10-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:86998b01f6a6d48398df8467292c7637e57f7e3a2ca68655367f13f66fed7734"}, + {file = "Cython-3.0.10-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d092c0ddba7e9e530a5c5be4ac06db8360258acc27675d1fc86294a5dc8994c5"}, + {file = "Cython-3.0.10-cp310-cp310-win32.whl", hash = "sha256:3cffb666e649dba23810732497442fb339ee67ba4e0be1f0579991e83fcc2436"}, + {file = "Cython-3.0.10-cp310-cp310-win_amd64.whl", hash = "sha256:9ea31184c7b3a728ef1f81fccb161d8948c05aa86c79f63b74fb6f3ddec860ec"}, + {file = "Cython-3.0.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:051069638abfb076900b0c2bcb6facf545655b3f429e80dd14365192074af5a4"}, + {file = "Cython-3.0.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:712760879600907189c7d0d346851525545484e13cd8b787e94bfd293da8ccf0"}, + {file = "Cython-3.0.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38d40fa1324ac47c04483d151f5e092406a147eac88a18aec789cf01c089c3f2"}, + {file = "Cython-3.0.10-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bd49a3a9fdff65446a3e1c2bfc0ec85c6ce4c3cad27cd4ad7ba150a62b7fb59"}, + {file = "Cython-3.0.10-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e8df79b596633b8295eaa48b1157d796775c2bb078f32267d32f3001b687f2fd"}, + {file = "Cython-3.0.10-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bcc9795990e525c192bc5c0775e441d7d56d7a7d02210451e9e13c0448dba51b"}, + {file = "Cython-3.0.10-cp311-cp311-win32.whl", hash = "sha256:09f2000041db482cad3bfce94e1fa3a4c82b0e57390a164c02566cbbda8c4f12"}, + {file = "Cython-3.0.10-cp311-cp311-win_amd64.whl", hash = "sha256:3919a55ec9b6c7db6f68a004c21c05ed540c40dbe459ced5d801d5a1f326a053"}, + {file = "Cython-3.0.10-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8f2864ab5fcd27a346f0b50f901ebeb8f60b25a60a575ccfd982e7f3e9674914"}, + {file = "Cython-3.0.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:407840c56385b9c085826fe300213e0e76ba15d1d47daf4b58569078ecb94446"}, + {file = "Cython-3.0.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a036d00caa73550a3a976432ef21c1e3fa12637e1616aab32caded35331ae96"}, + {file = "Cython-3.0.10-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9cc6a0e7e23a96dec3f3c9d39690d4281beabd5297855140d0d30855f950275e"}, + {file = "Cython-3.0.10-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:a5e14a8c6a8157d2b0cdc2e8e3444905d20a0e78e19d2a097e89fb8b04b51f6b"}, + {file = "Cython-3.0.10-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:f8a2b8fa0fd8358bccb5f3304be563c4750aae175100463d212d5ea0ec74cbe0"}, + {file = "Cython-3.0.10-cp312-cp312-win32.whl", hash = "sha256:2d29e617fd23cf4b83afe8f93f2966566c9f565918ad1e86a4502fe825cc0a79"}, + {file = "Cython-3.0.10-cp312-cp312-win_amd64.whl", hash = "sha256:6c5af936940a38c300977b81598d9c0901158f220a58c177820e17e1774f1cf1"}, + {file = "Cython-3.0.10-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:5f465443917d5c0f69825fca3b52b64c74ac3de0143b1fff6db8ba5b48c9fb4a"}, + {file = "Cython-3.0.10-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fadb84193c25641973666e583df8df4e27c52cdc05ddce7c6f6510d690ba34a"}, + {file = "Cython-3.0.10-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fa9e7786083b6aa61594c16979d621b62e61fcd9c2edd4761641b95c7fb34b2"}, + {file = "Cython-3.0.10-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4780d0f98ce28191c4d841c4358b5d5e79d96520650910cd59904123821c52d"}, + {file = "Cython-3.0.10-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:32fbad02d1189be75eb96456d9c73f5548078e5338d8fa153ecb0115b6ee279f"}, + {file = "Cython-3.0.10-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:90e2f514fc753b55245351305a399463103ec18666150bb1c36779b9862388e9"}, + {file = "Cython-3.0.10-cp36-cp36m-win32.whl", hash = "sha256:a9c976e9ec429539a4367cb4b24d15a1e46b925976f4341143f49f5f161171f5"}, + {file = "Cython-3.0.10-cp36-cp36m-win_amd64.whl", hash = "sha256:a9bb402674788a7f4061aeef8057632ec440123e74ed0fb425308a59afdfa10e"}, + {file = "Cython-3.0.10-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:206e803598010ecc3813db8748ed685f7beeca6c413f982df9f8a505fce56563"}, + {file = "Cython-3.0.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15b6d397f4ee5ad54e373589522af37935a32863f1b23fa8c6922adf833e28e2"}, + {file = "Cython-3.0.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a181144c2f893ed8e6a994d43d0b96300bc99873f21e3b7334ca26c61c37b680"}, + {file = "Cython-3.0.10-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b74b700d6a793113d03fb54b63bdbadba6365379424bac7c0470605672769260"}, + {file = "Cython-3.0.10-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:076e9fd4e0ca33c5fa00a7479180dbfb62f17fe928e2909f82da814536e96d2b"}, + {file = "Cython-3.0.10-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:269f06e6961e8591d56e30b46e1a51b6ccb42cab04c29fa3b30d3e8723485fb4"}, + {file = "Cython-3.0.10-cp37-cp37m-win32.whl", hash = "sha256:d4e83a8ceff7af60064da4ccfce0ac82372544dd5392f1b350c34f1b04d0fae6"}, + {file = "Cython-3.0.10-cp37-cp37m-win_amd64.whl", hash = "sha256:40fac59c3a7fbcd9c25aea64c342c890a5e2270ce64a1525e840807800167799"}, + {file = "Cython-3.0.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f43a58bf2434870d2fc42ac2e9ff8138c9e00c6251468de279d93fa279e9ba3b"}, + {file = "Cython-3.0.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e9a885ec63d3955a08cefc4eec39fefa9fe14989c6e5e2382bd4aeb6bdb9bc3"}, + {file = "Cython-3.0.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acfbe0fff364d54906058fc61f2393f38cd7fa07d344d80923937b87e339adcf"}, + {file = "Cython-3.0.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8adcde00a8a88fab27509b558cd8c2959ab0c70c65d3814cfea8c68b83fa6dcd"}, + {file = "Cython-3.0.10-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2c9c1e3e78909488f3b16fabae02308423fa6369ed96ab1e250807d344cfffd7"}, + {file = "Cython-3.0.10-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fc6e0faf5b57523b073f0cdefadcaef3a51235d519a0594865925cadb3aeadf0"}, + {file = "Cython-3.0.10-cp38-cp38-win32.whl", hash = "sha256:35f6ede7c74024ed1982832ae61c9fad7cf60cc3f5b8c6a63bb34e38bc291936"}, + {file = "Cython-3.0.10-cp38-cp38-win_amd64.whl", hash = "sha256:950c0c7b770d2a7cec74fb6f5ccc321d0b51d151f48c075c0d0db635a60ba1b5"}, + {file = "Cython-3.0.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:077b61ee789e48700e25d4a16daa4258b8e65167136e457174df400cf9b4feab"}, + {file = "Cython-3.0.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64f1f8bba9d8f37c0cffc934792b4ac7c42d0891077127c11deebe9fa0a0f7e4"}, + {file = "Cython-3.0.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:651a15a8534ebfb9b58cb0b87c269c70984b6f9c88bfe65e4f635f0e3f07dfcd"}, + {file = "Cython-3.0.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d10fc9aa82e5e53a0b7fd118f9771199cddac8feb4a6d8350b7d4109085aa775"}, + {file = "Cython-3.0.10-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4f610964ab252a83e573a427e28b103e2f1dd3c23bee54f32319f9e73c3c5499"}, + {file = "Cython-3.0.10-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8c9c4c4f3ab8f8c02817b0e16e8fa7b8cc880f76e9b63fe9c010e60c1a6c2b13"}, + {file = "Cython-3.0.10-cp39-cp39-win32.whl", hash = "sha256:0bac3ccdd4e03924028220c62ae3529e17efa8ca7e9df9330de95de02f582b26"}, + {file = "Cython-3.0.10-cp39-cp39-win_amd64.whl", hash = "sha256:81f356c1c8c0885b8435bfc468025f545c5d764aa9c75ab662616dd1193c331e"}, + {file = "Cython-3.0.10-py2.py3-none-any.whl", hash = "sha256:fcbb679c0b43514d591577fd0d20021c55c240ca9ccafbdb82d3fb95e5edfee2"}, + {file = "Cython-3.0.10.tar.gz", hash = "sha256:dcc96739331fb854dcf503f94607576cfe8488066c61ca50dfd55836f132de99"}, ] [[package]] name = "dateparser" -version = "1.1.8" +version = "1.2.0" description = "Date parsing library designed to parse dates from HTML pages" optional = false python-versions = ">=3.7" files = [ - {file = "dateparser-1.1.8-py2.py3-none-any.whl", hash = "sha256:070b29b5bbf4b1ec2cd51c96ea040dc68a614de703910a91ad1abba18f9f379f"}, - {file = "dateparser-1.1.8.tar.gz", hash = "sha256:86b8b7517efcc558f085a142cdb7620f0921543fcabdb538c8a4c4001d8178e3"}, + {file = "dateparser-1.2.0-py2.py3-none-any.whl", hash = "sha256:0b21ad96534e562920a0083e97fd45fa959882d4162acc358705144520a35830"}, + {file = "dateparser-1.2.0.tar.gz", hash = "sha256:7975b43a4222283e0ae15be7b4999d08c9a70e2d378ac87385b1ccf2cffbbb30"}, ] [package.dependencies] @@ -1768,13 +1791,13 @@ langdetect = ["langdetect"] [[package]] name = "datetime" -version = "5.2" +version = "5.5" description = "This package provides a DateTime data type, as known from Zope. Unless you need to communicate with Zope APIs, you're probably better off using Python's built-in datetime module." optional = false python-versions = ">=3.7" files = [ - {file = "DateTime-5.2-py3-none-any.whl", hash = "sha256:25250fb36f7184dad805faaf3f012e0b36f353cd97518e8f232babef5c53596e"}, - {file = "DateTime-5.2.tar.gz", hash = "sha256:63194d2184de10e0b41e76596ba6538bd1d89db6f7b3c182789c75b0ac5c6697"}, + {file = "DateTime-5.5-py3-none-any.whl", hash = "sha256:0abf6c51cb4ba7cee775ca46ccc727f3afdde463be28dbbe8803631fefd4a120"}, + {file = "DateTime-5.5.tar.gz", hash = "sha256:21ec6331f87a7fcb57bd7c59e8a68bfffe6fcbf5acdbbc7b356d6a9a020191d3"}, ] [package.dependencies] @@ -1783,29 +1806,33 @@ pytz = "*" [[package]] name = "debugpy" -version = "1.6.7" +version = "1.8.1" description = "An implementation of the Debug Adapter Protocol for Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "debugpy-1.6.7-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b3e7ac809b991006ad7f857f016fa92014445085711ef111fdc3f74f66144096"}, - {file = "debugpy-1.6.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3876611d114a18aafef6383695dfc3f1217c98a9168c1aaf1a02b01ec7d8d1e"}, - {file = "debugpy-1.6.7-cp310-cp310-win32.whl", hash = "sha256:33edb4afa85c098c24cc361d72ba7c21bb92f501104514d4ffec1fb36e09c01a"}, - {file = "debugpy-1.6.7-cp310-cp310-win_amd64.whl", hash = "sha256:ed6d5413474e209ba50b1a75b2d9eecf64d41e6e4501977991cdc755dc83ab0f"}, - {file = "debugpy-1.6.7-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:38ed626353e7c63f4b11efad659be04c23de2b0d15efff77b60e4740ea685d07"}, - {file = "debugpy-1.6.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279d64c408c60431c8ee832dfd9ace7c396984fd7341fa3116aee414e7dcd88d"}, - {file = "debugpy-1.6.7-cp37-cp37m-win32.whl", hash = "sha256:dbe04e7568aa69361a5b4c47b4493d5680bfa3a911d1e105fbea1b1f23f3eb45"}, - {file = "debugpy-1.6.7-cp37-cp37m-win_amd64.whl", hash = "sha256:f90a2d4ad9a035cee7331c06a4cf2245e38bd7c89554fe3b616d90ab8aab89cc"}, - {file = "debugpy-1.6.7-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:5224eabbbeddcf1943d4e2821876f3e5d7d383f27390b82da5d9558fd4eb30a9"}, - {file = "debugpy-1.6.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae1123dff5bfe548ba1683eb972329ba6d646c3a80e6b4c06cd1b1dd0205e9b"}, - {file = "debugpy-1.6.7-cp38-cp38-win32.whl", hash = "sha256:9cd10cf338e0907fdcf9eac9087faa30f150ef5445af5a545d307055141dd7a4"}, - {file = "debugpy-1.6.7-cp38-cp38-win_amd64.whl", hash = "sha256:aaf6da50377ff4056c8ed470da24632b42e4087bc826845daad7af211e00faad"}, - {file = "debugpy-1.6.7-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:0679b7e1e3523bd7d7869447ec67b59728675aadfc038550a63a362b63029d2c"}, - {file = "debugpy-1.6.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de86029696e1b3b4d0d49076b9eba606c226e33ae312a57a46dca14ff370894d"}, - {file = "debugpy-1.6.7-cp39-cp39-win32.whl", hash = "sha256:d71b31117779d9a90b745720c0eab54ae1da76d5b38c8026c654f4a066b0130a"}, - {file = "debugpy-1.6.7-cp39-cp39-win_amd64.whl", hash = "sha256:c0ff93ae90a03b06d85b2c529eca51ab15457868a377c4cc40a23ab0e4e552a3"}, - {file = "debugpy-1.6.7-py2.py3-none-any.whl", hash = "sha256:53f7a456bc50706a0eaabecf2d3ce44c4d5010e46dfc65b6b81a518b42866267"}, - {file = "debugpy-1.6.7.zip", hash = "sha256:c4c2f0810fa25323abfdfa36cbbbb24e5c3b1a42cb762782de64439c575d67f2"}, + {file = "debugpy-1.8.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:3bda0f1e943d386cc7a0e71bfa59f4137909e2ed947fb3946c506e113000f741"}, + {file = "debugpy-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dda73bf69ea479c8577a0448f8c707691152e6c4de7f0c4dec5a4bc11dee516e"}, + {file = "debugpy-1.8.1-cp310-cp310-win32.whl", hash = "sha256:3a79c6f62adef994b2dbe9fc2cc9cc3864a23575b6e387339ab739873bea53d0"}, + {file = "debugpy-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:7eb7bd2b56ea3bedb009616d9e2f64aab8fc7000d481faec3cd26c98a964bcdd"}, + {file = "debugpy-1.8.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:016a9fcfc2c6b57f939673c874310d8581d51a0fe0858e7fac4e240c5eb743cb"}, + {file = "debugpy-1.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd97ed11a4c7f6d042d320ce03d83b20c3fb40da892f994bc041bbc415d7a099"}, + {file = "debugpy-1.8.1-cp311-cp311-win32.whl", hash = "sha256:0de56aba8249c28a300bdb0672a9b94785074eb82eb672db66c8144fff673146"}, + {file = "debugpy-1.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:1a9fe0829c2b854757b4fd0a338d93bc17249a3bf69ecf765c61d4c522bb92a8"}, + {file = "debugpy-1.8.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3ebb70ba1a6524d19fa7bb122f44b74170c447d5746a503e36adc244a20ac539"}, + {file = "debugpy-1.8.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2e658a9630f27534e63922ebf655a6ab60c370f4d2fc5c02a5b19baf4410ace"}, + {file = "debugpy-1.8.1-cp312-cp312-win32.whl", hash = "sha256:caad2846e21188797a1f17fc09c31b84c7c3c23baf2516fed5b40b378515bbf0"}, + {file = "debugpy-1.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:edcc9f58ec0fd121a25bc950d4578df47428d72e1a0d66c07403b04eb93bcf98"}, + {file = "debugpy-1.8.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:7a3afa222f6fd3d9dfecd52729bc2e12c93e22a7491405a0ecbf9e1d32d45b39"}, + {file = "debugpy-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d915a18f0597ef685e88bb35e5d7ab968964b7befefe1aaea1eb5b2640b586c7"}, + {file = "debugpy-1.8.1-cp38-cp38-win32.whl", hash = "sha256:92116039b5500633cc8d44ecc187abe2dfa9b90f7a82bbf81d079fcdd506bae9"}, + {file = "debugpy-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:e38beb7992b5afd9d5244e96ad5fa9135e94993b0c551ceebf3fe1a5d9beb234"}, + {file = "debugpy-1.8.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:bfb20cb57486c8e4793d41996652e5a6a885b4d9175dd369045dad59eaacea42"}, + {file = "debugpy-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd3fdd3f67a7e576dd869c184c5dd71d9aaa36ded271939da352880c012e703"}, + {file = "debugpy-1.8.1-cp39-cp39-win32.whl", hash = "sha256:58911e8521ca0c785ac7a0539f1e77e0ce2df753f786188f382229278b4cdf23"}, + {file = "debugpy-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:6df9aa9599eb05ca179fb0b810282255202a66835c6efb1d112d21ecb830ddd3"}, + {file = "debugpy-1.8.1-py2.py3-none-any.whl", hash = "sha256:28acbe2241222b87e255260c76741e1fbf04fdc3b6d094fcf57b6c6f75ce1242"}, + {file = "debugpy-1.8.1.zip", hash = "sha256:f696d6be15be87aef621917585f9bb94b1dc9e8aced570db1b8a6fc14e8f9b42"}, ] [[package]] @@ -1843,51 +1870,49 @@ files = [ [[package]] name = "dill" -version = "0.3.6" -description = "serialize all of python" +version = "0.3.8" +description = "serialize all of Python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, - {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, + {file = "dill-0.3.8-py3-none-any.whl", hash = "sha256:c36ca9ffb54365bdd2f8eb3eff7d2a21237f8452b57ace88b1ac615b7e815bd7"}, + {file = "dill-0.3.8.tar.gz", hash = "sha256:3ebe3c479ad625c4553aca177444d89b486b1d84982eeacded644afc0cf797ca"}, ] [package.extras] graph = ["objgraph (>=1.7.2)"] +profile = ["gprof2dot (>=2022.7.29)"] [[package]] name = "distlib" -version = "0.3.7" +version = "0.3.8" description = "Distribution utilities" optional = false python-versions = "*" files = [ - {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, - {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, + {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, + {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, ] [[package]] name = "dnspython" -version = "2.4.0" +version = "2.6.1" description = "DNS toolkit" optional = false -python-versions = ">=3.8,<4.0" +python-versions = ">=3.8" files = [ - {file = "dnspython-2.4.0-py3-none-any.whl", hash = "sha256:46b4052a55b56beea3a3bdd7b30295c292bd6827dd442348bc116f2d35b17f0a"}, - {file = "dnspython-2.4.0.tar.gz", hash = "sha256:758e691dbb454d5ccf4e1b154a19e52847f79e21a42fef17b969144af29a4e6c"}, + {file = "dnspython-2.6.1-py3-none-any.whl", hash = "sha256:5ef3b9680161f6fa89daf8ad451b5f1a33b18ae8a1c6778cdf4b43f08c0a6e50"}, + {file = "dnspython-2.6.1.tar.gz", hash = "sha256:e8f0f9c23a7b7cb99ded64e6c3a6f3e701d78f50c55e002b839dea7225cff7cc"}, ] -[package.dependencies] -httpcore = {version = ">=0.17.3", markers = "python_version >= \"3.8\""} -sniffio = ">=1.1,<2.0" - [package.extras] -dnssec = ["cryptography (>=2.6,<42.0)"] -doh = ["h2 (>=4.1.0)", "httpx (>=0.24.1)"] -doq = ["aioquic (>=0.9.20)"] -idna = ["idna (>=2.1,<4.0)"] -trio = ["trio (>=0.14,<0.23)"] -wmi = ["wmi (>=1.5.1,<2.0.0)"] +dev = ["black (>=23.1.0)", "coverage (>=7.0)", "flake8 (>=7)", "mypy (>=1.8)", "pylint (>=3)", "pytest (>=7.4)", "pytest-cov (>=4.1.0)", "sphinx (>=7.2.0)", "twine (>=4.0.0)", "wheel (>=0.42.0)"] +dnssec = ["cryptography (>=41)"] +doh = ["h2 (>=4.1.0)", "httpcore (>=1.0.0)", "httpx (>=0.26.0)"] +doq = ["aioquic (>=0.9.25)"] +idna = ["idna (>=3.6)"] +trio = ["trio (>=0.23)"] +wmi = ["wmi (>=1.5.1)"] [[package]] name = "docstring-parser" @@ -1902,13 +1927,13 @@ files = [ [[package]] name = "docstring-to-markdown" -version = "0.12" +version = "0.15" description = "On the fly conversion of Python docstrings to markdown" optional = true python-versions = ">=3.6" files = [ - {file = "docstring-to-markdown-0.12.tar.gz", hash = "sha256:40004224b412bd6f64c0f3b85bb357a41341afd66c4b4896709efa56827fb2bb"}, - {file = "docstring_to_markdown-0.12-py3-none-any.whl", hash = "sha256:7df6311a887dccf9e770f51242ec002b19f0591994c4783be49d24cdc1df3737"}, + {file = "docstring-to-markdown-0.15.tar.gz", hash = "sha256:e146114d9c50c181b1d25505054a8d0f7a476837f0da2c19f07e06eaed52b73d"}, + {file = "docstring_to_markdown-0.15-py3-none-any.whl", hash = "sha256:27afb3faedba81e34c33521c32bbd258d7fbb79eedf7d29bc4e81080e854aec0"}, ] [[package]] @@ -1924,13 +1949,13 @@ files = [ [[package]] name = "ecdsa" -version = "0.18.0" +version = "0.19.0" description = "ECDSA cryptographic signature library (pure python)" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.6" files = [ - {file = "ecdsa-0.18.0-py2.py3-none-any.whl", hash = "sha256:80600258e7ed2f16b9aa1d7c295bd70194109ad5a30fdee0eaeefef1d4c559dd"}, - {file = "ecdsa-0.18.0.tar.gz", hash = "sha256:190348041559e21b22a1d65cee485282ca11a6f81d503fddb84d5017e9ed1e49"}, + {file = "ecdsa-0.19.0-py2.py3-none-any.whl", hash = "sha256:2cea9b88407fdac7bbeca0833b189e4c9c53f2ef1e1eaa29f6224dbc809b707a"}, + {file = "ecdsa-0.19.0.tar.gz", hash = "sha256:60eaad1199659900dd0af521ed462b793bbdf867432b3948e87416ae4caf6bf8"}, ] [package.dependencies] @@ -1942,27 +1967,30 @@ gmpy2 = ["gmpy2"] [[package]] name = "ecos" -version = "2.0.12" +version = "2.0.13" description = "This is the Python package for ECOS: Embedded Cone Solver. See Github page for more information." optional = true python-versions = "*" files = [ - {file = "ecos-2.0.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:835298a299c88c207b3402fba60ad9b5688b59bbbf2ac34a46de5b37165d773a"}, - {file = "ecos-2.0.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608bc822ee8e070927ab3519169b13a1a0fe88f3d562212d6b5dbb1039776360"}, - {file = "ecos-2.0.12-cp310-cp310-win_amd64.whl", hash = "sha256:5184a9d8521ad1af90ffcd9902a6fa75c7bc473f37d30d86f97beda1033dfca2"}, - {file = "ecos-2.0.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eba07599084724eedc20b2862d5580eebebb09609f4740baadc78401cb99827c"}, - {file = "ecos-2.0.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4979dc2d1cb6667e371a45a61887068505c1305437eef104ed6ef16f4b6aa0e3"}, - {file = "ecos-2.0.12-cp311-cp311-win_amd64.whl", hash = "sha256:da8fbbca3feb83a9e27075d29b3765417d0c80af8ea83cbdc4a558cae7b564af"}, - {file = "ecos-2.0.12-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f70e4547966f530fd7715756f7a65d5b9b90b312b9d37f243ef9356c05e7d74c"}, - {file = "ecos-2.0.12-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:617be25d74222849622b0f82b94a11abcf1fae78ccaf69977b328321ee6ffa0b"}, - {file = "ecos-2.0.12-cp37-cp37m-win_amd64.whl", hash = "sha256:29d00164eaea66ed54697a3b361c575284a8bca54f2623381a0635806c7303a7"}, - {file = "ecos-2.0.12-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4e86671397d1d2cd7cccff8a9c45be0541b0c60af8b92a0ff3581c9ed869db67"}, - {file = "ecos-2.0.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:858a4dd3177bdc8cc6e362031732f5177b62138a1e4ef91c0dc3c6bd7d2d1248"}, - {file = "ecos-2.0.12-cp38-cp38-win_amd64.whl", hash = "sha256:528b02f53835bd1baeb2e23f8153b8d6cc2b3704e1768be6a1a972f542241670"}, - {file = "ecos-2.0.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3e42bd4c19af6e04f76ccc85d941b1f1adc7faeee4d06d482395a6beb7bec895"}, - {file = "ecos-2.0.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6def54336a15b5a49bc3bfcaa36035e8557cae8a4853b17ca84f5a29c93bcaea"}, - {file = "ecos-2.0.12-cp39-cp39-win_amd64.whl", hash = "sha256:7af08941552fce108bd80145cdb6be7fa74477a20bacdac170800442cc7027d4"}, - {file = "ecos-2.0.12.tar.gz", hash = "sha256:f48816d73b87ae325556ea537b7c8743187311403c80e3832035224156337c4e"}, + {file = "ecos-2.0.13-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a1c1acf33b70f8657c25f07ec8d7b59bb01dbad39f072fa61fc956c2166ed979"}, + {file = "ecos-2.0.13-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ea88ee2c94192004d6be9c55a3c79f184eaba3bbf31474229045a1b0a8a1536"}, + {file = "ecos-2.0.13-cp310-cp310-win_amd64.whl", hash = "sha256:df8ae7fce79be9e5f79f0511c51a4824795de5154847fabe1a0288bc2ea349d3"}, + {file = "ecos-2.0.13-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88dd628bc6e77a069165fa5f50340e2856795c28e00e3fce213a04d7c41c584a"}, + {file = "ecos-2.0.13-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b2c969c7e22fd8a1d1cd0a90f4325d90572da23e2e923b0da6138ce62503d0"}, + {file = "ecos-2.0.13-cp311-cp311-win_amd64.whl", hash = "sha256:936890fb85a186360a5c8f228dd19acb760e234b38c598d0b46ab29644e31dfc"}, + {file = "ecos-2.0.13-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:62ed497ab56017f1d7264eb56223826a984462b1d84fb850d10f0bec3490877d"}, + {file = "ecos-2.0.13-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf2b1384012bee9e58e5a2373905d3644f74a0ea000b307a239366fe7850c29c"}, + {file = "ecos-2.0.13-cp312-cp312-win_amd64.whl", hash = "sha256:2c1ea09069e32185912506f946bb6d1f144841ba1d1cd0217c67f72cbdf7a8fd"}, + {file = "ecos-2.0.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b9f4a76a3e1165359e1704ec6b1b89d487858ec0d838d62a7268133d88221914"}, + {file = "ecos-2.0.13-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3c2d4e0d3ada1a619ddd62fbf48ccbe9b738fdbef119945fe2a05566d03b85a"}, + {file = "ecos-2.0.13-cp37-cp37m-win_amd64.whl", hash = "sha256:84c72e1e5ffa41cd38352dcf0a8c25418f5bf04ed76a576db0daaf9a69f5568f"}, + {file = "ecos-2.0.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1979f1f17ec7f1a0fc45964d02d762393f9f427d965fe8a893e7b1476a9023c3"}, + {file = "ecos-2.0.13-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:059e6c29c89f47a490353e4f9336e96350a5102a97e1d8a2aaff796bcbe50058"}, + {file = "ecos-2.0.13-cp38-cp38-win_amd64.whl", hash = "sha256:30c7d0cce6c830da5b9ea25af0d47b203255639524eb4d03d1331c600958c834"}, + {file = "ecos-2.0.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ba42c15f1d79eb2ada532e9781b4aeb3ed84b1c7e38239ba4d6502c6a092d5b1"}, + {file = "ecos-2.0.13-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32fb33185f6dd94a1c798bc481eb86c9f4e832efec91f6ab0584e2fc26fd375e"}, + {file = "ecos-2.0.13-cp39-cp39-win_amd64.whl", hash = "sha256:68995ab12d363576dddb2d1f91ead3b9c8a8ca61f29000f0b1daef1b4e7b5b64"}, + {file = "ecos-2.0.13.tar.gz", hash = "sha256:f2a9dc108ade7faf6f6f4fad245f4714b7293c8767d2a351ead59428a94a98b9"}, ] [package.dependencies] @@ -1982,89 +2010,94 @@ files = [ [[package]] name = "ephem" -version = "4.1.4" +version = "4.1.5" description = "Compute positions of the planets and stars" optional = true python-versions = "*" files = [ - {file = "ephem-4.1.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:024752ae7074c660630046929e12650cc6e72e1c11b7554ccefbe16f8ce3c48d"}, - {file = "ephem-4.1.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:158bf9fb2b58cb77c606687c9ad35dc82903ed00617a12c93dd2d89a65d6374d"}, - {file = "ephem-4.1.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11be09d245e77457e87988a4fdc811bdc6c5f1daaa73fb24289b220db720831d"}, - {file = "ephem-4.1.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:649bd2c85f5fc450136dacc0416af7127a07c0b2ce84bfdc89c1bc78129216a3"}, - {file = "ephem-4.1.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d6918b012365791b786ed0f30e8ea3941cbc49486dcf6c28d151f119c62d5be8"}, - {file = "ephem-4.1.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d343e9ca26f04a05b01fcaaf800224da5d15ad76902d7dc452c216e448293893"}, - {file = "ephem-4.1.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:d0403738f59aefe81ee5b0219cd909f2a05b03b7da465f9b233da57d3dea0de6"}, - {file = "ephem-4.1.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d61f38f35c25049ca2b95aa4e12e952e5ef56b31eac4a9d6d4e24aacf9373101"}, - {file = "ephem-4.1.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4039aa2f0b8c204283fc478551d8b29c9473137ad8a910a5ff60ae3be6593c7b"}, - {file = "ephem-4.1.4-cp310-cp310-win32.whl", hash = "sha256:8979429643ac4e29a5496321c9c41a20cd7a6a530aee9865c7fab0008450ef28"}, - {file = "ephem-4.1.4-cp310-cp310-win_amd64.whl", hash = "sha256:589a2235f49232b92ee0247923360a264086a57b2c39d4191348f95ba5ce0c3d"}, - {file = "ephem-4.1.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:feab5f68ae9fa622d6316790c9cfc399e8b78f7958a61da4edf2cb5e0e675d44"}, - {file = "ephem-4.1.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df9c482c8d25e69271311606b4de0e177e44ceb11781c7ebacf17cc5b391f832"}, - {file = "ephem-4.1.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cceea883856817f3ea3f73442e3be3a4a56558cdb77cc85d02db4429ce5ab16"}, - {file = "ephem-4.1.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f3e9ea626bc522fd4dd1ff795f0922fcb4c4eb57effe91b6284411166ddd1fd7"}, - {file = "ephem-4.1.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad22e769bd35415cad8f2ef6d4d875190d9bdad4fed2842fd19dac6f1ccb9dd"}, - {file = "ephem-4.1.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e3327218495235ec215ffe43253c0bf3fa982f59504b351c53b024f1c7b63752"}, - {file = "ephem-4.1.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d2c56238a1aec72a78ad7061f5c531df97a66ea0cca45204b6b8141c3bb1540e"}, - {file = "ephem-4.1.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fffe176bd94f4f61be5a54b54a966988cceb6ba69a6ed729aab166020fdb37c3"}, - {file = "ephem-4.1.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8f9b27117e7a82f7f70db9cb23b5cc36d37b166a2f73c55e14d7225d0ab95afa"}, - {file = "ephem-4.1.4-cp311-cp311-win32.whl", hash = "sha256:9bb21c0b117c9122c0141b0a71ee6fbbb087ed2aab4a7ab60f009e95e9f4a521"}, - {file = "ephem-4.1.4-cp311-cp311-win_amd64.whl", hash = "sha256:55d7fb5c34b2e453e01fa4ca7ee375b19b438c9401ae8c4099ae4a3a37656972"}, - {file = "ephem-4.1.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f9e24aeea560dfcece3c2e313eb94e6be3e84888091455e541fa88f3a44da584"}, - {file = "ephem-4.1.4-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:653d99386932e5f78bb9cfc4495030ad9f3345eb4c2b32dca55547da8f1f0332"}, - {file = "ephem-4.1.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:53786461a6d5799d5fffe76622ad51444b264d1c7263b92a6dfcac640c3da93a"}, - {file = "ephem-4.1.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:268f57f8768ccb0abbdf4cefb4781c7db812950019868f687b407b428513ee53"}, - {file = "ephem-4.1.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d630aa287255ea9fba6962f351e4e0729bb620570684d52fbfcc31b11527f09e"}, - {file = "ephem-4.1.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b5f229bbf62ecb4cd6bb3374b15d0f8ff7b3d970c2936fccd89bdf9d693907a2"}, - {file = "ephem-4.1.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:d60d56f182de54bd84fadd6ea2dd8e8ef6fdef6a698c7cafd404ecb6eeefa598"}, - {file = "ephem-4.1.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:404500c8d0030d75ec15bb6b98eee78ad163fd5252102c962ae6fb39c9488198"}, - {file = "ephem-4.1.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fb020d6cc5ab1ad1cd9d3da4a6e2506beebb41d1b337d79cc20cc0a17f550f1"}, - {file = "ephem-4.1.4-cp312-cp312-win32.whl", hash = "sha256:29e71636ee4719419d03184abc85085f76989c79a61844f5e60acbf2513d2b42"}, - {file = "ephem-4.1.4-cp312-cp312-win_amd64.whl", hash = "sha256:549654f63d88e0ab6248ae25ac2939131474ab9f3a91bee6b68ca6f214747c2a"}, - {file = "ephem-4.1.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:40067fc050c946c8d4c2d779805b61f063471a091e6124cbabcf61ac538011b2"}, - {file = "ephem-4.1.4-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e2abe97aa2b091090012768b4d94793213cc01f0bf040dcc311a380ab08df69"}, - {file = "ephem-4.1.4-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b2677d3a5b42aedc578de10b0eecdba6a50731f159cb28f7ad38c5f62143494"}, - {file = "ephem-4.1.4-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80a73da8ec61f86e5a97f73311159e61279dabdfbd17c9d4e2791a25a836f9ce"}, - {file = "ephem-4.1.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a146db114cfc942d123a38c301a8b8ca7eef2e37d2c5a4bd59e4abc99123c083"}, - {file = "ephem-4.1.4-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:4f3650c27c3ab6b73e2de7fd8de10e1c0d73f4683c9c5fb2e7113722ec2c2b53"}, - {file = "ephem-4.1.4-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:171fc5e7c4e9523f900dfd5ab6520bceb260a2b59fcb558d9aec17fd562b6251"}, - {file = "ephem-4.1.4-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:8974799afb37f17ac71e16e479d0e315d74bea4bed2becaf21d1b9304299bbaf"}, - {file = "ephem-4.1.4-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:3c39fb62c240f57533ea618295e510c44e466e74f2f4a899fbaa04b166b62d04"}, - {file = "ephem-4.1.4-cp36-cp36m-win32.whl", hash = "sha256:23e1432f021c69b2965c87a693ffd25caf08416e92bcb0fed91425083a374210"}, - {file = "ephem-4.1.4-cp36-cp36m-win_amd64.whl", hash = "sha256:86d6dda3581e61f6bad5479e26bca9e560671852ac00a5a8ed10f722635ddf71"}, - {file = "ephem-4.1.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e731c3e2f1767fab14e5d4077a3519f70afd22cb7dd113274c2850f8ef8ff828"}, - {file = "ephem-4.1.4-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c8b79b47c7be0d64013fb5d97dd6bbfb9bf63ae07b2ec917be19d3b4cc5782b8"}, - {file = "ephem-4.1.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89f759ce8e3489d15b9f3796d210196085dcb84cacdf24b2ece791b029245544"}, - {file = "ephem-4.1.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:daf1a1280102e14c718d684989da34151697a426522f8ae18b1081e8bad705c9"}, - {file = "ephem-4.1.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3da3b76d5d5e339461059c3314013c152ef569c798bfd578bcfb504b875a837"}, - {file = "ephem-4.1.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:aac0a0e41deb2a197cf67e800a3d0f4029139b9ce12bed148ffe994ec78593f9"}, - {file = "ephem-4.1.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:85809803e349bb4a0d56880067549abdc2b93fddf93ac3d55486040cbec1553f"}, - {file = "ephem-4.1.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:93d8f8b4e6206d3401dbdb0cdabb0d15c59cf9c2a7ee7c586da8c7dbf1f2a136"}, - {file = "ephem-4.1.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:5beaa0cb659951211aec33a7c132557a1a161dacf53f1b1493830489cfc68215"}, - {file = "ephem-4.1.4-cp37-cp37m-win32.whl", hash = "sha256:bbd4727498928ece694ec1b33023f16b6d050d9952d4052129b24e08e04d67fd"}, - {file = "ephem-4.1.4-cp37-cp37m-win_amd64.whl", hash = "sha256:39c710d73449b1c495b58d803da881363a0cae4b728de9fa332f77bcb4686ac8"}, - {file = "ephem-4.1.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24b7e90c731e851a56ab5e9d538915faaa54945e9b5211cfdf04e570fc27c529"}, - {file = "ephem-4.1.4-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab40ad7a5ccd66cad4161ca2295c04f01a74ec596c936c3af97a67733e2cd5bf"}, - {file = "ephem-4.1.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:555d63d70e36e46e43b955c37cdb0f8b82ee2051c575960c4b01948be9f04e5e"}, - {file = "ephem-4.1.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3a29de7c737047cc2412edada9d03b761339d3560d7db471cd04f257e1e02f2f"}, - {file = "ephem-4.1.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e737b49643a300fa15b788accc72802af93b49cd5d071e53111e08e3fba6570"}, - {file = "ephem-4.1.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:56c448a83290dabd1df5865fbf9e39d17400abcef37cb36de90ea1a860c0a08e"}, - {file = "ephem-4.1.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3bd7da534a542d937b10f3c643301dc9b8bc09f7a40350b32efc32910232da9e"}, - {file = "ephem-4.1.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:0493ad1b3d2505acbf442e31aadb86fba096ba30008a586fe6361a9de5974ed3"}, - {file = "ephem-4.1.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:3442fba6afae0bcb643c9b069765033b67d2c8fe4350f9beb4f2f5cfdaaa7442"}, - {file = "ephem-4.1.4-cp38-cp38-win32.whl", hash = "sha256:8e0bb8379fb6b709a3cbceb6a11a3dc0f25e5b16a6f009b48e09d6b95f896d9c"}, - {file = "ephem-4.1.4-cp38-cp38-win_amd64.whl", hash = "sha256:a940cd4d8d7aed68efd3d6b717f393bbedf541d388ba11eb3ed56a9fc6cbb1ca"}, - {file = "ephem-4.1.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7f51a3bcd5f69c4070e8a6936e4a61019ad2d6b94bc8b5ca1e498dea0962a373"}, - {file = "ephem-4.1.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:41680b48aeae5b992371bf7ec1bc07457500ff4a6ea7d333793e945b97951de0"}, - {file = "ephem-4.1.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f11edaef2e4a4d010e21b5ff8bcd9435fbc7fe9e16923f81143f248ae8ae8e9d"}, - {file = "ephem-4.1.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:72078b49748318cbbbe1a49ab5dcd05e63c917151351175b590833e6163a1506"}, - {file = "ephem-4.1.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2ba977ad0402ac44fe66af6e1119632efe84b7d1255f8f6f94d7768d9487453"}, - {file = "ephem-4.1.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a21a11285904f43c3bc6909727d09109b8e38dc2e3cda662089601cb37b3d082"}, - {file = "ephem-4.1.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9aabc3cab5fb9440564dfdf79e39ee01d16554d7bfb8228cddfe9eada460dba9"}, - {file = "ephem-4.1.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:5327fd48fc8ff966023a6f177813fc058bb2a496c70b53a79f85bf2eba3ca93d"}, - {file = "ephem-4.1.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1e429f6e0e05e4c8c54802e951cd1bde440dd6f896c2b5691ef5ebd9bc3ba489"}, - {file = "ephem-4.1.4-cp39-cp39-win32.whl", hash = "sha256:a8d125d04800425a9d944109710687bbb3703e8f04ac3bc8445779bb0ad5dcc2"}, - {file = "ephem-4.1.4-cp39-cp39-win_amd64.whl", hash = "sha256:4e8ec4e29c7f04d6334215775a8c4dc77eae8ed698384530d9415a98500ed01c"}, - {file = "ephem-4.1.4.tar.gz", hash = "sha256:73a59f0d2162d1624535c3c3b75f956556bdbb2055eaf554a7bef147d3f9c760"}, + {file = "ephem-4.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0796dbcd24f76af0e81c22e1f709b42873ef81d2c4dfa962f8d346f11489785d"}, + {file = "ephem-4.1.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0266cf69d594bd94034bd13c18dbcef13b301acd7357d7cf7d1bb8acaf7f00b4"}, + {file = "ephem-4.1.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3db8d53a37c772e1b132f5ed3535027d73e8dca4ead99a7563f09c4308996b63"}, + {file = "ephem-4.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c6e7523d8856caa4ac53db1988693ce7a516fb25c1cd3c74a3472f951691c0e"}, + {file = "ephem-4.1.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:203bd3f00c49012bd07eb2627bcf9538f608b3431cb8053a7d3115e1df396312"}, + {file = "ephem-4.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec7ddf15c319a83fb5dadff58bb6e5fbcaff09338f5c2a1b2c7b1445b87002b5"}, + {file = "ephem-4.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:13f800e03aad215ae6a4217122e64d0ce90e914574f8b5afa381d81dad0eecaa"}, + {file = "ephem-4.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83921b341b4f4725e59c1463b9613f3fd3991392e17904170b146f5d6945afcb"}, + {file = "ephem-4.1.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:6219412800138f489733cb3a8b4fab0a8b3ef2dd5ec143aff35950dca9a71c36"}, + {file = "ephem-4.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b95bf8c92a5eae665d63371440b93778b2508ad448907d12f72ed6ed08ea476c"}, + {file = "ephem-4.1.5-cp310-cp310-win32.whl", hash = "sha256:afefe022448f09c3e15472bd3ad30fa4824f8c4a9de65216b9952b9dfcec8750"}, + {file = "ephem-4.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:53df72aa3e2f1359ed56587b1930d0030fec030db71744564a83c10ea54316a7"}, + {file = "ephem-4.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b3e385d8447d908be6dd8c53c4452fee7d61040c9b6bb5a60195b57c85545ca6"}, + {file = "ephem-4.1.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:be6c4ced150d79ab6b5ff3bb7545fee26cf7f4f64ccf476a14850a63bbf125e7"}, + {file = "ephem-4.1.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c8a70e36632e88227c4ba8184fd91dbd32d0140f799202b5fb8510508f4c8e4"}, + {file = "ephem-4.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ee2a4966167a0300db2c9155e4b64fc1a6bb67ca869659d4c0342869c44d4f3"}, + {file = "ephem-4.1.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b45b9b15e65c7f26c1342b70e06e49bd83a9c527affe9de0fb5953a3a25a0cda"}, + {file = "ephem-4.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e21a8120569f315ce181f2e654528cd10c18cb92382248de90574effed57d227"}, + {file = "ephem-4.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:864d6aba1699f26e7768ed424d5218396300dce6d8deccb1c97164a424343675"}, + {file = "ephem-4.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8f8f5dd5b1343dc77ea891ab423677a631fd7b820bbbeac7ec53ee332e8a4ca5"}, + {file = "ephem-4.1.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:8a2347ad88aad026dff6f00b931bd2b0d6b4f184bf65ffd4b62f557526bf335d"}, + {file = "ephem-4.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5496ebc21b2873e986836ad0756818bee80ed6deee58e1167a9876e4a64f0bbf"}, + {file = "ephem-4.1.5-cp311-cp311-win32.whl", hash = "sha256:f319ca58ee2ee27c18e42657ad8d3d1b0251dd369c9fd60af45b2bc2c42ded0a"}, + {file = "ephem-4.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:cc6a49fd3250cf67305230da962d779632b13da2a8fae5c383e973fa113baa97"}, + {file = "ephem-4.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:51c17c62b031ec246546aa482d98e9a5573405385eb7adf7154f5a1af309ac8a"}, + {file = "ephem-4.1.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ff1436219d2dad1433c5f0a61f3a947ab6d4c622cc6a90d7cb5c2e28a8669fba"}, + {file = "ephem-4.1.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9495d515a6f49bd7a90f58320af1a95e4c3ab89307fbf31045cf05570f779eaf"}, + {file = "ephem-4.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7952e8b54c771be6a58ce9aca91d729bcdace2293c68fe825df3433995aedafc"}, + {file = "ephem-4.1.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1e99ba9fbd5c136fc18b94fe5e709a7c4a19f13ed1c6a16bdec448cbd7d1bcb1"}, + {file = "ephem-4.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d2922e6cb66434e9edd3764b103b6bdd394a701bd39395c46f0a7751b9829ee"}, + {file = "ephem-4.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:692f8dea9e91447c6406e9ee7001075d5794948677f5f8ee4601c146509b15b1"}, + {file = "ephem-4.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7122f46a0ce2c2551360bf43b693a3f1f543c0aa6e736b2513bc3203df27df7c"}, + {file = "ephem-4.1.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:a68dd823d823ace3ecd94b3cf926d51ae8aa88ce248159850a8db45547720843"}, + {file = "ephem-4.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cf745e4f02455d6c0f1d85a61206c420ee2c909b392266109e2da2d3a8c023db"}, + {file = "ephem-4.1.5-cp312-cp312-win32.whl", hash = "sha256:e1772852072727e848b5fe035ce7d9dc4662c1baffbd9e4cd7467ecf384db1d9"}, + {file = "ephem-4.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:fd984e38c5078be8cb881ed75c69b2204a1d7fd2230571fc92112edfc5362bf6"}, + {file = "ephem-4.1.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:740a5950b31ac9a7ca40a95b7cfb1678e747e860f77ac0030984c10dc5464e7f"}, + {file = "ephem-4.1.5-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:faf5b786ed28e7d00704d2cf3862dec75223790ed800c285a91acfa538b1755c"}, + {file = "ephem-4.1.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87e5be99ebc3bfa1dc70f31ba737dcdf9f6219570fa9a5729d0ff60134c7dc43"}, + {file = "ephem-4.1.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:261f82bd821cfbb8a056bb834da06d19d3afd3eb735c8cd549f775e45caef502"}, + {file = "ephem-4.1.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc612e5d1829f64a8db55d8b2566bef4ce479c1bbee110fedf3197170635f70c"}, + {file = "ephem-4.1.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9fa8ee5d77a8a27a21d39142ee7c6332915b9e79a416a941cbc6f3db64c32cfe"}, + {file = "ephem-4.1.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c109219a4728281dd4e8b1e9f449900d7a63e9400ef43c85151750d4725b0c9e"}, + {file = "ephem-4.1.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:cf81a3bfa15d84871c4f87ecbf92280184ce96619cacdfe55f761d510a7f81db"}, + {file = "ephem-4.1.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:39dcc1b00882a2782771b12731a943706da8990c89be75caa294f0574cca661f"}, + {file = "ephem-4.1.5-cp36-cp36m-win32.whl", hash = "sha256:7b6384a032897d3e47da92ccc3348b74517c0dcf478a63b8cdedf69c177bccd2"}, + {file = "ephem-4.1.5-cp36-cp36m-win_amd64.whl", hash = "sha256:3bea9cb5a4a98d9c51430a395c4ad4f6307402fa7d3ffbe1bb28f7508e094dd3"}, + {file = "ephem-4.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cac6ed1664e7db22f3aadd8bc6b7afed191b8d5ce3aab9a00d719890a7c344d2"}, + {file = "ephem-4.1.5-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02316f8ebb3f82273bc5fbb2970fd98bfb56ed8349197aff0f56c9b5fa04e47a"}, + {file = "ephem-4.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6b044d4e3b11953b0543cbd10468bf84afaa840d165c6effbffff3c15d721234"}, + {file = "ephem-4.1.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4a69b27eb82d7c0dccdd54e11ad27f3cadcddb02169a570ac7864dbaa9a10486"}, + {file = "ephem-4.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b01734c27ce38705418191322fd7bd0372d9709d326263991b1c7e1bc75a59f"}, + {file = "ephem-4.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:bcae4b30c4a7474cfc102610f23a4a114196c8d15165cbc0551fb0d542a768eb"}, + {file = "ephem-4.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6fde92b6cc7837c141506a09f721f983e31b32785a9680f4d075be9763dc931b"}, + {file = "ephem-4.1.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:0849f522d1ad4daac5407307be786a54283599cfe87f3fcfc677153db45d7e22"}, + {file = "ephem-4.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:82025d4a6d5f6d76a1f45b4eb940030be93e38a3ac3c589990172beac53c854e"}, + {file = "ephem-4.1.5-cp37-cp37m-win32.whl", hash = "sha256:d7c446228a8756fa39876701abf34d516cd9b49b867d52c2f661f1cf1d927335"}, + {file = "ephem-4.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:b1f509901dcf2b95cc175be39c90eb457e081f8ed9762f4aae74f45e092c7f8b"}, + {file = "ephem-4.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8d1ca9cec961115a6197faee6ae2231bc76f9a7090bfdf759c810718c7715db9"}, + {file = "ephem-4.1.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3f95e89ab21e5214dbadfd41f9c94ce538bcd4411c18400cc638a00df728d67c"}, + {file = "ephem-4.1.5-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:21e8239ec63c9c6a1ab4d8c578bf6b34c114a3754b80c2e02ce07de827925353"}, + {file = "ephem-4.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:972ff0942ddf0f4ac5124bd974608b8371b22e84ab5ed49b4634455331f41987"}, + {file = "ephem-4.1.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd85a8b5b20020e791273f9cfd80510e4f647c362e5a3b7aec2abcb604d8d02a"}, + {file = "ephem-4.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:543ddd9e6bf573c24c1ccf30257ec655d8be00e28279fbdadbc774927d949663"}, + {file = "ephem-4.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:beea8cccaf184cd2a16c091b0ce92293f1128e49fd43e3c81e79c9f8d051cea6"}, + {file = "ephem-4.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4f53899fbcdd14790b7a61aa70218337e1c6aabc26af99d2485ed6d98fec8cee"}, + {file = "ephem-4.1.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3733d751c015d28bc043d543c47cee8d0a699a8330d3d34c9afdbd7e96310842"}, + {file = "ephem-4.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a7c904e6df8511bfad2a3119d2ba2333d94953d0d212b31725f4f749267f21cc"}, + {file = "ephem-4.1.5-cp38-cp38-win32.whl", hash = "sha256:3b46aa3f576d528a9dd4357b18c3e59308d0a1e537e45fe91df3753fa63100bf"}, + {file = "ephem-4.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:37751e9bdb10ae109a2e7d7353911470ee5752f5caee4bbe0d764a39cdd57a5a"}, + {file = "ephem-4.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fd76c85313b44e4a9b2e8a14f8e5ffbf43541b3cd023d623664f1dca8c8bf407"}, + {file = "ephem-4.1.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9b56f805aa26818e7efa46c2bf98417f677e4dc9ae1b6ef278747d823c7d4df6"}, + {file = "ephem-4.1.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4e9c15b5e5386cbee128737465ad7b042f57603c3e75bdbab84cd71b416127cf"}, + {file = "ephem-4.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c0f7f4a9de84a4ef8ce77ee980a963bb7725791caa3cb3389490ed35be1d06e8"}, + {file = "ephem-4.1.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b38d0033f7e4ba6e2f5c9ecfc0827d619796ff182d98cc0adb62c6bce701fe0"}, + {file = "ephem-4.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb55fc94512d0c46e610fa67af5fcad51e28aa2b30f7e88ef4cb38c7a443e81a"}, + {file = "ephem-4.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c4183bc20f5933c9fad3d754f9a9ac75dc9ea0d8c6a7faff63de5d28d6bf26d9"}, + {file = "ephem-4.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e067f98b6cd9da55a5de9ce7b2e1222574006b4c3083363eda507ce97ce9867b"}, + {file = "ephem-4.1.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b5cf0e29657001482f3ed8eeaf1757c67b8d8fdc9c90e57b8d544fd1e7e4d6b3"}, + {file = "ephem-4.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a5058cfcf36643b11198d54266137d7db8476d66b2c9ff5e4e35638fc3254a2d"}, + {file = "ephem-4.1.5-cp39-cp39-win32.whl", hash = "sha256:c1eed128e5f6e551bc50cfaa87395cef7f03d65537fe4e8502704d200279e3b2"}, + {file = "ephem-4.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:f4ff7153ac577cb336e08fdc7a76ac91185b2af5dae9ba3ae9d0e87af3ac35c3"}, + {file = "ephem-4.1.5.tar.gz", hash = "sha256:0c64a8aa401574c75942045b9af70d1656e14c5366151c0cbb400cbeedc2362a"}, ] [[package]] @@ -2080,13 +2113,13 @@ files = [ [[package]] name = "exceptiongroup" -version = "1.1.2" +version = "1.2.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.1.2-py3-none-any.whl", hash = "sha256:e346e69d186172ca7cf029c8c1d16235aa0e04035e5750b4b95039e65204328f"}, - {file = "exceptiongroup-1.1.2.tar.gz", hash = "sha256:12c3e887d6485d16943a309616de20ae5582633e0a2eda17f4e10fd61c1e8af5"}, + {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, + {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, ] [package.extras] @@ -2117,13 +2150,13 @@ dev = ["flake8", "hypothesis", "pip-tools", "pytest", "pytest-benchmark", "pytes [[package]] name = "execnet" -version = "2.0.2" +version = "2.1.1" description = "execnet: rapid multi-Python deployment" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "execnet-2.0.2-py3-none-any.whl", hash = "sha256:88256416ae766bc9e8895c76a87928c0012183da3cc4fc18016e6f050e025f41"}, - {file = "execnet-2.0.2.tar.gz", hash = "sha256:cc59bc4423742fd71ad227122eb0dd44db51efb3dc4095b45ac9a08c770096af"}, + {file = "execnet-2.1.1-py3-none-any.whl", hash = "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc"}, + {file = "execnet-2.1.1.tar.gz", hash = "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3"}, ] [package.extras] @@ -2131,27 +2164,27 @@ testing = ["hatch", "pre-commit", "pytest", "tox"] [[package]] name = "executing" -version = "1.2.0" +version = "2.0.1" description = "Get the currently executing AST node of a frame, and other information" optional = false -python-versions = "*" +python-versions = ">=3.5" files = [ - {file = "executing-1.2.0-py2.py3-none-any.whl", hash = "sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc"}, - {file = "executing-1.2.0.tar.gz", hash = "sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107"}, + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, ] [package.extras] -tests = ["asttokens", "littleutils", "pytest", "rich"] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] [[package]] name = "fastjsonschema" -version = "2.17.1" +version = "2.19.1" description = "Fastest Python implementation of JSON schema" optional = false python-versions = "*" files = [ - {file = "fastjsonschema-2.17.1-py3-none-any.whl", hash = "sha256:4b90b252628ca695280924d863fe37234eebadc29c5360d322571233dc9746e0"}, - {file = "fastjsonschema-2.17.1.tar.gz", hash = "sha256:f4eeb8a77cef54861dbf7424ac8ce71306f12cbb086c45131bcba2c6a4f726e3"}, + {file = "fastjsonschema-2.19.1-py3-none-any.whl", hash = "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"}, + {file = "fastjsonschema-2.19.1.tar.gz", hash = "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"}, ] [package.extras] @@ -2159,13 +2192,13 @@ devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benc [[package]] name = "feedparser" -version = "6.0.10" +version = "6.0.11" description = "Universal feed parser, handles RSS 0.9x, RSS 1.0, RSS 2.0, CDF, Atom 0.3, and Atom 1.0 feeds" optional = false python-versions = ">=3.6" files = [ - {file = "feedparser-6.0.10-py3-none-any.whl", hash = "sha256:79c257d526d13b944e965f6095700587f27388e50ea16fd245babe4dfae7024f"}, - {file = "feedparser-6.0.10.tar.gz", hash = "sha256:27da485f4637ce7163cdeab13a80312b93b7d0c1b775bef4a47629a3110bca51"}, + {file = "feedparser-6.0.11-py3-none-any.whl", hash = "sha256:0be7ee7b395572b19ebeb1d6aafb0028dee11169f1c934e0ed67d54992f4ad45"}, + {file = "feedparser-6.0.11.tar.gz", hash = "sha256:c9d0407b64c6f2a065d0ebb292c2b35c01050cc0dc33757461aaabdc4c4184d5"}, ] [package.dependencies] @@ -2215,18 +2248,19 @@ dev = ["black (>=20.8b1)", "codecov", "coverage", "flake8", "flake8-black", "fut [[package]] name = "filelock" -version = "3.12.2" +version = "3.13.4" description = "A platform independent file lock." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "filelock-3.12.2-py3-none-any.whl", hash = "sha256:cbb791cdea2a72f23da6ac5b5269ab0a0d161e9ef0100e653b69049a7706d1ec"}, - {file = "filelock-3.12.2.tar.gz", hash = "sha256:002740518d8aa59a26b0c76e10fb8c6e15eae825d34b6fdf670333fd7b938d81"}, + {file = "filelock-3.13.4-py3-none-any.whl", hash = "sha256:404e5e9253aa60ad457cae1be07c0f0ca90a63931200a47d9b6a6af84fd7b45f"}, + {file = "filelock-3.13.4.tar.gz", hash = "sha256:d13f466618bfde72bd2c18255e269f72542c6e70e7bac83a0232d6b1cc5c8cf4"}, ] [package.extras] -docs = ["furo (>=2023.5.20)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)", "pytest-timeout (>=2.1)"] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8.0.1)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] [[package]] name = "financedatabase" @@ -2244,13 +2278,13 @@ pandas = "*" [[package]] name = "finnhub-python" -version = "2.4.18" +version = "2.4.19" description = "Finnhub API" optional = false python-versions = "*" files = [ - {file = "finnhub-python-2.4.18.tar.gz", hash = "sha256:46d932508f4753be207de73cce81c43070504fc68a2e2f6cb2a25c9cafa7cef4"}, - {file = "finnhub_python-2.4.18-py3-none-any.whl", hash = "sha256:93e4ad04a63318d9495fbfc9680caef58f1c152cc35c629e94df5431dfb8d7a6"}, + {file = "finnhub-python-2.4.19.tar.gz", hash = "sha256:1c216df125fe4c38ff6033613739f07efaf4bce1b7502dde54d31631bbeb5cca"}, + {file = "finnhub_python-2.4.19-py3-none-any.whl", hash = "sha256:e9bb56cf41d88a903e9f083a6fc2076187c0a0cbcc55d9f78941c4f455134229"}, ] [package.dependencies] @@ -2297,113 +2331,98 @@ requests = "*" [[package]] name = "flake8" -version = "6.0.0" +version = "7.0.0" description = "the modular source code checker: pep8 pyflakes and co" optional = false python-versions = ">=3.8.1" files = [ - {file = "flake8-6.0.0-py2.py3-none-any.whl", hash = "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7"}, - {file = "flake8-6.0.0.tar.gz", hash = "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181"}, + {file = "flake8-7.0.0-py2.py3-none-any.whl", hash = "sha256:a6dfbb75e03252917f2473ea9653f7cd799c3064e54d4c8140044c5c065f53c3"}, + {file = "flake8-7.0.0.tar.gz", hash = "sha256:33f96621059e65eec474169085dc92bf26e7b2d47366b70be2f67ab80dc25132"}, ] [package.dependencies] mccabe = ">=0.7.0,<0.8.0" -pycodestyle = ">=2.10.0,<2.11.0" -pyflakes = ">=3.0.0,<3.1.0" - -[[package]] -name = "flask" -version = "2.3.2" -description = "A simple framework for building complex web applications." -optional = true -python-versions = ">=3.8" -files = [ - {file = "Flask-2.3.2-py3-none-any.whl", hash = "sha256:77fd4e1249d8c9923de34907236b747ced06e5467ecac1a7bb7115ae0e9670b0"}, - {file = "Flask-2.3.2.tar.gz", hash = "sha256:8c2f9abd47a9e8df7f0c3f091ce9497d011dc3b31effcf4c85a6e2b50f4114ef"}, -] - -[package.dependencies] -blinker = ">=1.6.2" -click = ">=8.1.3" -importlib-metadata = {version = ">=3.6.0", markers = "python_version < \"3.10\""} -itsdangerous = ">=2.1.2" -Jinja2 = ">=3.1.2" -Werkzeug = ">=2.3.3" - -[package.extras] -async = ["asgiref (>=3.2)"] -dotenv = ["python-dotenv"] +pycodestyle = ">=2.11.0,<2.12.0" +pyflakes = ">=3.2.0,<3.3.0" [[package]] name = "fonttools" -version = "4.41.0" +version = "4.51.0" description = "Tools to manipulate font files" optional = false python-versions = ">=3.8" files = [ - {file = "fonttools-4.41.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ba2a367ff478cd108d5319c0dc4fd4eb4ea3476dbfc45b00c45718e889cd9463"}, - {file = "fonttools-4.41.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:69178674505ec81adf4af2a3bbacd0cb9a37ba7831bc3fca307f80e48ab2767b"}, - {file = "fonttools-4.41.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86edb95c4d1fe4fae2111d7e0c10c6e42b7790b377bcf1952303469eee5b52bb"}, - {file = "fonttools-4.41.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50f8bdb421270f71b54695c62785e300fab4bb6127be40bf9f3084962a0c3adb"}, - {file = "fonttools-4.41.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c890061915e95b619c1d3cc3c107c6fb021406b701c0c24b03e74830d522f210"}, - {file = "fonttools-4.41.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b329ae7ce971b5c4148d6cdb8119c0ce4587265b2330d4f2f3776ef851bee020"}, - {file = "fonttools-4.41.0-cp310-cp310-win32.whl", hash = "sha256:bc9e7b1e268be7a23fc66471b615c324e99c5db39ce8c49dd6dd8e962c7bc1b8"}, - {file = "fonttools-4.41.0-cp310-cp310-win_amd64.whl", hash = "sha256:f3fe90dfb297bd8265238c06787911cd81c2cb89ac5b13e1c911928bdabfce0f"}, - {file = "fonttools-4.41.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e38bd91eae257f36c2b7245c0278e9cd9d754f3a66b8d2b548c623ba66e387b6"}, - {file = "fonttools-4.41.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:415cf7c806a3f56fb280dadcf3c92c85c0415e75665ca957b4a2a2e39c17a5c9"}, - {file = "fonttools-4.41.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:381558eafffc1432d08ca58063e71c7376ecaae48e9318354a90a1049a644845"}, - {file = "fonttools-4.41.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ee75b8ca48f6c48af25e967dce995ef94e46872b35c7d454b983c62c9c7006d"}, - {file = "fonttools-4.41.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d45f28c20bb67dee0f4a4caae709f40b0693d764b7b2bf2d58890f36b1bfcef0"}, - {file = "fonttools-4.41.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5448a87f6ed57ed844b64a05d3792827af584a8584613f6289867f4e77eb603b"}, - {file = "fonttools-4.41.0-cp311-cp311-win32.whl", hash = "sha256:69dbe0154e15b68dd671441ea8f23dad87488b24a6e650d45958f4722819a443"}, - {file = "fonttools-4.41.0-cp311-cp311-win_amd64.whl", hash = "sha256:ea879afd1d6189fca02a85a7868560c9bb8415dccff6b7ae6d81e4f06b3ab30d"}, - {file = "fonttools-4.41.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8f602dd5bcde7e4241419924f23c6f0d66723dd5408a58c3a2f781745c693f45"}, - {file = "fonttools-4.41.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:06eac087ea55b3ebb2207d93b5ac56c847163899f05f5a77e1910f688fe10030"}, - {file = "fonttools-4.41.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e22d0144d735f6c7df770509b8c0c33414bf460df0d5dddc98a159e5dbb10eb"}, - {file = "fonttools-4.41.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19d461c801b8904d201c6c38a99bfcfef673bfdfe0c7f026f582ef78896434e0"}, - {file = "fonttools-4.41.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:72d40a32d6443871ea0d147813caad58394b48729dfa4fbc45dcaac54f9506f2"}, - {file = "fonttools-4.41.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0614b6348866092d00df3dfb37e037fc06412ca67087de361a2777ea5ed62c16"}, - {file = "fonttools-4.41.0-cp38-cp38-win32.whl", hash = "sha256:e43f6c7f9ba4f9d29edee530e45f9aa162872ec9549398b85971477a99f2a806"}, - {file = "fonttools-4.41.0-cp38-cp38-win_amd64.whl", hash = "sha256:eb9dfa87152bd97019adc387b2f29ef6af601de4386f36570ca537ace96d96ed"}, - {file = "fonttools-4.41.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d2dae84a3d0f76884a6102c62f2795b2d6602c2c95cfcce74c8a590b6200e533"}, - {file = "fonttools-4.41.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cc3324e4159e6d1f55c3615b4c1c211f87cc96cc0cc7c946c8447dc1319f2e9d"}, - {file = "fonttools-4.41.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c654b1facf1f3b742e4d9b2dcdf0fa867b1f007b1b4981cc58a75ef5dca2a3c"}, - {file = "fonttools-4.41.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:560ea1a604c927399f36742abf342a4c5f3fee8e8e8a484b774dfe9630bd9a91"}, - {file = "fonttools-4.41.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9387b09694fbf8ac7dcf887069068f81fb4124d05e09557ac7daabfbec1744bd"}, - {file = "fonttools-4.41.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:465d0f24bf4f75160f441793b55076b7a080a57d3a1f738390af2c20bee24fbb"}, - {file = "fonttools-4.41.0-cp39-cp39-win32.whl", hash = "sha256:841c491fa3e9c54e8f9cd5dae059e88f45e086aea090c28be9d42f59c8b99e01"}, - {file = "fonttools-4.41.0-cp39-cp39-win_amd64.whl", hash = "sha256:efd59e83223cb77952997fb850c7a7c2a958c9af0642060f536722c2a9e9d53b"}, - {file = "fonttools-4.41.0-py3-none-any.whl", hash = "sha256:5b1c2b21b40229166a864f2b0aec06d37f0a204066deb1734c93370e0c76339d"}, - {file = "fonttools-4.41.0.tar.gz", hash = "sha256:6faff25991dec48f8cac882055a09ae1a29fd15bc160bc3d663e789e994664c2"}, + {file = "fonttools-4.51.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:84d7751f4468dd8cdd03ddada18b8b0857a5beec80bce9f435742abc9a851a74"}, + {file = "fonttools-4.51.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8b4850fa2ef2cfbc1d1f689bc159ef0f45d8d83298c1425838095bf53ef46308"}, + {file = "fonttools-4.51.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5b48a1121117047d82695d276c2af2ee3a24ffe0f502ed581acc2673ecf1037"}, + {file = "fonttools-4.51.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:180194c7fe60c989bb627d7ed5011f2bef1c4d36ecf3ec64daec8302f1ae0716"}, + {file = "fonttools-4.51.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:96a48e137c36be55e68845fc4284533bda2980f8d6f835e26bca79d7e2006438"}, + {file = "fonttools-4.51.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:806e7912c32a657fa39d2d6eb1d3012d35f841387c8fc6cf349ed70b7c340039"}, + {file = "fonttools-4.51.0-cp310-cp310-win32.whl", hash = "sha256:32b17504696f605e9e960647c5f64b35704782a502cc26a37b800b4d69ff3c77"}, + {file = "fonttools-4.51.0-cp310-cp310-win_amd64.whl", hash = "sha256:c7e91abdfae1b5c9e3a543f48ce96013f9a08c6c9668f1e6be0beabf0a569c1b"}, + {file = "fonttools-4.51.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a8feca65bab31479d795b0d16c9a9852902e3a3c0630678efb0b2b7941ea9c74"}, + {file = "fonttools-4.51.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ac27f436e8af7779f0bb4d5425aa3535270494d3bc5459ed27de3f03151e4c2"}, + {file = "fonttools-4.51.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e19bd9e9964a09cd2433a4b100ca7f34e34731e0758e13ba9a1ed6e5468cc0f"}, + {file = "fonttools-4.51.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2b92381f37b39ba2fc98c3a45a9d6383bfc9916a87d66ccb6553f7bdd129097"}, + {file = "fonttools-4.51.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5f6bc991d1610f5c3bbe997b0233cbc234b8e82fa99fc0b2932dc1ca5e5afec0"}, + {file = "fonttools-4.51.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9696fe9f3f0c32e9a321d5268208a7cc9205a52f99b89479d1b035ed54c923f1"}, + {file = "fonttools-4.51.0-cp311-cp311-win32.whl", hash = "sha256:3bee3f3bd9fa1d5ee616ccfd13b27ca605c2b4270e45715bd2883e9504735034"}, + {file = "fonttools-4.51.0-cp311-cp311-win_amd64.whl", hash = "sha256:0f08c901d3866a8905363619e3741c33f0a83a680d92a9f0e575985c2634fcc1"}, + {file = "fonttools-4.51.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:4060acc2bfa2d8e98117828a238889f13b6f69d59f4f2d5857eece5277b829ba"}, + {file = "fonttools-4.51.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1250e818b5f8a679ad79660855528120a8f0288f8f30ec88b83db51515411fcc"}, + {file = "fonttools-4.51.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76f1777d8b3386479ffb4a282e74318e730014d86ce60f016908d9801af9ca2a"}, + {file = "fonttools-4.51.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b5ad456813d93b9c4b7ee55302208db2b45324315129d85275c01f5cb7e61a2"}, + {file = "fonttools-4.51.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:68b3fb7775a923be73e739f92f7e8a72725fd333eab24834041365d2278c3671"}, + {file = "fonttools-4.51.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8e2f1a4499e3b5ee82c19b5ee57f0294673125c65b0a1ff3764ea1f9db2f9ef5"}, + {file = "fonttools-4.51.0-cp312-cp312-win32.whl", hash = "sha256:278e50f6b003c6aed19bae2242b364e575bcb16304b53f2b64f6551b9c000e15"}, + {file = "fonttools-4.51.0-cp312-cp312-win_amd64.whl", hash = "sha256:b3c61423f22165541b9403ee39874dcae84cd57a9078b82e1dce8cb06b07fa2e"}, + {file = "fonttools-4.51.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1621ee57da887c17312acc4b0e7ac30d3a4fb0fec6174b2e3754a74c26bbed1e"}, + {file = "fonttools-4.51.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9d9298be7a05bb4801f558522adbe2feea1b0b103d5294ebf24a92dd49b78e5"}, + {file = "fonttools-4.51.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee1af4be1c5afe4c96ca23badd368d8dc75f611887fb0c0dac9f71ee5d6f110e"}, + {file = "fonttools-4.51.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c18b49adc721a7d0b8dfe7c3130c89b8704baf599fb396396d07d4aa69b824a1"}, + {file = "fonttools-4.51.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de7c29bdbdd35811f14493ffd2534b88f0ce1b9065316433b22d63ca1cd21f14"}, + {file = "fonttools-4.51.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cadf4e12a608ef1d13e039864f484c8a968840afa0258b0b843a0556497ea9ed"}, + {file = "fonttools-4.51.0-cp38-cp38-win32.whl", hash = "sha256:aefa011207ed36cd280babfaa8510b8176f1a77261833e895a9d96e57e44802f"}, + {file = "fonttools-4.51.0-cp38-cp38-win_amd64.whl", hash = "sha256:865a58b6e60b0938874af0968cd0553bcd88e0b2cb6e588727117bd099eef836"}, + {file = "fonttools-4.51.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:60a3409c9112aec02d5fb546f557bca6efa773dcb32ac147c6baf5f742e6258b"}, + {file = "fonttools-4.51.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f7e89853d8bea103c8e3514b9f9dc86b5b4120afb4583b57eb10dfa5afbe0936"}, + {file = "fonttools-4.51.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56fc244f2585d6c00b9bcc59e6593e646cf095a96fe68d62cd4da53dd1287b55"}, + {file = "fonttools-4.51.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0d145976194a5242fdd22df18a1b451481a88071feadf251221af110ca8f00ce"}, + {file = "fonttools-4.51.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5b8cab0c137ca229433570151b5c1fc6af212680b58b15abd797dcdd9dd5051"}, + {file = "fonttools-4.51.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:54dcf21a2f2d06ded676e3c3f9f74b2bafded3a8ff12f0983160b13e9f2fb4a7"}, + {file = "fonttools-4.51.0-cp39-cp39-win32.whl", hash = "sha256:0118ef998a0699a96c7b28457f15546815015a2710a1b23a7bf6c1be60c01636"}, + {file = "fonttools-4.51.0-cp39-cp39-win_amd64.whl", hash = "sha256:599bdb75e220241cedc6faebfafedd7670335d2e29620d207dd0378a4e9ccc5a"}, + {file = "fonttools-4.51.0-py3-none-any.whl", hash = "sha256:15c94eeef6b095831067f72c825eb0e2d48bb4cea0647c1b05c981ecba2bf39f"}, + {file = "fonttools-4.51.0.tar.gz", hash = "sha256:dc0673361331566d7a663d7ce0f6fdcbfbdc1f59c6e3ed1165ad7202ca183c68"}, ] [package.extras] -all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0,<5)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.0.0)", "xattr", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "fs (>=2.2.0,<3)", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres", "pycairo", "scipy", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0)", "xattr", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] -interpolatable = ["munkres", "scipy"] -lxml = ["lxml (>=4.0,<5)"] +interpolatable = ["munkres", "pycairo", "scipy"] +lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] repacker = ["uharfbuzz (>=0.23.0)"] symfont = ["sympy"] type1 = ["xattr"] ufo = ["fs (>=2.2.0,<3)"] -unicode = ["unicodedata2 (>=15.0.0)"] +unicode = ["unicodedata2 (>=15.1.0)"] woff = ["brotli (>=1.0.1)", "brotlicffi (>=0.8.0)", "zopfli (>=0.1.4)"] [[package]] name = "formulaic" -version = "0.6.4" +version = "1.0.1" description = "An implementation of Wilkinson formulas." optional = false python-versions = ">=3.7.2" files = [ - {file = "formulaic-0.6.4-py3-none-any.whl", hash = "sha256:570b3c7ab15fe8095e0dc86a4f71217102b23ce7e715053751a6cdcc580d7767"}, - {file = "formulaic-0.6.4.tar.gz", hash = "sha256:a8c84b6fa6df9216dbeaddcfa3f097bd5efe88e340211ac34c18cffe133cdb78"}, + {file = "formulaic-1.0.1-py3-none-any.whl", hash = "sha256:be9e6127b98ba0293654be528fd070ede264f64d0247477c4d5af799b0b12cf2"}, + {file = "formulaic-1.0.1.tar.gz", hash = "sha256:64dd7992a7aa5bbceb1e40679d0f01fc6f0ba12b7d23d78094a88c2edc68fba1"}, ] [package.dependencies] -astor = ">=0.8" +astor = {version = ">=0.8", markers = "python_version < \"3.9\""} graphlib-backport = {version = ">=1.0.0", markers = "python_version < \"3.9\""} interface-meta = ">=1.2.0" numpy = ">=1.16.5" @@ -2456,13 +2475,13 @@ pandas = "*" [[package]] name = "freezegun" -version = "1.2.2" +version = "1.4.0" description = "Let your Python tests travel through time" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "freezegun-1.2.2-py3-none-any.whl", hash = "sha256:ea1b963b993cb9ea195adbd893a48d573fda951b0da64f60883d7e988b606c9f"}, - {file = "freezegun-1.2.2.tar.gz", hash = "sha256:cd22d1ba06941384410cd967d8a99d5ae2442f57dfafeff2fda5de8dc5c05446"}, + {file = "freezegun-1.4.0-py3-none-any.whl", hash = "sha256:55e0fc3c84ebf0a96a5aa23ff8b53d70246479e9a68863f1fcac5a3e52f19dd6"}, + {file = "freezegun-1.4.0.tar.gz", hash = "sha256:10939b0ba0ff5adaecf3b06a5c2f73071d9678e507c5eaedb23c761d56ac774b"}, ] [package.dependencies] @@ -2470,118 +2489,133 @@ python-dateutil = ">=2.7" [[package]] name = "frozendict" -version = "2.3.8" +version = "2.4.2" description = "A simple immutable dictionary" optional = false python-versions = ">=3.6" files = [ - {file = "frozendict-2.3.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d188d062084fba0e4bf32719ff7380b26c050b932ff164043ce82ab90587c52b"}, - {file = "frozendict-2.3.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f2a4e818ac457f6354401dcb631527af25e5a20fcfc81e6b5054b45fc245caca"}, - {file = "frozendict-2.3.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a506d807858fa961aaa5b48dab6154fdc6bd045bbe9310788bbff141bb42d13"}, - {file = "frozendict-2.3.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:750632cc890d8ee9484fe6d31b261159144b6efacc08e1317fe46accd1410373"}, - {file = "frozendict-2.3.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7ee5fe2658a8ac9a57f748acaf563f6a47f80b8308cbf0a04fac0ba057d41f75"}, - {file = "frozendict-2.3.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23c4bb46e6b8246e1e7e49b5593c2bc09221db0d8f31f7c092be8dfb42b9e620"}, - {file = "frozendict-2.3.8-cp310-cp310-win_amd64.whl", hash = "sha256:c31abc8acea309b132dde441856829f6003a3d242da8b54bce4c0f2a3c8c63f0"}, - {file = "frozendict-2.3.8-cp310-cp310-win_arm64.whl", hash = "sha256:9ea5520e85447ff8d4681e181941e482662817ccba921b7cb3f87922056d892a"}, - {file = "frozendict-2.3.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f83fed36497af9562ead5e9fb8443224ba2781786bd3b92b1087cb7d0ff20135"}, - {file = "frozendict-2.3.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e27c5c1d29d0eda7979253ec88abc239da1313b38f39f4b16984db3b3e482300"}, - {file = "frozendict-2.3.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4c785de7f1a13f15963945f400656b18f057c2fc76c089dacf127a2bb188c03"}, - {file = "frozendict-2.3.8-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8cf35ddd25513428ec152614def9696afb93ae5ec0eb54fa6aa6206eda77ac4c"}, - {file = "frozendict-2.3.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:ffc684773de7c88724788fa9787d0016fd75830412d58acbd9ed1a04762c675b"}, - {file = "frozendict-2.3.8-cp36-cp36m-win_amd64.whl", hash = "sha256:4c258aab9c8488338634f2ec670ef049dbf0ab0e7a2fa9bc2c7b5009cb614801"}, - {file = "frozendict-2.3.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:47fc26468407fdeb428cfc89495b7921419e670355c21b383765482fdf6c5c14"}, - {file = "frozendict-2.3.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ea638228692db2bf94bce40ea4b25f4077588497b516bd16576575560094bd9"}, - {file = "frozendict-2.3.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a75bf87e76c4386caecdbdd02a99e53ad43a6b5c38fb3d5a634a9fc9ce41462"}, - {file = "frozendict-2.3.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ed5a6c5c7a0f57269577c2a338a6002949aea21a23b7b7d06da7e7dced8b605b"}, - {file = "frozendict-2.3.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d086440328a465dea9bef2dbad7548d75d1a0a0d21f43a08c03e1ec79ac5240e"}, - {file = "frozendict-2.3.8-cp37-cp37m-win_amd64.whl", hash = "sha256:0bc4767e2f83db5b701c787e22380296977368b0c57e485ca71b2eedfa11c4a3"}, - {file = "frozendict-2.3.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:638cf363d3cbca31a341503cf2219eac52a5f5140449676fae3d9644cd3c5487"}, - {file = "frozendict-2.3.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:2b2fd8ce36277919b36e3c834d2389f3cd7ac068ae730c312671dd4439a5dd65"}, - {file = "frozendict-2.3.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3957d52f1906b0c85f641a1911d214255873f6408ab4e5ad657cc27a247fb145"}, - {file = "frozendict-2.3.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72cfe08ab8ae524e54848fa90b22d02c1b1ecfb3064438696bcaa4b953f18772"}, - {file = "frozendict-2.3.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4742e76c4111bd09198d3ab66cef94be8506212311338f9182d6ef5f5cb60493"}, - {file = "frozendict-2.3.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:313ed8d9ba6bac35d7635cd9580ee5721a0fb016f4d2d20f0efa05dbecbdb1be"}, - {file = "frozendict-2.3.8-cp38-cp38-win_amd64.whl", hash = "sha256:d3c6ce943946c2a61501c8cf116fff0892d11dd579877eb36e2aea2c27fddfef"}, - {file = "frozendict-2.3.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0f573dc4861dd7ec9e055c8cceaf45355e894e749f621f199aab7b311ac4bdb"}, - {file = "frozendict-2.3.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2b3435e5f1ca5ae68a5e95e64b09d6d5c645cadd6b87569a0b3019dd248c8d00"}, - {file = "frozendict-2.3.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:145afd033ebfade28416093335261b8ec1af5cccc593482309e7add062ec8668"}, - {file = "frozendict-2.3.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:da98427de26b5a2865727947480cbb53860089c4d195baa29c539da811cea617"}, - {file = "frozendict-2.3.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5e82befa7c385a668d569cebbebbdf49cee6fea4083f08e869a1b08cfb640a9f"}, - {file = "frozendict-2.3.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:80abe81d36e889ceec665e06ec764a7638000fa3e7be09786ac4d3ddc64b76db"}, - {file = "frozendict-2.3.8-cp39-cp39-win_amd64.whl", hash = "sha256:8ccc94ac781710db44e142e1a11ff9b31d02c032c01c6868d51fcbef73086225"}, - {file = "frozendict-2.3.8-cp39-cp39-win_arm64.whl", hash = "sha256:e72dbc1bcc2203cef38d205f692396f5505921a5680f66aa9a7e8bb71fd38f28"}, - {file = "frozendict-2.3.8-py311-none-any.whl", hash = "sha256:ba41a7ed019bd03b62d63ed3f8dea35b8243d1936f7c9ed4b5298ca45a01928e"}, - {file = "frozendict-2.3.8.tar.gz", hash = "sha256:5526559eca8f1780a4ee5146896f59afc31435313560208dd394a3a5e537d3ff"}, + {file = "frozendict-2.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:19743495b1e92a7e4db56fcd6a5d36ea1d1b0f550822d6fd780e44d58f0b8c18"}, + {file = "frozendict-2.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81efb4ea854a1c93d954a67389eaf78c508acb2d4768321a835cda2754ec5c01"}, + {file = "frozendict-2.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5f1a4d9662b854dce52b560b60f51349905dc871826b8c6be20141a13067a53"}, + {file = "frozendict-2.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1412aeb325e4a28cfe32106c66c046372bb7fd5a9af1748193549c5d01a9e9c1"}, + {file = "frozendict-2.4.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f7ce0535f02eba9746e4e2cf0abef0f0f2051d20fdccf4af31bc3d1adecf5a71"}, + {file = "frozendict-2.4.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:07153e6d2720fa1131bb180ce388c7042affb29561d8bcd1c0d6e683a8beaea2"}, + {file = "frozendict-2.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f7a90ea6d5248617a1222daef07d22fb146ff07635a36db327e1ce114bf3e304"}, + {file = "frozendict-2.4.2-cp310-cp310-win_arm64.whl", hash = "sha256:20a6f741c92fdeb3766924cde42b8ee445cf568e3be8aa983cb83e9fe5b61e63"}, + {file = "frozendict-2.4.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:146129502cd9d96de64e0c8f7dc4c66422da3d4bfccf891dd80a3821b358a926"}, + {file = "frozendict-2.4.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ac1f74ccf818977abbc1868090c06436b8f06534d306f808f15cffc304ae046"}, + {file = "frozendict-2.4.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d2ea4f10505ad15f53ce3742420682d916d0c4d566edb8e1019756e7cea30"}, + {file = "frozendict-2.4.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:4a5841681e70d2862ca153543f2912e0bab034bf29e2d3610e86ea42506121c2"}, + {file = "frozendict-2.4.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d4a10119f17552cbeab48d4ae830ba091c6d47616589618adc31f251184579a7"}, + {file = "frozendict-2.4.2-cp36-cp36m-win_amd64.whl", hash = "sha256:7d13ffe649e9db6f4bb5e107d9be7dfd23e13101bc69f97aa5fa6cbf6aecaadd"}, + {file = "frozendict-2.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19e64630e164a297f83e9a1c69f1cd36fa4b3d1196c1f9fc006a0385aa198ea4"}, + {file = "frozendict-2.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bedb0a6587bae53bd53727b92a87c4cf90ad7a7e0bd2db562d439beb6982712e"}, + {file = "frozendict-2.4.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83cc9d063131fd8adbeb18a473d222b5dc8301cac9505cfe578158f9a9bf55a9"}, + {file = "frozendict-2.4.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:92c46b155ea9eb9ecabc66ba2d9030f2634319f55c6448688965ece094f14b51"}, + {file = "frozendict-2.4.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:f958d40637e0440bce2453019821c94fe86cfc5f3847ae11cd4f02c3548b1d1b"}, + {file = "frozendict-2.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:ac954be447a907face9b652207fbd943b9b552212890db959ba653e8f1dc3f56"}, + {file = "frozendict-2.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f7e0ff5e84742604a1b42c2de4f1e67630c0868cf52a5c585b54a99e06f6b453"}, + {file = "frozendict-2.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:84c36bfa819cd8442f6e0bdb86413c7678b2822a46b1a22cfa0f0dd30d9e5c45"}, + {file = "frozendict-2.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cead3bfe70c90c634a9b76807c9d7e75e6c5666ec96fa2cea8e7412ccf22a1f8"}, + {file = "frozendict-2.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fc6e3158107b5431255978b954758b1041cc70a3b8e7657373110512eb528e3"}, + {file = "frozendict-2.4.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4db1d6cc412bd865cab36723995208b82166a97bc6c724753bcd2b90cf24f164"}, + {file = "frozendict-2.4.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ff6fb5831539fffb09d71cc0cc0462b1f27c0160cb6c6fa2d1f4c1bc7fffe52a"}, + {file = "frozendict-2.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:79e1c94ad2a925ad5723d82a4134c6d851d5a7bc72b7e9da8b2087c42758a512"}, + {file = "frozendict-2.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:34704f9ffb21448d4b5c0f9239f8f058c0efab4bfdbe2956c5be978fef0b929c"}, + {file = "frozendict-2.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5280d685cd1659883a3010dec843afe3065416ae92e453498997d4474a898a39"}, + {file = "frozendict-2.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ca09a376114172e4d9918e6d576f58244c45e21f5af1245085699fd3a171c47"}, + {file = "frozendict-2.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55953aa2acf5bf183c664f3d0f540f8c8ac8f5fa97170f2098d413414318eb2b"}, + {file = "frozendict-2.4.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:476e4857e1d87b05c9102dd5409216ce4716cb7df619e6657429bc99279303cc"}, + {file = "frozendict-2.4.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4a8b298f39242d25770d029588ce9d4f524e9f4edc60d2d34b6178fb07c8a93e"}, + {file = "frozendict-2.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:c157b8a92743a7905b341edb0663044fecdc7780f96c59a2843d3da68d694b90"}, + {file = "frozendict-2.4.2-cp39-cp39-win_arm64.whl", hash = "sha256:cbab325c0a98b2f3ee291b36710623781b4977a3057f9103a7b0f11bcc23b177"}, + {file = "frozendict-2.4.2.tar.gz", hash = "sha256:741779e1d1a2e6bb2c623f78423bd5d14aad35dc0c57e6ccc89e54eaab5f1b8a"}, ] [[package]] name = "frozenlist" -version = "1.4.0" +version = "1.4.1" description = "A list-like structure which implements collections.abc.MutableSequence" optional = false python-versions = ">=3.8" files = [ - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, - {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, - {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, - {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, - {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, - {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, - {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, - {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, - {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, - {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9aa1878d1083b276b0196f2dfbe00c9b7e752475ed3b682025ff20c1c1f51ac"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29acab3f66f0f24674b7dc4736477bcd4bc3ad4b896f5f45379a67bce8b96868"}, + {file = "frozenlist-1.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:74fb4bee6880b529a0c6560885fce4dc95936920f9f20f53d99a213f7bf66776"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:590344787a90ae57d62511dd7c736ed56b428f04cd8c161fcc5e7232c130c69a"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:068b63f23b17df8569b7fdca5517edef76171cf3897eb68beb01341131fbd2ad"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c849d495bf5154cd8da18a9eb15db127d4dba2968d88831aff6f0331ea9bd4c"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9750cc7fe1ae3b1611bb8cfc3f9ec11d532244235d75901fb6b8e42ce9229dfe"}, + {file = "frozenlist-1.4.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9b2de4cf0cdd5bd2dee4c4f63a653c61d2408055ab77b151c1957f221cabf2a"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0633c8d5337cb5c77acbccc6357ac49a1770b8c487e5b3505c57b949b4b82e98"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:27657df69e8801be6c3638054e202a135c7f299267f1a55ed3a598934f6c0d75"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:f9a3ea26252bd92f570600098783d1371354d89d5f6b7dfd87359d669f2109b5"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:4f57dab5fe3407b6c0c1cc907ac98e8a189f9e418f3b6e54d65a718aaafe3950"}, + {file = "frozenlist-1.4.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e02a0e11cf6597299b9f3bbd3f93d79217cb90cfd1411aec33848b13f5c656cc"}, + {file = "frozenlist-1.4.1-cp310-cp310-win32.whl", hash = "sha256:a828c57f00f729620a442881cc60e57cfcec6842ba38e1b19fd3e47ac0ff8dc1"}, + {file = "frozenlist-1.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:f56e2333dda1fe0f909e7cc59f021eba0d2307bc6f012a1ccf2beca6ba362439"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a0cb6f11204443f27a1628b0e460f37fb30f624be6051d490fa7d7e26d4af3d0"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b46c8ae3a8f1f41a0d2ef350c0b6e65822d80772fe46b653ab6b6274f61d4a49"}, + {file = "frozenlist-1.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fde5bd59ab5357e3853313127f4d3565fc7dad314a74d7b5d43c22c6a5ed2ced"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:722e1124aec435320ae01ee3ac7bec11a5d47f25d0ed6328f2273d287bc3abb0"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2471c201b70d58a0f0c1f91261542a03d9a5e088ed3dc6c160d614c01649c106"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c757a9dd70d72b076d6f68efdbb9bc943665ae954dad2801b874c8c69e185068"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f146e0911cb2f1da549fc58fc7bcd2b836a44b79ef871980d605ec392ff6b0d2"}, + {file = "frozenlist-1.4.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f9c515e7914626b2a2e1e311794b4c35720a0be87af52b79ff8e1429fc25f19"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c302220494f5c1ebeb0912ea782bcd5e2f8308037b3c7553fad0e48ebad6ad82"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:442acde1e068288a4ba7acfe05f5f343e19fac87bfc96d89eb886b0363e977ec"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:1b280e6507ea8a4fa0c0a7150b4e526a8d113989e28eaaef946cc77ffd7efc0a"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:fe1a06da377e3a1062ae5fe0926e12b84eceb8a50b350ddca72dc85015873f74"}, + {file = "frozenlist-1.4.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db9e724bebd621d9beca794f2a4ff1d26eed5965b004a97f1f1685a173b869c2"}, + {file = "frozenlist-1.4.1-cp311-cp311-win32.whl", hash = "sha256:e774d53b1a477a67838a904131c4b0eef6b3d8a651f8b138b04f748fccfefe17"}, + {file = "frozenlist-1.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:fb3c2db03683b5767dedb5769b8a40ebb47d6f7f45b1b3e3b4b51ec8ad9d9825"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:1979bc0aeb89b33b588c51c54ab0161791149f2461ea7c7c946d95d5f93b56ae"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc7b01b3754ea68a62bd77ce6020afaffb44a590c2289089289363472d13aedb"}, + {file = "frozenlist-1.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c9c92be9fd329ac801cc420e08452b70e7aeab94ea4233a4804f0915c14eba9b"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c3894db91f5a489fc8fa6a9991820f368f0b3cbdb9cd8849547ccfab3392d86"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ba60bb19387e13597fb059f32cd4d59445d7b18b69a745b8f8e5db0346f33480"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8aefbba5f69d42246543407ed2461db31006b0f76c4e32dfd6f42215a2c41d09"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780d3a35680ced9ce682fbcf4cb9c2bad3136eeff760ab33707b71db84664e3a"}, + {file = "frozenlist-1.4.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9acbb16f06fe7f52f441bb6f413ebae6c37baa6ef9edd49cdd567216da8600cd"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:23b701e65c7b36e4bf15546a89279bd4d8675faabc287d06bbcfac7d3c33e1e6"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3e0153a805a98f5ada7e09826255ba99fb4f7524bb81bf6b47fb702666484ae1"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:dd9b1baec094d91bf36ec729445f7769d0d0cf6b64d04d86e45baf89e2b9059b"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:1a4471094e146b6790f61b98616ab8e44f72661879cc63fa1049d13ef711e71e"}, + {file = "frozenlist-1.4.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5667ed53d68d91920defdf4035d1cdaa3c3121dc0b113255124bcfada1cfa1b8"}, + {file = "frozenlist-1.4.1-cp312-cp312-win32.whl", hash = "sha256:beee944ae828747fd7cb216a70f120767fc9f4f00bacae8543c14a6831673f89"}, + {file = "frozenlist-1.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:64536573d0a2cb6e625cf309984e2d873979709f2cf22839bf2d61790b448ad5"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:20b51fa3f588ff2fe658663db52a41a4f7aa6c04f6201449c6c7c476bd255c0d"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:410478a0c562d1a5bcc2f7ea448359fcb050ed48b3c6f6f4f18c313a9bdb1826"}, + {file = "frozenlist-1.4.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c6321c9efe29975232da3bd0af0ad216800a47e93d763ce64f291917a381b8eb"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48f6a4533887e189dae092f1cf981f2e3885175f7a0f33c91fb5b7b682b6bab6"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6eb73fa5426ea69ee0e012fb59cdc76a15b1283d6e32e4f8dc4482ec67d1194d"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fbeb989b5cc29e8daf7f976b421c220f1b8c731cbf22b9130d8815418ea45887"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:32453c1de775c889eb4e22f1197fe3bdfe457d16476ea407472b9442e6295f7a"}, + {file = "frozenlist-1.4.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:693945278a31f2086d9bf3df0fe8254bbeaef1fe71e1351c3bd730aa7d31c41b"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1d0ce09d36d53bbbe566fe296965b23b961764c0bcf3ce2fa45f463745c04701"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3a670dc61eb0d0eb7080890c13de3066790f9049b47b0de04007090807c776b0"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:dca69045298ce5c11fd539682cff879cc1e664c245d1c64da929813e54241d11"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a06339f38e9ed3a64e4c4e43aec7f59084033647f908e4259d279a52d3757d09"}, + {file = "frozenlist-1.4.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b7f2f9f912dca3934c1baec2e4585a674ef16fe00218d833856408c48d5beee7"}, + {file = "frozenlist-1.4.1-cp38-cp38-win32.whl", hash = "sha256:e7004be74cbb7d9f34553a5ce5fb08be14fb33bc86f332fb71cbe5216362a497"}, + {file = "frozenlist-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:5a7d70357e7cee13f470c7883a063aae5fe209a493c57d86eb7f5a6f910fae09"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfa4a17e17ce9abf47a74ae02f32d014c5e9404b6d9ac7f729e01562bbee601e"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7e3ed87d4138356775346e6845cccbe66cd9e207f3cd11d2f0b9fd13681359d"}, + {file = "frozenlist-1.4.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c99169d4ff810155ca50b4da3b075cbde79752443117d89429595c2e8e37fed8"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edb678da49d9f72c9f6c609fbe41a5dfb9a9282f9e6a2253d5a91e0fc382d7c0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6db4667b187a6742b33afbbaf05a7bc551ffcf1ced0000a571aedbb4aa42fc7b"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55fdc093b5a3cb41d420884cdaf37a1e74c3c37a31f46e66286d9145d2063bd0"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82e8211d69a4f4bc360ea22cd6555f8e61a1bd211d1d5d39d3d228b48c83a897"}, + {file = "frozenlist-1.4.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89aa2c2eeb20957be2d950b85974b30a01a762f3308cd02bb15e1ad632e22dc7"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9d3e0c25a2350080e9319724dede4f31f43a6c9779be48021a7f4ebde8b2d742"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7268252af60904bf52c26173cbadc3a071cece75f873705419c8681f24d3edea"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0c250a29735d4f15321007fb02865f0e6b6a41a6b88f1f523ca1596ab5f50bd5"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:96ec70beabbd3b10e8bfe52616a13561e58fe84c0101dd031dc78f250d5128b9"}, + {file = "frozenlist-1.4.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:23b2d7679b73fe0e5a4560b672a39f98dfc6f60df63823b0a9970525325b95f6"}, + {file = "frozenlist-1.4.1-cp39-cp39-win32.whl", hash = "sha256:a7496bfe1da7fb1a4e1cc23bb67c58fab69311cc7d32b5a99c2007b4b2a0e932"}, + {file = "frozenlist-1.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:e6a20a581f9ce92d389a8c7d7c3dd47c81fd5d6e655c8dddf341e14aa48659d0"}, + {file = "frozenlist-1.4.1-py3-none-any.whl", hash = "sha256:04ced3e6a46b4cfffe20f9ae482818e34eba9b5fb0ce4056e4cc9b6e212d09b7"}, + {file = "frozenlist-1.4.1.tar.gz", hash = "sha256:c037a86e8513059a2613aaba4d817bb90b9d9b6b69aace3ce9c877e8c8ed402b"}, ] [[package]] @@ -2605,18 +2639,17 @@ scandir = ["scandir (>=1.5,<2.0)"] [[package]] name = "fsspec" -version = "2023.6.0" +version = "2024.3.1" description = "File-system specification" optional = true python-versions = ">=3.8" files = [ - {file = "fsspec-2023.6.0-py3-none-any.whl", hash = "sha256:1cbad1faef3e391fba6dc005ae9b5bdcbf43005c9167ce78c915549c352c869a"}, - {file = "fsspec-2023.6.0.tar.gz", hash = "sha256:d0b2f935446169753e7a5c5c55681c54ea91996cc67be93c39a154fb3a2742af"}, + {file = "fsspec-2024.3.1-py3-none-any.whl", hash = "sha256:918d18d41bf73f0e2b261824baeb1b124bcf771767e3a26425cd7dec3332f512"}, + {file = "fsspec-2024.3.1.tar.gz", hash = "sha256:f39780e282d7d117ffb42bb96992f8a90795e4d0fb0f661a70ca39fe9c43ded9"}, ] [package.dependencies] aiohttp = {version = "<4.0.0a0 || >4.0.0a0,<4.0.0a1 || >4.0.0a1", optional = true, markers = "extra == \"http\""} -requests = {version = "*", optional = true, markers = "extra == \"http\""} [package.extras] abfs = ["adlfs"] @@ -2633,7 +2666,7 @@ github = ["requests"] gs = ["gcsfs"] gui = ["panel"] hdfs = ["pyarrow (>=1)"] -http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "requests"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] libarchive = ["libarchive-c"] oci = ["ocifs"] s3 = ["s3fs"] @@ -2644,54 +2677,53 @@ tqdm = ["tqdm"] [[package]] name = "fugue" -version = "0.8.5" +version = "0.8.7" description = "An abstraction layer for distributed computation" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "fugue-0.8.5-py3-none-any.whl", hash = "sha256:cb4173bd787a7afbabf96b5233f942c1422ce6722dcdd64daef72814be791d69"}, - {file = "fugue-0.8.5.tar.gz", hash = "sha256:e6bee3339d1cfeed3bec5967884914da492305fe19262a718b2796481e9a7cfa"}, + {file = "fugue-0.8.7-py3-none-any.whl", hash = "sha256:d4dc16bac9850024109b999cd163a6ca4976bd0bf190a85730d91ff74737c3f2"}, + {file = "fugue-0.8.7.tar.gz", hash = "sha256:4c56946de46083778cdd6ec5b91ac5d37a847164c80790771edc6832bb9a260d"}, ] [package.dependencies] adagio = ">=0.2.4" fugue-sql-antlr = ">=0.1.6" jinja2 = "*" -pandas = ">=1.2.0" -pyarrow = ">=0.15.1" -qpd = ">=0.4.3" +qpd = ">=0.4.4" sqlglot = "*" -triad = ">=0.9.0" +triad = ">=0.9.3" [package.extras] -all = ["dask[dataframe,distributed]", "dask[dataframe,distributed] (>=2022.9.0)", "duckdb (>=0.5.0)", "fugue-sql-antlr[cpp] (>=0.1.6)", "ibis-framework (>=2.1.1)", "ibis-framework (>=3.2.0)", "ipython (>=7.10.0)", "jinja2", "jupyterlab", "notebook", "polars", "pyarrow (>=6.0.1)", "pyspark (>=3.1.1)", "qpd[dask] (>=0.4.3)", "ray[data] (>=2.0.0)", "sqlglot"] +all = ["dask-sql", "dask[dataframe,distributed] (>=2023.5.0)", "duckdb (>=0.5.0)", "fugue-sql-antlr[cpp] (>=0.1.6)", "ibis-framework (>=3.2.0,<6)", "ipython (>=7.10.0)", "jinja2", "jupyterlab", "notebook", "pandas (>=2.0.2)", "polars", "pyarrow (>=6.0.1)", "pyspark (>=3.1.1)", "ray[data] (>=2.4.0)", "sqlglot"] cpp-sql-parser = ["fugue-sql-antlr[cpp] (>=0.1.6)"] -dask = ["dask[dataframe,distributed]", "dask[dataframe,distributed] (>=2022.9.0)", "qpd[dask] (>=0.4.3)"] -duckdb = ["duckdb (>=0.5.0)", "numpy", "pyarrow (>=6.0.1)"] -ibis = ["ibis-framework (>=2.1.1)", "ibis-framework (>=3.2.0)"] +dask = ["dask[dataframe,distributed] (>=2023.5.0)", "pandas (>=2.0.2)", "pyarrow (>=7.0.0)"] +duckdb = ["duckdb (>=0.5.0)", "numpy"] +ibis = ["ibis-framework (>=3.2.0,<6)"] notebook = ["ipython (>=7.10.0)", "jupyterlab", "notebook"] polars = ["polars"] -ray = ["duckdb (>=0.5.0)", "pyarrow (>=6.0.1)", "ray[data] (>=2.0.0)"] +ray = ["duckdb (>=0.5.0)", "pyarrow (>=6.0.1)", "ray[data] (>=2.4.0)"] spark = ["pyspark (>=3.1.1)"] -sql = ["fugue-sql-antlr (>=0.1.6)", "jinja2", "qpd (>=0.4.3)", "sqlglot"] +sql = ["fugue-sql-antlr (>=0.1.6)", "jinja2", "qpd (>=0.4.4)", "sqlglot"] [[package]] name = "fugue-sql-antlr" -version = "0.1.6" +version = "0.2.0" description = "Fugue SQL Antlr Parser" optional = true -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "fugue-sql-antlr-0.1.6.tar.gz", hash = "sha256:7787bb0e8fa9e1333cd09a6fee913cae1e02ec26f91cabae9e821adf4cca4f5e"}, + {file = "fugue-sql-antlr-0.2.0.tar.gz", hash = "sha256:e15433aaf09502c5b0423019d9fa93e161172ceb08e7bd27af0175dadf3cf552"}, ] [package.dependencies] -antlr4-python3-runtime = ">=4.11.1,<4.12" +antlr4-python3-runtime = "<4.12" jinja2 = "*" +packaging = "*" triad = ">=0.6.8" [package.extras] -cpp = ["fugue-sql-antlr-cpp (==0.1.6)"] +cpp = ["fugue-sql-antlr-cpp (==0.2.0)"] test = ["speedy_antlr_tool"] [[package]] @@ -2707,23 +2739,24 @@ files = [ [[package]] name = "future" -version = "0.18.3" +version = "1.0.0" description = "Clean single-source support for Python 3 and 2" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ - {file = "future-0.18.3.tar.gz", hash = "sha256:34a17436ed1e96697a86f9de3d15a3b0be01d8bc8de9c1dffd59fb8234ed5307"}, + {file = "future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216"}, + {file = "future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05"}, ] [[package]] name = "gitdb" -version = "4.0.10" +version = "4.0.11" description = "Git Object Database" optional = false python-versions = ">=3.7" files = [ - {file = "gitdb-4.0.10-py3-none-any.whl", hash = "sha256:c286cf298426064079ed96a9e4a9d39e7f3e9bf15ba60701e95f5492f28415c7"}, - {file = "gitdb-4.0.10.tar.gz", hash = "sha256:6eb990b69df4e15bad899ea868dc46572c3f75339735663b81de79b06f17eb9a"}, + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, ] [package.dependencies] @@ -2731,35 +2764,37 @@ smmap = ">=3.0.1,<6" [[package]] name = "gitpython" -version = "3.1.32" +version = "3.1.43" description = "GitPython is a Python library used to interact with Git repositories" optional = false python-versions = ">=3.7" files = [ - {file = "GitPython-3.1.32-py3-none-any.whl", hash = "sha256:e3d59b1c2c6ebb9dfa7a184daf3b6dd4914237e7488a1730a6d8f6f5d0b4187f"}, - {file = "GitPython-3.1.32.tar.gz", hash = "sha256:8d9b8cb1e80b9735e8717c9362079d3ce4c6e5ddeebedd0361b228c3a67a62f6"}, + {file = "GitPython-3.1.43-py3-none-any.whl", hash = "sha256:eec7ec56b92aad751f9912a73404bc02ba212a23adb2c7098ee668417051a1ff"}, + {file = "GitPython-3.1.43.tar.gz", hash = "sha256:35f314a9f878467f5453cc1fee295c3e18e52f1b99f10f6cf5b1682e968a9e7c"}, ] [package.dependencies] gitdb = ">=4.0.1,<5" +[package.extras] +doc = ["sphinx (==4.3.2)", "sphinx-autodoc-typehints", "sphinx-rtd-theme", "sphinxcontrib-applehelp (>=1.0.2,<=1.0.4)", "sphinxcontrib-devhelp (==1.0.2)", "sphinxcontrib-htmlhelp (>=2.0.0,<=2.0.1)", "sphinxcontrib-qthelp (==1.0.3)", "sphinxcontrib-serializinghtml (==1.1.5)"] +test = ["coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "typing-extensions"] + [[package]] name = "google-auth" -version = "2.22.0" +version = "2.29.0" description = "Google Authentication Library" optional = true -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "google-auth-2.22.0.tar.gz", hash = "sha256:164cba9af4e6e4e40c3a4f90a1a6c12ee56f14c0b4868d1ca91b32826ab334ce"}, - {file = "google_auth-2.22.0-py2.py3-none-any.whl", hash = "sha256:d61d1b40897407b574da67da1a833bdc10d5a11642566e506565d1b1a46ba873"}, + {file = "google-auth-2.29.0.tar.gz", hash = "sha256:672dff332d073227550ffc7457868ac4218d6c500b155fe6cc17d2b13602c360"}, + {file = "google_auth-2.29.0-py2.py3-none-any.whl", hash = "sha256:d452ad095688cd52bae0ad6fafe027f6a6d6f560e810fec20914e17a09526415"}, ] [package.dependencies] cachetools = ">=2.0.0,<6.0" pyasn1-modules = ">=0.2.1" rsa = ">=3.1.4,<5" -six = ">=1.9.0" -urllib3 = "<2.0" [package.extras] aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] @@ -2788,87 +2823,96 @@ tool = ["click (>=6.0.0)"] [[package]] name = "graphlib-backport" -version = "1.0.3" +version = "1.1.0" description = "Backport of the Python 3.9 graphlib module for Python 3.6+" optional = false python-versions = ">=3.6,<4.0" files = [ - {file = "graphlib_backport-1.0.3-py3-none-any.whl", hash = "sha256:24246967b9e7e6a91550bc770e6169585d35aa32790258579a8a3899a8c18fde"}, - {file = "graphlib_backport-1.0.3.tar.gz", hash = "sha256:7bb8fc7757b8ae4e6d8000a26cd49e9232aaa9a3aa57edb478474b8424bfaae2"}, + {file = "graphlib_backport-1.1.0-py3-none-any.whl", hash = "sha256:eccacf9f2126cdf89ce32a6018c88e1ecd3e4898a07568add6e1907a439055ba"}, + {file = "graphlib_backport-1.1.0.tar.gz", hash = "sha256:00a7888b21e5393064a133209cb5d3b3ef0a2096cf023914c9d778dff5644125"}, ] [[package]] name = "graphviz" -version = "0.20.1" +version = "0.20.3" description = "Simple Python interface for Graphviz" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "graphviz-0.20.1-py3-none-any.whl", hash = "sha256:587c58a223b51611c0cf461132da386edd896a029524ca61a1462b880bf97977"}, - {file = "graphviz-0.20.1.zip", hash = "sha256:8c58f14adaa3b947daf26c19bc1e98c4e0702cdc31cf99153e6f06904d492bf8"}, + {file = "graphviz-0.20.3-py3-none-any.whl", hash = "sha256:81f848f2904515d8cd359cc611faba817598d2feaac4027b266aa3eda7b3dde5"}, + {file = "graphviz-0.20.3.zip", hash = "sha256:09d6bc81e6a9fa392e7ba52135a9d49f1ed62526f96499325930e87ca1b5925d"}, ] [package.extras] dev = ["flake8", "pep8-naming", "tox (>=3)", "twine", "wheel"] -docs = ["sphinx (>=5)", "sphinx-autodoc-typehints", "sphinx-rtd-theme"] -test = ["coverage", "mock (>=4)", "pytest (>=7)", "pytest-cov", "pytest-mock (>=3)"] +docs = ["sphinx (>=5,<7)", "sphinx-autodoc-typehints", "sphinx-rtd-theme"] +test = ["coverage", "pytest (>=7,<8.1)", "pytest-cov", "pytest-mock (>=3)"] [[package]] name = "grpcio" -version = "1.56.2" +version = "1.62.2" description = "HTTP/2-based RPC framework" optional = false python-versions = ">=3.7" files = [ - {file = "grpcio-1.56.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:bf0b9959e673505ee5869950642428046edb91f99942607c2ecf635f8a4b31c9"}, - {file = "grpcio-1.56.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:5144feb20fe76e73e60c7d73ec3bf54f320247d1ebe737d10672480371878b48"}, - {file = "grpcio-1.56.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:a72797549935c9e0b9bc1def1768c8b5a709538fa6ab0678e671aec47ebfd55e"}, - {file = "grpcio-1.56.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3f3237a57e42f79f1e560726576aedb3a7ef931f4e3accb84ebf6acc485d316"}, - {file = "grpcio-1.56.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:900bc0096c2ca2d53f2e5cebf98293a7c32f532c4aeb926345e9747452233950"}, - {file = "grpcio-1.56.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:97e0efaebbfd222bcaac2f1735c010c1d3b167112d9d237daebbeedaaccf3d1d"}, - {file = "grpcio-1.56.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c0c85c5cbe8b30a32fa6d802588d55ffabf720e985abe9590c7c886919d875d4"}, - {file = "grpcio-1.56.2-cp310-cp310-win32.whl", hash = "sha256:06e84ad9ae7668a109e970c7411e7992751a116494cba7c4fb877656527f9a57"}, - {file = "grpcio-1.56.2-cp310-cp310-win_amd64.whl", hash = "sha256:10954662f77dc36c9a1fb5cc4a537f746580d6b5734803be1e587252682cda8d"}, - {file = "grpcio-1.56.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:c435f5ce1705de48e08fcbcfaf8aee660d199c90536e3e06f2016af7d6a938dd"}, - {file = "grpcio-1.56.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:6108e5933eb8c22cd3646e72d5b54772c29f57482fd4c41a0640aab99eb5071d"}, - {file = "grpcio-1.56.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:8391cea5ce72f4a12368afd17799474015d5d3dc00c936a907eb7c7eaaea98a5"}, - {file = "grpcio-1.56.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:750de923b456ca8c0f1354d6befca45d1f3b3a789e76efc16741bd4132752d95"}, - {file = "grpcio-1.56.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fda2783c12f553cdca11c08e5af6eecbd717280dc8fbe28a110897af1c15a88c"}, - {file = "grpcio-1.56.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:9e04d4e4cfafa7c5264e535b5d28e786f0571bea609c3f0aaab13e891e933e9c"}, - {file = "grpcio-1.56.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:89a49cc5ad08a38b6141af17e00d1dd482dc927c7605bc77af457b5a0fca807c"}, - {file = "grpcio-1.56.2-cp311-cp311-win32.whl", hash = "sha256:6a007a541dff984264981fbafeb052bfe361db63578948d857907df9488d8774"}, - {file = "grpcio-1.56.2-cp311-cp311-win_amd64.whl", hash = "sha256:af4063ef2b11b96d949dccbc5a987272f38d55c23c4c01841ea65a517906397f"}, - {file = "grpcio-1.56.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:a6ff459dac39541e6a2763a4439c4ca6bc9ecb4acc05a99b79246751f9894756"}, - {file = "grpcio-1.56.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:f20fd21f7538f8107451156dd1fe203300b79a9ddceba1ee0ac8132521a008ed"}, - {file = "grpcio-1.56.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:d1fbad1f9077372b6587ec589c1fc120b417b6c8ad72d3e3cc86bbbd0a3cee93"}, - {file = "grpcio-1.56.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ee26e9dfb3996aff7c870f09dc7ad44a5f6732b8bdb5a5f9905737ac6fd4ef1"}, - {file = "grpcio-1.56.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4c60abd950d6de3e4f1ddbc318075654d275c29c846ab6a043d6ed2c52e4c8c"}, - {file = "grpcio-1.56.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1c31e52a04e62c8577a7bf772b3e7bed4df9c9e0dd90f92b6ffa07c16cab63c9"}, - {file = "grpcio-1.56.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:345356b307cce5d14355e8e055b4ca5f99bc857c33a3dc1ddbc544fca9cd0475"}, - {file = "grpcio-1.56.2-cp37-cp37m-win_amd64.whl", hash = "sha256:42e63904ee37ae46aa23de50dac8b145b3596f43598fa33fe1098ab2cbda6ff5"}, - {file = "grpcio-1.56.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:7c5ede2e2558f088c49a1ddda19080e4c23fb5d171de80a726b61b567e3766ed"}, - {file = "grpcio-1.56.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:33971197c47965cc1d97d78d842163c283e998223b151bab0499b951fd2c0b12"}, - {file = "grpcio-1.56.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:d39f5d4af48c138cb146763eda14eb7d8b3ccbbec9fe86fb724cd16e0e914c64"}, - {file = "grpcio-1.56.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ded637176addc1d3eef35331c39acc598bac550d213f0a1bedabfceaa2244c87"}, - {file = "grpcio-1.56.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c90da4b124647547a68cf2f197174ada30c7bb9523cb976665dfd26a9963d328"}, - {file = "grpcio-1.56.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3ccb621749a81dc7755243665a70ce45536ec413ef5818e013fe8dfbf5aa497b"}, - {file = "grpcio-1.56.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4eb37dd8dd1aa40d601212afa27ca5be255ba792e2e0b24d67b8af5e012cdb7d"}, - {file = "grpcio-1.56.2-cp38-cp38-win32.whl", hash = "sha256:ddb4a6061933bd9332b74eac0da25f17f32afa7145a33a0f9711ad74f924b1b8"}, - {file = "grpcio-1.56.2-cp38-cp38-win_amd64.whl", hash = "sha256:8940d6de7068af018dfa9a959a3510e9b7b543f4c405e88463a1cbaa3b2b379a"}, - {file = "grpcio-1.56.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:51173e8fa6d9a2d85c14426bdee5f5c4a0654fd5fddcc21fe9d09ab0f6eb8b35"}, - {file = "grpcio-1.56.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:373b48f210f43327a41e397391715cd11cfce9ded2fe76a5068f9bacf91cc226"}, - {file = "grpcio-1.56.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:42a3bbb2bc07aef72a7d97e71aabecaf3e4eb616d39e5211e2cfe3689de860ca"}, - {file = "grpcio-1.56.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5344be476ac37eb9c9ad09c22f4ea193c1316bf074f1daf85bddb1b31fda5116"}, - {file = "grpcio-1.56.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3fa3ab0fb200a2c66493828ed06ccd1a94b12eddbfb985e7fd3e5723ff156c6"}, - {file = "grpcio-1.56.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b975b85d1d5efc36cf8b237c5f3849b64d1ba33d6282f5e991f28751317504a1"}, - {file = "grpcio-1.56.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:cbdf2c498e077282cd427cfd88bdce4668019791deef0be8155385ab2ba7837f"}, - {file = "grpcio-1.56.2-cp39-cp39-win32.whl", hash = "sha256:139f66656a762572ae718fa0d1f2dce47c05e9fbf7a16acd704c354405b97df9"}, - {file = "grpcio-1.56.2-cp39-cp39-win_amd64.whl", hash = "sha256:830215173ad45d670140ff99aac3b461f9be9a6b11bee1a17265aaaa746a641a"}, - {file = "grpcio-1.56.2.tar.gz", hash = "sha256:0ff789ae7d8ddd76d2ac02e7d13bfef6fc4928ac01e1dcaa182be51b6bcc0aaa"}, + {file = "grpcio-1.62.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:66344ea741124c38588a664237ac2fa16dfd226964cca23ddc96bd4accccbde5"}, + {file = "grpcio-1.62.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:5dab7ac2c1e7cb6179c6bfad6b63174851102cbe0682294e6b1d6f0981ad7138"}, + {file = "grpcio-1.62.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:3ad00f3f0718894749d5a8bb0fa125a7980a2f49523731a9b1fabf2b3522aa43"}, + {file = "grpcio-1.62.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e72ddfee62430ea80133d2cbe788e0d06b12f865765cb24a40009668bd8ea05"}, + {file = "grpcio-1.62.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:53d3a59a10af4c2558a8e563aed9f256259d2992ae0d3037817b2155f0341de1"}, + {file = "grpcio-1.62.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a1511a303f8074f67af4119275b4f954189e8313541da7b88b1b3a71425cdb10"}, + {file = "grpcio-1.62.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b94d41b7412ef149743fbc3178e59d95228a7064c5ab4760ae82b562bdffb199"}, + {file = "grpcio-1.62.2-cp310-cp310-win32.whl", hash = "sha256:a75af2fc7cb1fe25785be7bed1ab18cef959a376cdae7c6870184307614caa3f"}, + {file = "grpcio-1.62.2-cp310-cp310-win_amd64.whl", hash = "sha256:80407bc007754f108dc2061e37480238b0dc1952c855e86a4fc283501ee6bb5d"}, + {file = "grpcio-1.62.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:c1624aa686d4b36790ed1c2e2306cc3498778dffaf7b8dd47066cf819028c3ad"}, + {file = "grpcio-1.62.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:1c1bb80299bdef33309dff03932264636450c8fdb142ea39f47e06a7153d3063"}, + {file = "grpcio-1.62.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:db068bbc9b1fa16479a82e1ecf172a93874540cb84be69f0b9cb9b7ac3c82670"}, + {file = "grpcio-1.62.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2cc8a308780edbe2c4913d6a49dbdb5befacdf72d489a368566be44cadaef1a"}, + {file = "grpcio-1.62.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d0695ae31a89f1a8fc8256050329a91a9995b549a88619263a594ca31b76d756"}, + {file = "grpcio-1.62.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:88b4f9ee77191dcdd8810241e89340a12cbe050be3e0d5f2f091c15571cd3930"}, + {file = "grpcio-1.62.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2a0204532aa2f1afd467024b02b4069246320405bc18abec7babab03e2644e75"}, + {file = "grpcio-1.62.2-cp311-cp311-win32.whl", hash = "sha256:6e784f60e575a0de554ef9251cbc2ceb8790914fe324f11e28450047f264ee6f"}, + {file = "grpcio-1.62.2-cp311-cp311-win_amd64.whl", hash = "sha256:112eaa7865dd9e6d7c0556c8b04ae3c3a2dc35d62ad3373ab7f6a562d8199200"}, + {file = "grpcio-1.62.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:65034473fc09628a02fb85f26e73885cf1ed39ebd9cf270247b38689ff5942c5"}, + {file = "grpcio-1.62.2-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:d2c1771d0ee3cf72d69bb5e82c6a82f27fbd504c8c782575eddb7839729fbaad"}, + {file = "grpcio-1.62.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:3abe6838196da518863b5d549938ce3159d809218936851b395b09cad9b5d64a"}, + {file = "grpcio-1.62.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5ffeb269f10cedb4f33142b89a061acda9f672fd1357331dbfd043422c94e9e"}, + {file = "grpcio-1.62.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:404d3b4b6b142b99ba1cff0b2177d26b623101ea2ce51c25ef6e53d9d0d87bcc"}, + {file = "grpcio-1.62.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:262cda97efdabb20853d3b5a4c546a535347c14b64c017f628ca0cc7fa780cc6"}, + {file = "grpcio-1.62.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17708db5b11b966373e21519c4c73e5a750555f02fde82276ea2a267077c68ad"}, + {file = "grpcio-1.62.2-cp312-cp312-win32.whl", hash = "sha256:b7ec9e2f8ffc8436f6b642a10019fc513722858f295f7efc28de135d336ac189"}, + {file = "grpcio-1.62.2-cp312-cp312-win_amd64.whl", hash = "sha256:aa787b83a3cd5e482e5c79be030e2b4a122ecc6c5c6c4c42a023a2b581fdf17b"}, + {file = "grpcio-1.62.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:cfd23ad29bfa13fd4188433b0e250f84ec2c8ba66b14a9877e8bce05b524cf54"}, + {file = "grpcio-1.62.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:af15e9efa4d776dfcecd1d083f3ccfb04f876d613e90ef8432432efbeeac689d"}, + {file = "grpcio-1.62.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:f4aa94361bb5141a45ca9187464ae81a92a2a135ce2800b2203134f7a1a1d479"}, + {file = "grpcio-1.62.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82af3613a219512a28ee5c95578eb38d44dd03bca02fd918aa05603c41018051"}, + {file = "grpcio-1.62.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:55ddaf53474e8caeb29eb03e3202f9d827ad3110475a21245f3c7712022882a9"}, + {file = "grpcio-1.62.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c79b518c56dddeec79e5500a53d8a4db90da995dfe1738c3ac57fe46348be049"}, + {file = "grpcio-1.62.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a5eb4844e5e60bf2c446ef38c5b40d7752c6effdee882f716eb57ae87255d20a"}, + {file = "grpcio-1.62.2-cp37-cp37m-win_amd64.whl", hash = "sha256:aaae70364a2d1fb238afd6cc9fcb10442b66e397fd559d3f0968d28cc3ac929c"}, + {file = "grpcio-1.62.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:1bcfe5070e4406f489e39325b76caeadab28c32bf9252d3ae960c79935a4cc36"}, + {file = "grpcio-1.62.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:da6a7b6b938c15fa0f0568e482efaae9c3af31963eec2da4ff13a6d8ec2888e4"}, + {file = "grpcio-1.62.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:41955b641c34db7d84db8d306937b72bc4968eef1c401bea73081a8d6c3d8033"}, + {file = "grpcio-1.62.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c772f225483905f675cb36a025969eef9712f4698364ecd3a63093760deea1bc"}, + {file = "grpcio-1.62.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07ce1f775d37ca18c7a141300e5b71539690efa1f51fe17f812ca85b5e73262f"}, + {file = "grpcio-1.62.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:26f415f40f4a93579fd648f48dca1c13dfacdfd0290f4a30f9b9aeb745026811"}, + {file = "grpcio-1.62.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:db707e3685ff16fc1eccad68527d072ac8bdd2e390f6daa97bc394ea7de4acea"}, + {file = "grpcio-1.62.2-cp38-cp38-win32.whl", hash = "sha256:589ea8e75de5fd6df387de53af6c9189c5231e212b9aa306b6b0d4f07520fbb9"}, + {file = "grpcio-1.62.2-cp38-cp38-win_amd64.whl", hash = "sha256:3c3ed41f4d7a3aabf0f01ecc70d6b5d00ce1800d4af652a549de3f7cf35c4abd"}, + {file = "grpcio-1.62.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:162ccf61499c893831b8437120600290a99c0bc1ce7b51f2c8d21ec87ff6af8b"}, + {file = "grpcio-1.62.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:f27246d7da7d7e3bd8612f63785a7b0c39a244cf14b8dd9dd2f2fab939f2d7f1"}, + {file = "grpcio-1.62.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:2507006c8a478f19e99b6fe36a2464696b89d40d88f34e4b709abe57e1337467"}, + {file = "grpcio-1.62.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a90ac47a8ce934e2c8d71e317d2f9e7e6aaceb2d199de940ce2c2eb611b8c0f4"}, + {file = "grpcio-1.62.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:99701979bcaaa7de8d5f60476487c5df8f27483624f1f7e300ff4669ee44d1f2"}, + {file = "grpcio-1.62.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:af7dc3f7a44f10863b1b0ecab4078f0a00f561aae1edbd01fd03ad4dcf61c9e9"}, + {file = "grpcio-1.62.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fa63245271920786f4cb44dcada4983a3516be8f470924528cf658731864c14b"}, + {file = "grpcio-1.62.2-cp39-cp39-win32.whl", hash = "sha256:c6ad9c39704256ed91a1cffc1379d63f7d0278d6a0bad06b0330f5d30291e3a3"}, + {file = "grpcio-1.62.2-cp39-cp39-win_amd64.whl", hash = "sha256:16da954692fd61aa4941fbeda405a756cd96b97b5d95ca58a92547bba2c1624f"}, + {file = "grpcio-1.62.2.tar.gz", hash = "sha256:c77618071d96b7a8be2c10701a98537823b9c65ba256c0b9067e0594cdbd954d"}, ] [package.extras] -protobuf = ["grpcio-tools (>=1.56.2)"] +protobuf = ["grpcio-tools (>=1.62.2)"] [[package]] name = "h11" @@ -2932,39 +2976,40 @@ lxml = ["lxml"] [[package]] name = "httpcore" -version = "0.17.3" +version = "1.0.5" description = "A minimal low-level HTTP client." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "httpcore-0.17.3-py3-none-any.whl", hash = "sha256:c2789b767ddddfa2a5782e3199b2b7f6894540b17b16ec26b2c4d8e103510b87"}, - {file = "httpcore-0.17.3.tar.gz", hash = "sha256:a6f30213335e34c1ade7be6ec7c47f19f50c56db36abef1a9dfa3815b1cb3888"}, + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, ] [package.dependencies] -anyio = ">=3.0,<5.0" certifi = "*" h11 = ">=0.13,<0.15" -sniffio = "==1.*" [package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.26.0)"] [[package]] name = "httpx" -version = "0.24.1" +version = "0.27.0" description = "The next generation HTTP client." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "httpx-0.24.1-py3-none-any.whl", hash = "sha256:06781eb9ac53cde990577af654bd990a4949de37a28bdb4a230d434f3a30b9bd"}, - {file = "httpx-0.24.1.tar.gz", hash = "sha256:5853a43053df830c20f8110c5e69fe44d035d850b2dfe795e196f00fdb774bdd"}, + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, ] [package.dependencies] +anyio = "*" certifi = "*" -httpcore = ">=0.15.0,<0.18.0" +httpcore = "==1.*" idna = "*" sniffio = "*" @@ -2976,18 +3021,18 @@ socks = ["socksio (==1.*)"] [[package]] name = "huggingface-hub" -version = "0.16.4" +version = "0.22.2" description = "Client library to download and publish models, datasets and other repos on the huggingface.co hub" optional = true -python-versions = ">=3.7.0" +python-versions = ">=3.8.0" files = [ - {file = "huggingface_hub-0.16.4-py3-none-any.whl", hash = "sha256:0d3df29932f334fead024afc7cb4cc5149d955238b8b5e42dcf9740d6995a349"}, - {file = "huggingface_hub-0.16.4.tar.gz", hash = "sha256:608c7d4f3d368b326d1747f91523dbd1f692871e8e2e7a4750314a2dd8b63e14"}, + {file = "huggingface_hub-0.22.2-py3-none-any.whl", hash = "sha256:3429e25f38ccb834d310804a3b711e7e4953db5a9e420cc147a5e194ca90fd17"}, + {file = "huggingface_hub-0.22.2.tar.gz", hash = "sha256:32e9a9a6843c92f253ff9ca16b9985def4d80a93fb357af5353f770ef74a81be"}, ] [package.dependencies] filelock = "*" -fsspec = "*" +fsspec = ">=2023.5.0" packaging = ">=20.9" pyyaml = ">=5.1" requests = "*" @@ -2995,26 +3040,28 @@ tqdm = ">=4.42.1" typing-extensions = ">=3.7.4.3" [package.extras] -all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "black (>=23.1,<24.0)", "gradio", "jedi", "mypy (==0.982)", "numpy", "pydantic", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "urllib3 (<2.0)"] +all = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] cli = ["InquirerPy (==0.3.4)"] -dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "black (>=23.1,<24.0)", "gradio", "jedi", "mypy (==0.982)", "numpy", "pydantic", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "ruff (>=0.0.241)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "urllib3 (<2.0)"] +dev = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "minijinja (>=1.0)", "mypy (==1.5.1)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "ruff (>=0.3.0)", "soundfile", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)", "urllib3 (<2.0)"] fastai = ["fastai (>=2.4)", "fastcore (>=1.3.27)", "toml"] -inference = ["aiohttp", "pydantic"] -quality = ["black (>=23.1,<24.0)", "mypy (==0.982)", "ruff (>=0.0.241)"] +hf-transfer = ["hf-transfer (>=0.1.4)"] +inference = ["aiohttp", "minijinja (>=1.0)"] +quality = ["mypy (==1.5.1)", "ruff (>=0.3.0)"] tensorflow = ["graphviz", "pydot", "tensorflow"] -testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "numpy", "pydantic", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] -torch = ["torch"] -typing = ["pydantic", "types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3"] +tensorflow-testing = ["keras (<3.0)", "tensorflow"] +testing = ["InquirerPy (==0.3.4)", "Jinja2", "Pillow", "aiohttp", "gradio", "jedi", "minijinja (>=1.0)", "numpy", "pytest", "pytest-asyncio", "pytest-cov", "pytest-env", "pytest-rerunfailures", "pytest-vcr", "pytest-xdist", "soundfile", "urllib3 (<2.0)"] +torch = ["safetensors", "torch"] +typing = ["types-PyYAML", "types-requests", "types-simplejson", "types-toml", "types-tqdm", "types-urllib3", "typing-extensions (>=4.8.0)"] [[package]] name = "identify" -version = "2.5.25" +version = "2.5.35" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.5.25-py2.py3-none-any.whl", hash = "sha256:9df2489842707d431b38ce3410ef8df40da5b10a3e28a3fcac1a42523e956409"}, - {file = "identify-2.5.25.tar.gz", hash = "sha256:db4de0e758c0db8f81996816cd2f3f2f8c5c8d49a7fd02f3b4109aac6fd80e29"}, + {file = "identify-2.5.35-py2.py3-none-any.whl", hash = "sha256:c4de0081837b211594f8e877a6b4fad7ca32bbfc1a9307fdd61c28bfe923f13e"}, + {file = "identify-2.5.35.tar.gz", hash = "sha256:10a7ca245cfcd756a554a7288159f72ff105ad233c7c4b9c6f0f4d108f5f6791"}, ] [package.extras] @@ -3022,13 +3069,13 @@ license = ["ukkonen"] [[package]] name = "idna" -version = "3.4" +version = "3.7" description = "Internationalized Domain Names in Applications (IDNA)" optional = false python-versions = ">=3.5" files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, ] [[package]] @@ -3044,40 +3091,40 @@ files = [ [[package]] name = "importlib-metadata" -version = "6.8.0" +version = "7.1.0" description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_metadata-6.8.0-py3-none-any.whl", hash = "sha256:3ebb78df84a805d7698245025b975d9d67053cd94c79245ba4b3eb694abe68bb"}, - {file = "importlib_metadata-6.8.0.tar.gz", hash = "sha256:dbace7892d8c0c4ac1ad096662232f831d4e64f4c4545bd53016a3e9d4654743"}, + {file = "importlib_metadata-7.1.0-py3-none-any.whl", hash = "sha256:30962b96c0c223483ed6cc7280e7f0199feb01a0e40cfae4d4450fc6fab1f570"}, + {file = "importlib_metadata-7.1.0.tar.gz", hash = "sha256:b78938b926ee8d5f020fc4772d487045805a55ddbad2ecf21c6d60938dc7fcd2"}, ] [package.dependencies] zipp = ">=0.5" [package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] perf = ["ipython"] -testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] [[package]] name = "importlib-resources" -version = "6.0.0" +version = "6.4.0" description = "Read resources from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "importlib_resources-6.0.0-py3-none-any.whl", hash = "sha256:d952faee11004c045f785bb5636e8f885bed30dc3c940d5d42798a2a4541c185"}, - {file = "importlib_resources-6.0.0.tar.gz", hash = "sha256:4cf94875a8368bd89531a756df9a9ebe1f150e0f885030b461237bc7f2d905f2"}, + {file = "importlib_resources-6.4.0-py3-none-any.whl", hash = "sha256:50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c"}, + {file = "importlib_resources-6.4.0.tar.gz", hash = "sha256:cdb2b453b8046ca4e3798eb1d84f3cce1446a0e8e7b5ef4efb600f19fc398145"}, ] [package.dependencies] zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} [package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["jaraco.test (>=5.4)", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-ruff (>=0.2.1)", "zipp (>=3.17)"] [[package]] name = "inflection" @@ -3114,13 +3161,13 @@ files = [ [[package]] name = "intrinio-sdk" -version = "6.24.1" +version = "6.27.2" description = "Intrinio API" optional = false python-versions = "*" files = [ - {file = "intrinio-sdk-6.24.1.tar.gz", hash = "sha256:d2aab87a63de7b2390f8c8b2281ee5290bb2cc14a6d10e148fcdc870e4eae12a"}, - {file = "intrinio_sdk-6.24.1-py3-none-any.whl", hash = "sha256:72c92a9b6154458759b3badba414fc1bf3b64c3589ab808bd7230a2ad087fccb"}, + {file = "intrinio-sdk-6.27.2.tar.gz", hash = "sha256:fed1a704f5278753efee1143589a7b48d6ffd28b2288012dffbfcaf4834db1be"}, + {file = "intrinio_sdk-6.27.2-py3-none-any.whl", hash = "sha256:6f3f905180073eaf1d2c9cb3441a181ed2c72ff1802af98bcc32a3db2ef06c24"}, ] [package.dependencies] @@ -3132,13 +3179,13 @@ urllib3 = ">=1.15" [[package]] name = "ipykernel" -version = "6.24.0" +version = "6.29.4" description = "IPython Kernel for Jupyter" optional = false python-versions = ">=3.8" files = [ - {file = "ipykernel-6.24.0-py3-none-any.whl", hash = "sha256:2f5fffc7ad8f1fd5aadb4e171ba9129d9668dbafa374732cf9511ada52d6547f"}, - {file = "ipykernel-6.24.0.tar.gz", hash = "sha256:29cea0a716b1176d002a61d0b0c851f34536495bc4ef7dd0222c88b41b816123"}, + {file = "ipykernel-6.29.4-py3-none-any.whl", hash = "sha256:1181e653d95c6808039c509ef8e67c4126b3b3af7781496c7cbfb5ed938a27da"}, + {file = "ipykernel-6.29.4.tar.gz", hash = "sha256:3d44070060f9475ac2092b760123fadf105d2e2493c24848b6691a7c4f42af5c"}, ] [package.dependencies] @@ -3152,7 +3199,7 @@ matplotlib-inline = ">=0.1" nest-asyncio = "*" packaging = "*" psutil = "*" -pyzmq = ">=20" +pyzmq = ">=24" tornado = ">=6.1" traitlets = ">=5.4.0" @@ -3161,7 +3208,7 @@ cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] pyqt5 = ["pyqt5"] pyside6 = ["pyside6"] -test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov", "pytest-timeout"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] [[package]] name = "ipympl" @@ -3230,21 +3277,21 @@ files = [ [[package]] name = "ipywidgets" -version = "8.0.7" +version = "8.1.2" description = "Jupyter interactive widgets" optional = false python-versions = ">=3.7" files = [ - {file = "ipywidgets-8.0.7-py3-none-any.whl", hash = "sha256:e0aed0c95a1e55b6a123f64305245578bdc09e52965a34941c2b6a578b8c64a0"}, - {file = "ipywidgets-8.0.7.tar.gz", hash = "sha256:50ace0a8886e9a0d68b980db82f94c25d55d21ff2340ed36f802dd9365e94acf"}, + {file = "ipywidgets-8.1.2-py3-none-any.whl", hash = "sha256:bbe43850d79fb5e906b14801d6c01402857996864d1e5b6fa62dd2ee35559f60"}, + {file = "ipywidgets-8.1.2.tar.gz", hash = "sha256:d0b9b41e49bae926a866e613a39b0f0097745d2b9f1f3dd406641b4a57ec42c9"}, ] [package.dependencies] -ipykernel = ">=4.5.1" +comm = ">=0.1.3" ipython = ">=6.1.0" -jupyterlab-widgets = ">=3.0.7,<3.1.0" +jupyterlab-widgets = ">=3.0.10,<3.1.0" traitlets = ">=4.3.1" -widgetsnbextension = ">=4.0.7,<4.1.0" +widgetsnbextension = ">=4.0.10,<4.1.0" [package.extras] test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] @@ -3290,31 +3337,17 @@ arrow = ">=0.15.0" [[package]] name = "isort" -version = "5.12.0" +version = "5.13.2" description = "A Python utility / library to sort Python imports." optional = false python-versions = ">=3.8.0" files = [ - {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, - {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, ] [package.extras] -colors = ["colorama (>=0.4.3)"] -pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] -plugins = ["setuptools"] -requirements-deprecated-finder = ["pip-api", "pipreqs"] - -[[package]] -name = "itsdangerous" -version = "2.1.2" -description = "Safely pass data to untrusted environments and back." -optional = true -python-versions = ">=3.7" -files = [ - {file = "itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"}, - {file = "itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"}, -] +colors = ["colorama (>=0.4.6)"] [[package]] name = "jedi" @@ -3355,13 +3388,13 @@ pygls = ">=1.0.0,<2.0.0" [[package]] name = "jinja2" -version = "3.1.2" +version = "3.1.3" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" files = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, ] [package.dependencies] @@ -3372,29 +3405,26 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "joblib" -version = "1.3.1" +version = "1.4.0" description = "Lightweight pipelining with Python functions" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "joblib-1.3.1-py3-none-any.whl", hash = "sha256:89cf0529520e01b3de7ac7b74a8102c90d16d54c64b5dd98cafcd14307fdf915"}, - {file = "joblib-1.3.1.tar.gz", hash = "sha256:1f937906df65329ba98013dc9692fe22a4c5e4a648112de500508b18a21b41e3"}, + {file = "joblib-1.4.0-py3-none-any.whl", hash = "sha256:42942470d4062537be4d54c83511186da1fc14ba354961a2114da91efa9a4ed7"}, + {file = "joblib-1.4.0.tar.gz", hash = "sha256:1eb0dc091919cd384490de890cb5dfd538410a6d4b3b54eef09fb8c50b409b1c"}, ] [[package]] name = "json5" -version = "0.9.14" +version = "0.9.25" description = "A Python implementation of the JSON5 data format." optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "json5-0.9.14-py2.py3-none-any.whl", hash = "sha256:740c7f1b9e584a468dbb2939d8d458db3427f2c93ae2139d05f47e453eae964f"}, - {file = "json5-0.9.14.tar.gz", hash = "sha256:9ed66c3a6ca3510a976a9ef9b8c0787de24802724ab1860bc0153c7fdd589b02"}, + {file = "json5-0.9.25-py3-none-any.whl", hash = "sha256:34ed7d834b1341a86987ed52f3f76cd8ee184394906b6e22a1e0deb9ab294e8f"}, + {file = "json5-0.9.25.tar.gz", hash = "sha256:548e41b9be043f9426776f05df8635a00fe06104ea51ed24b67f908856e151ae"}, ] -[package.extras] -dev = ["hypothesis"] - [[package]] name = "jsonpointer" version = "2.4" @@ -3461,13 +3491,13 @@ test = ["codecov", "coverage", "ipykernel (>=6.5)", "ipython", "mypy", "pre-comm [[package]] name = "jupyter-core" -version = "5.3.1" +version = "5.7.2" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false python-versions = ">=3.8" files = [ - {file = "jupyter_core-5.3.1-py3-none-any.whl", hash = "sha256:ae9036db959a71ec1cac33081eeb040a79e681f08ab68b0883e9a676c7a90dce"}, - {file = "jupyter_core-5.3.1.tar.gz", hash = "sha256:5ba5c7938a7f97a6b0481463f7ff0dbac7c15ba48cf46fa4035ca6e838aa1aba"}, + {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, + {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, ] [package.dependencies] @@ -3476,32 +3506,8 @@ pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_ traitlets = ">=5.3" [package.extras] -docs = ["myst-parser", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] -test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] - -[[package]] -name = "jupyter-dash" -version = "0.4.2" -description = "Dash support for the Jupyter notebook interface" -optional = true -python-versions = ">=3.5" -files = [ - {file = "jupyter-dash-0.4.2.tar.gz", hash = "sha256:d546c7c25a2867c14c95a48af0ad572803b26915a5ce6052158c9dede4dbf48c"}, - {file = "jupyter_dash-0.4.2-py3-none-any.whl", hash = "sha256:b07d90ccf38d4dfb04efd630a2b2627f367b79fa4296ee3912d0c4e21e73e9b2"}, -] - -[package.dependencies] -ansi2html = "*" -dash = "*" -flask = "*" -ipykernel = "*" -ipython = "*" -nest-asyncio = "*" -requests = "*" -retrying = "*" - -[package.extras] -dev = ["jupyter-server-proxy", "jupyterlab (>=2.0)", "notebook (>=6.0)"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] [[package]] name = "jupyter-events" @@ -3529,13 +3535,13 @@ test = ["click", "coverage", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>= [[package]] name = "jupyter-lsp" -version = "2.2.0" +version = "2.2.5" description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" optional = true python-versions = ">=3.8" files = [ - {file = "jupyter-lsp-2.2.0.tar.gz", hash = "sha256:8ebbcb533adb41e5d635eb8fe82956b0aafbf0fd443b6c4bfa906edeeb8635a1"}, - {file = "jupyter_lsp-2.2.0-py3-none-any.whl", hash = "sha256:9e06b8b4f7dd50300b70dd1a78c0c3b0c3d8fa68e0f2d8a5d1fbab62072aca3f"}, + {file = "jupyter-lsp-2.2.5.tar.gz", hash = "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001"}, + {file = "jupyter_lsp-2.2.5-py3-none-any.whl", hash = "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da"}, ] [package.dependencies] @@ -3576,13 +3582,13 @@ test = ["coverage", "ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console [[package]] name = "jupyter-server-fileid" -version = "0.9.0" -description = "" +version = "0.9.2" +description = "Jupyter Server extension providing an implementation of the File ID service." optional = false python-versions = ">=3.7" files = [ - {file = "jupyter_server_fileid-0.9.0-py3-none-any.whl", hash = "sha256:5b489c6fe6783c41174a728c7b81099608518387e53c3d53451a67f46a0cb7b0"}, - {file = "jupyter_server_fileid-0.9.0.tar.gz", hash = "sha256:171538b7c7d08d11dbc57d4e6da196e0c258e4c2cd29249ef1e032bb423677f8"}, + {file = "jupyter_server_fileid-0.9.2-py3-none-any.whl", hash = "sha256:76a2fbcea6950968485dcd509c2d6ac417ca11e61ab1ad447a475f0878ca808f"}, + {file = "jupyter_server_fileid-0.9.2.tar.gz", hash = "sha256:ffb11460ca5f8567644f6120b25613fca8e3f3048b38d14c6e3fe1902f314a9b"}, ] [package.dependencies] @@ -3591,7 +3597,7 @@ jupyter-server = ">=1.15,<3" [package.extras] cli = ["click"] -test = ["jupyter-server[test] (>=1.15,<3)", "pytest", "pytest-cov"] +test = ["jupyter-server[test] (>=1.15,<3)", "pytest", "pytest-cov", "pytest-jupyter"] [[package]] name = "jupyter-server-ydoc" @@ -3633,13 +3639,13 @@ test = ["pre-commit", "pytest", "pytest-asyncio", "websockets (>=10.0)", "ypy-we [[package]] name = "jupyterlab" -version = "3.6.5" +version = "3.6.7" description = "JupyterLab computational environment" optional = false python-versions = ">=3.7" files = [ - {file = "jupyterlab-3.6.5-py3-none-any.whl", hash = "sha256:4d13665c2c2f42c753140d88b52ff8722cd5b38629b934f5612bfa5490bcdc65"}, - {file = "jupyterlab-3.6.5.tar.gz", hash = "sha256:ac0cb19756be1d1e14b2be1f23c603de46e0f0113960fce9888889ca55ae8923"}, + {file = "jupyterlab-3.6.7-py3-none-any.whl", hash = "sha256:d92d57d402f53922bca5090654843aa08e511290dff29fdb0809eafbbeb6df98"}, + {file = "jupyterlab-3.6.7.tar.gz", hash = "sha256:2fadeaec161b0d1aec19f17721d8b803aef1d267f89c8b636b703be14f435c8f"}, ] [package.dependencies] @@ -3657,6 +3663,7 @@ tomli = {version = "*", markers = "python_version < \"3.11\""} tornado = ">=6.1.0" [package.extras] +docs = ["jsx-lexer", "myst-parser", "pytest", "pytest-check-links", "pytest-tornasync", "sphinx (>=1.8)", "sphinx-copybutton", "sphinx-rtd-theme"] test = ["check-manifest", "coverage", "jupyterlab-server[test]", "pre-commit", "pytest (>=6.0)", "pytest-check-links (>=0.5)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "requests", "requests-cache", "virtualenv"] [[package]] @@ -3690,24 +3697,24 @@ jupyterlab = ">=3.1.0,<4.0.0a0" [[package]] name = "jupyterlab-pygments" -version = "0.2.2" +version = "0.3.0" description = "Pygments theme using JupyterLab CSS variables" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "jupyterlab_pygments-0.2.2-py2.py3-none-any.whl", hash = "sha256:2405800db07c9f770863bcf8049a529c3dd4d3e28536638bd7c1c01d2748309f"}, - {file = "jupyterlab_pygments-0.2.2.tar.gz", hash = "sha256:7405d7fde60819d905a9fa8ce89e4cd830e318cdad22a0030f7a901da705585d"}, + {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, + {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, ] [[package]] name = "jupyterlab-server" -version = "2.23.0" +version = "2.24.0" description = "A set of server components for JupyterLab and JupyterLab like applications." optional = false python-versions = ">=3.7" files = [ - {file = "jupyterlab_server-2.23.0-py3-none-any.whl", hash = "sha256:a5ea2c839336a8ba7c38c8e7b2f24cedf919f0d439f4d2e606d9322013a95788"}, - {file = "jupyterlab_server-2.23.0.tar.gz", hash = "sha256:83c01aa4ad9451cd61b383e634d939ff713850f4640c0056b2cdb2b6211a74c7"}, + {file = "jupyterlab_server-2.24.0-py3-none-any.whl", hash = "sha256:5f077e142bb8dc9b843d960f940c513581bceca3793a0d80f9c67d9522c4e876"}, + {file = "jupyterlab_server-2.24.0.tar.gz", hash = "sha256:4e6f99e0a5579bbbc32e449c4dbb039561d4f1a7827d5733273ed56738f21f07"}, ] [package.dependencies] @@ -3723,94 +3730,130 @@ requests = ">=2.28" [package.extras] docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"] openapi = ["openapi-core (>=0.16.1,<0.17.0)", "ruamel-yaml"] -test = ["hatch", "ipykernel", "jupyterlab-server[openapi]", "openapi-spec-validator (>=0.5.1,<0.6.0)", "pytest (>=7.0)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] +test = ["hatch", "ipykernel", "jupyterlab-server[openapi]", "openapi-spec-validator (>=0.5.1,<0.7.0)", "pytest (>=7.0)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] [[package]] name = "jupyterlab-widgets" -version = "3.0.8" +version = "3.0.10" description = "Jupyter interactive widgets for JupyterLab" optional = false python-versions = ">=3.7" files = [ - {file = "jupyterlab_widgets-3.0.8-py3-none-any.whl", hash = "sha256:4715912d6ceab839c9db35953c764b3214ebbc9161c809f6e0510168845dfdf5"}, - {file = "jupyterlab_widgets-3.0.8.tar.gz", hash = "sha256:d428ab97b8d87cc7c54cbf37644d6e0f0e662f23876e05fa460a73ec3257252a"}, + {file = "jupyterlab_widgets-3.0.10-py3-none-any.whl", hash = "sha256:dd61f3ae7a5a7f80299e14585ce6cf3d6925a96c9103c978eda293197730cb64"}, + {file = "jupyterlab_widgets-3.0.10.tar.gz", hash = "sha256:04f2ac04976727e4f9d0fa91cdc2f1ab860f965e504c29dbd6a65c882c9d04c0"}, ] [[package]] name = "kiwisolver" -version = "1.4.4" +version = "1.4.5" description = "A fast implementation of the Cassowary constraint solver" optional = false python-versions = ">=3.7" files = [ - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2f5e60fabb7343a836360c4f0919b8cd0d6dbf08ad2ca6b9cf90bf0c76a3c4f6"}, - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:10ee06759482c78bdb864f4109886dff7b8a56529bc1609d4f1112b93fe6423c"}, - {file = "kiwisolver-1.4.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c79ebe8f3676a4c6630fd3f777f3cfecf9289666c84e775a67d1d358578dc2e3"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abbe9fa13da955feb8202e215c4018f4bb57469b1b78c7a4c5c7b93001699938"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7577c1987baa3adc4b3c62c33bd1118c3ef5c8ddef36f0f2c950ae0b199e100d"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ad8285b01b0d4695102546b342b493b3ccc6781fc28c8c6a1bb63e95d22f09"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ed58b8acf29798b036d347791141767ccf65eee7f26bde03a71c944449e53de"}, - {file = "kiwisolver-1.4.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a68b62a02953b9841730db7797422f983935aeefceb1679f0fc85cbfbd311c32"}, - {file = "kiwisolver-1.4.4-cp310-cp310-win32.whl", hash = "sha256:e92a513161077b53447160b9bd8f522edfbed4bd9759e4c18ab05d7ef7e49408"}, - {file = "kiwisolver-1.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:3fe20f63c9ecee44560d0e7f116b3a747a5d7203376abeea292ab3152334d004"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0ea21f66820452a3f5d1655f8704a60d66ba1191359b96541eaf457710a5fc6"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bc9db8a3efb3e403e4ecc6cd9489ea2bac94244f80c78e27c31dcc00d2790ac2"}, - {file = "kiwisolver-1.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d5b61785a9ce44e5a4b880272baa7cf6c8f48a5180c3e81c59553ba0cb0821ca"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c2dbb44c3f7e6c4d3487b31037b1bdbf424d97687c1747ce4ff2895795c9bf69"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295ecd49304dcf3bfbfa45d9a081c96509e95f4b9d0eb7ee4ec0530c4a96514"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4bd472dbe5e136f96a4b18f295d159d7f26fd399136f5b17b08c4e5f498cd494"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bf7d9fce9bcc4752ca4a1b80aabd38f6d19009ea5cbda0e0856983cf6d0023f5"}, - {file = "kiwisolver-1.4.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78d6601aed50c74e0ef02f4204da1816147a6d3fbdc8b3872d263338a9052c51"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:877272cf6b4b7e94c9614f9b10140e198d2186363728ed0f701c6eee1baec1da"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:db608a6757adabb32f1cfe6066e39b3706d8c3aa69bbc353a5b61edad36a5cb4"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5853eb494c71e267912275e5586fe281444eb5e722de4e131cddf9d442615626"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f0a1dbdb5ecbef0d34eb77e56fcb3e95bbd7e50835d9782a45df81cc46949750"}, - {file = "kiwisolver-1.4.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:283dffbf061a4ec60391d51e6155e372a1f7a4f5b15d59c8505339454f8989e4"}, - {file = "kiwisolver-1.4.4-cp311-cp311-win32.whl", hash = "sha256:d06adcfa62a4431d404c31216f0f8ac97397d799cd53800e9d3efc2fbb3cf14e"}, - {file = "kiwisolver-1.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:e7da3fec7408813a7cebc9e4ec55afed2d0fd65c4754bc376bf03498d4e92686"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:62ac9cc684da4cf1778d07a89bf5f81b35834cb96ca523d3a7fb32509380cbf6"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41dae968a94b1ef1897cb322b39360a0812661dba7c682aa45098eb8e193dbdf"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:02f79693ec433cb4b5f51694e8477ae83b3205768a6fb48ffba60549080e295b"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0611a0a2a518464c05ddd5a3a1a0e856ccc10e67079bb17f265ad19ab3c7597"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:db5283d90da4174865d520e7366801a93777201e91e79bacbac6e6927cbceede"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1041feb4cda8708ce73bb4dcb9ce1ccf49d553bf87c3954bdfa46f0c3f77252c"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-win32.whl", hash = "sha256:a553dadda40fef6bfa1456dc4be49b113aa92c2a9a9e8711e955618cd69622e3"}, - {file = "kiwisolver-1.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:03baab2d6b4a54ddbb43bba1a3a2d1627e82d205c5cf8f4c924dc49284b87166"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:841293b17ad704d70c578f1f0013c890e219952169ce8a24ebc063eecf775454"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4f270de01dd3e129a72efad823da90cc4d6aafb64c410c9033aba70db9f1ff0"}, - {file = "kiwisolver-1.4.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f9f39e2f049db33a908319cf46624a569b36983c7c78318e9726a4cb8923b26c"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c97528e64cb9ebeff9701e7938653a9951922f2a38bd847787d4a8e498cc83ae"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d1573129aa0fd901076e2bfb4275a35f5b7aa60fbfb984499d661ec950320b0"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad881edc7ccb9d65b0224f4e4d05a1e85cf62d73aab798943df6d48ab0cd79a1"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b428ef021242344340460fa4c9185d0b1f66fbdbfecc6c63eff4b7c29fad429d"}, - {file = "kiwisolver-1.4.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2e407cb4bd5a13984a6c2c0fe1845e4e41e96f183e5e5cd4d77a857d9693494c"}, - {file = "kiwisolver-1.4.4-cp38-cp38-win32.whl", hash = "sha256:75facbe9606748f43428fc91a43edb46c7ff68889b91fa31f53b58894503a191"}, - {file = "kiwisolver-1.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:5bce61af018b0cb2055e0e72e7d65290d822d3feee430b7b8203d8a855e78766"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8c808594c88a025d4e322d5bb549282c93c8e1ba71b790f539567932722d7bd8"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f0a71d85ecdd570ded8ac3d1c0f480842f49a40beb423bb8014539a9f32a5897"}, - {file = "kiwisolver-1.4.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b533558eae785e33e8c148a8d9921692a9fe5aa516efbdff8606e7d87b9d5824"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:efda5fc8cc1c61e4f639b8067d118e742b812c930f708e6667a5ce0d13499e29"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7c43e1e1206cd421cd92e6b3280d4385d41d7166b3ed577ac20444b6995a445f"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc8d3bd6c72b2dd9decf16ce70e20abcb3274ba01b4e1c96031e0c4067d1e7cd"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ea39b0ccc4f5d803e3337dd46bcce60b702be4d86fd0b3d7531ef10fd99a1ac"}, - {file = "kiwisolver-1.4.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968f44fdbf6dd757d12920d63b566eeb4d5b395fd2d00d29d7ef00a00582aac9"}, - {file = "kiwisolver-1.4.4-cp39-cp39-win32.whl", hash = "sha256:da7e547706e69e45d95e116e6939488d62174e033b763ab1496b4c29b76fabea"}, - {file = "kiwisolver-1.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:ba59c92039ec0a66103b1d5fe588fa546373587a7d68f5c96f743c3396afc04b"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:91672bacaa030f92fc2f43b620d7b337fd9a5af28b0d6ed3f77afc43c4a64b5a"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:787518a6789009c159453da4d6b683f468ef7a65bbde796bcea803ccf191058d"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da152d8cdcab0e56e4f45eb08b9aea6455845ec83172092f09b0e077ece2cf7a"}, - {file = "kiwisolver-1.4.4-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ecb1fa0db7bf4cff9dac752abb19505a233c7f16684c5826d1f11ebd9472b871"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:28bc5b299f48150b5f822ce68624e445040595a4ac3d59251703779836eceff9"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:81e38381b782cc7e1e46c4e14cd997ee6040768101aefc8fa3c24a4cc58e98f8"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2a66fdfb34e05b705620dd567f5a03f239a088d5a3f321e7b6ac3239d22aa286"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:872b8ca05c40d309ed13eb2e582cab0c5a05e81e987ab9c521bf05ad1d5cf5cb"}, - {file = "kiwisolver-1.4.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:70e7c2e7b750585569564e2e5ca9845acfaa5da56ac46df68414f29fea97be9f"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9f85003f5dfa867e86d53fac6f7e6f30c045673fa27b603c397753bebadc3008"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e307eb9bd99801f82789b44bb45e9f541961831c7311521b13a6c85afc09767"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b1792d939ec70abe76f5054d3f36ed5656021dcad1322d1cc996d4e54165cef9"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6cb459eea32a4e2cf18ba5fcece2dbdf496384413bc1bae15583f19e567f3b2"}, - {file = "kiwisolver-1.4.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:36dafec3d6d6088d34e2de6b85f9d8e2324eb734162fba59d2ba9ed7a2043d5b"}, - {file = "kiwisolver-1.4.4.tar.gz", hash = "sha256:d41997519fcba4a1e46eb4a2fe31bc12f0ff957b2b81bac28db24744f333e955"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3"}, + {file = "kiwisolver-1.4.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa"}, + {file = "kiwisolver-1.4.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525"}, + {file = "kiwisolver-1.4.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win32.whl", hash = "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238"}, + {file = "kiwisolver-1.4.5-cp310-cp310-win_amd64.whl", hash = "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90"}, + {file = "kiwisolver-1.4.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da"}, + {file = "kiwisolver-1.4.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win32.whl", hash = "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac"}, + {file = "kiwisolver-1.4.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192"}, + {file = "kiwisolver-1.4.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228"}, + {file = "kiwisolver-1.4.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3"}, + {file = "kiwisolver-1.4.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win32.whl", hash = "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20"}, + {file = "kiwisolver-1.4.5-cp312-cp312-win_amd64.whl", hash = "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win32.whl", hash = "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3"}, + {file = "kiwisolver-1.4.5-cp37-cp37m-win_amd64.whl", hash = "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93"}, + {file = "kiwisolver-1.4.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18"}, + {file = "kiwisolver-1.4.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc"}, + {file = "kiwisolver-1.4.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win32.whl", hash = "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e"}, + {file = "kiwisolver-1.4.5-cp38-cp38-win_amd64.whl", hash = "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958"}, + {file = "kiwisolver-1.4.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342"}, + {file = "kiwisolver-1.4.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win32.whl", hash = "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f"}, + {file = "kiwisolver-1.4.5-cp39-cp39-win_amd64.whl", hash = "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523"}, + {file = "kiwisolver-1.4.5-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd"}, + {file = "kiwisolver-1.4.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea"}, + {file = "kiwisolver-1.4.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee"}, + {file = "kiwisolver-1.4.5.tar.gz", hash = "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec"}, ] [[package]] @@ -3826,47 +3869,48 @@ files = [ [[package]] name = "lazy-object-proxy" -version = "1.9.0" +version = "1.10.0" description = "A fast and thorough lazy object proxy." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "lazy-object-proxy-1.9.0.tar.gz", hash = "sha256:659fb5809fa4629b8a1ac5106f669cfc7bef26fbb389dda53b3e010d1ac4ebae"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b40387277b0ed2d0602b8293b94d7257e17d1479e257b4de114ea11a8cb7f2d7"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8c6cfb338b133fbdbc5cfaa10fe3c6aeea827db80c978dbd13bc9dd8526b7d4"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:721532711daa7db0d8b779b0bb0318fa87af1c10d7fe5e52ef30f8eff254d0cd"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:66a3de4a3ec06cd8af3f61b8e1ec67614fbb7c995d02fa224813cb7afefee701"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1aa3de4088c89a1b69f8ec0dcc169aa725b0ff017899ac568fe44ddc1396df46"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win32.whl", hash = "sha256:f0705c376533ed2a9e5e97aacdbfe04cecd71e0aa84c7c0595d02ef93b6e4455"}, - {file = "lazy_object_proxy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea806fd4c37bf7e7ad82537b0757999264d5f70c45468447bb2b91afdbe73a6e"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:946d27deaff6cf8452ed0dba83ba38839a87f4f7a9732e8f9fd4107b21e6ff07"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:79a31b086e7e68b24b99b23d57723ef7e2c6d81ed21007b6281ebcd1688acb0a"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f699ac1c768270c9e384e4cbd268d6e67aebcfae6cd623b4d7c3bfde5a35db59"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfb38f9ffb53b942f2b5954e0f610f1e721ccebe9cce9025a38c8ccf4a5183a4"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:189bbd5d41ae7a498397287c408617fe5c48633e7755287b21d741f7db2706a9"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win32.whl", hash = "sha256:81fc4d08b062b535d95c9ea70dbe8a335c45c04029878e62d744bdced5141586"}, - {file = "lazy_object_proxy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:f2457189d8257dd41ae9b434ba33298aec198e30adf2dcdaaa3a28b9994f6adb"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9e25ef10a39e8afe59a5c348a4dbf29b4868ab76269f81ce1674494e2565a6e"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cbf9b082426036e19c6924a9ce90c740a9861e2bdc27a4834fd0a910742ac1e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f5fa4a61ce2438267163891961cfd5e32ec97a2c444e5b842d574251ade27d2"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8fa02eaab317b1e9e03f69aab1f91e120e7899b392c4fc19807a8278a07a97e8"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e7c21c95cae3c05c14aafffe2865bbd5e377cfc1348c4f7751d9dc9a48ca4bda"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win32.whl", hash = "sha256:f12ad7126ae0c98d601a7ee504c1122bcef553d1d5e0c3bfa77b16b3968d2734"}, - {file = "lazy_object_proxy-1.9.0-cp37-cp37m-win_amd64.whl", hash = "sha256:edd20c5a55acb67c7ed471fa2b5fb66cb17f61430b7a6b9c3b4a1e40293b1671"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d0daa332786cf3bb49e10dc6a17a52f6a8f9601b4cf5c295a4f85854d61de63"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cd077f3d04a58e83d04b20e334f678c2b0ff9879b9375ed107d5d07ff160171"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:660c94ea760b3ce47d1855a30984c78327500493d396eac4dfd8bd82041b22be"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:212774e4dfa851e74d393a2370871e174d7ff0ebc980907723bb67d25c8a7c30"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0117049dd1d5635bbff65444496c90e0baa48ea405125c088e93d9cf4525b11"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win32.whl", hash = "sha256:0a891e4e41b54fd5b8313b96399f8b0e173bbbfc03c7631f01efbe29bb0bcf82"}, - {file = "lazy_object_proxy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:9990d8e71b9f6488e91ad25f322898c136b008d87bf852ff65391b004da5e17b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9e7551208b2aded9c1447453ee366f1c4070602b3d932ace044715d89666899b"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f83ac4d83ef0ab017683d715ed356e30dd48a93746309c8f3517e1287523ef4"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7322c3d6f1766d4ef1e51a465f47955f1e8123caee67dd641e67d539a534d006"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:18b78ec83edbbeb69efdc0e9c1cb41a3b1b1ed11ddd8ded602464c3fc6020494"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:09763491ce220c0299688940f8dc2c5d05fd1f45af1e42e636b2e8b2303e4382"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win32.whl", hash = "sha256:9090d8e53235aa280fc9239a86ae3ea8ac58eff66a705fa6aa2ec4968b95c821"}, - {file = "lazy_object_proxy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:db1c1722726f47e10e0b5fdbf15ac3b8adb58c091d12b3ab713965795036985f"}, + {file = "lazy-object-proxy-1.10.0.tar.gz", hash = "sha256:78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:855e068b0358ab916454464a884779c7ffa312b8925c6f7401e952dcf3b89977"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab7004cf2e59f7c2e4345604a3e6ea0d92ac44e1c2375527d56492014e690c3"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc0d2fc424e54c70c4bc06787e4072c4f3b1aa2f897dfdc34ce1013cf3ceef05"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e2adb09778797da09d2b5ebdbceebf7dd32e2c96f79da9052b2e87b6ea495895"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1f711e2c6dcd4edd372cf5dec5c5a30d23bba06ee012093267b3376c079ec83"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-win32.whl", hash = "sha256:76a095cfe6045c7d0ca77db9934e8f7b71b14645f0094ffcd842349ada5c5fb9"}, + {file = "lazy_object_proxy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:b4f87d4ed9064b2628da63830986c3d2dca7501e6018347798313fcf028e2fd4"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fec03caabbc6b59ea4a638bee5fce7117be8e99a4103d9d5ad77f15d6f81020c"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02c83f957782cbbe8136bee26416686a6ae998c7b6191711a04da776dc9e47d4"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009e6bb1f1935a62889ddc8541514b6a9e1fcf302667dcb049a0be5c8f613e56"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75fc59fc450050b1b3c203c35020bc41bd2695ed692a392924c6ce180c6f1dc9"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:782e2c9b2aab1708ffb07d4bf377d12901d7a1d99e5e410d648d892f8967ab1f"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-win32.whl", hash = "sha256:edb45bb8278574710e68a6b021599a10ce730d156e5b254941754a9cc0b17d03"}, + {file = "lazy_object_proxy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:e271058822765ad5e3bca7f05f2ace0de58a3f4e62045a8c90a0dfd2f8ad8cc6"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e98c8af98d5707dcdecc9ab0863c0ea6e88545d42ca7c3feffb6b4d1e370c7ba"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:952c81d415b9b80ea261d2372d2a4a2332a3890c2b83e0535f263ddfe43f0d43"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80b39d3a151309efc8cc48675918891b865bdf742a8616a337cb0090791a0de9"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e221060b701e2aa2ea991542900dd13907a5c90fa80e199dbf5a03359019e7a3"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:92f09ff65ecff3108e56526f9e2481b8116c0b9e1425325e13245abfd79bdb1b"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-win32.whl", hash = "sha256:3ad54b9ddbe20ae9f7c1b29e52f123120772b06dbb18ec6be9101369d63a4074"}, + {file = "lazy_object_proxy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:127a789c75151db6af398b8972178afe6bda7d6f68730c057fbbc2e96b08d282"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4ed0518a14dd26092614412936920ad081a424bdcb54cc13349a8e2c6d106a"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ad9e6ed739285919aa9661a5bbed0aaf410aa60231373c5579c6b4801bd883c"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fc0a92c02fa1ca1e84fc60fa258458e5bf89d90a1ddaeb8ed9cc3147f417255"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0aefc7591920bbd360d57ea03c995cebc204b424524a5bd78406f6e1b8b2a5d8"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5faf03a7d8942bb4476e3b62fd0f4cf94eaf4618e304a19865abf89a35c0bbee"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-win32.whl", hash = "sha256:e333e2324307a7b5d86adfa835bb500ee70bfcd1447384a822e96495796b0ca4"}, + {file = "lazy_object_proxy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:cb73507defd385b7705c599a94474b1d5222a508e502553ef94114a143ec6696"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:366c32fe5355ef5fc8a232c5436f4cc66e9d3e8967c01fb2e6302fd6627e3d94"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2297f08f08a2bb0d32a4265e98a006643cd7233fb7983032bd61ac7a02956b3b"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18dd842b49456aaa9a7cf535b04ca4571a302ff72ed8740d06b5adcd41fe0757"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:217138197c170a2a74ca0e05bddcd5f1796c735c37d0eee33e43259b192aa424"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a3a87cf1e133e5b1994144c12ca4aa3d9698517fe1e2ca82977781b16955658"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-win32.whl", hash = "sha256:30b339b2a743c5288405aa79a69e706a06e02958eab31859f7f3c04980853b70"}, + {file = "lazy_object_proxy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:a899b10e17743683b293a729d3a11f2f399e8a90c73b089e29f5d0fe3509f0dd"}, + {file = "lazy_object_proxy-1.10.0-pp310.pp311.pp312.pp38.pp39-none-any.whl", hash = "sha256:80fa48bd89c8f2f456fc0765c11c23bf5af827febacd2f523ca5bc1893fcc09d"}, ] [[package]] @@ -3894,23 +3938,24 @@ dask = ["dask[array] (>=2.0.0)", "dask[dataframe] (>=2.0.0)", "dask[distributed] [[package]] name = "lightning-utilities" -version = "0.9.0" -description = "PyTorch Lightning Sample project." +version = "0.11.2" +description = "Lightning toolbox for across the our ecosystem." optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "lightning-utilities-0.9.0.tar.gz", hash = "sha256:efbf2c488c257f942abdfd06cf646fb84ca215a9663b60081811e22a15ee033b"}, - {file = "lightning_utilities-0.9.0-py3-none-any.whl", hash = "sha256:918dd90c775719e3855631db6282ad75c14da4c5727c4cebdd1589d865fad03d"}, + {file = "lightning-utilities-0.11.2.tar.gz", hash = "sha256:adf4cf9c5d912fe505db4729e51d1369c6927f3a8ac55a9dff895ce5c0da08d9"}, + {file = "lightning_utilities-0.11.2-py3-none-any.whl", hash = "sha256:541f471ed94e18a28d72879338c8c52e873bb46f4c47644d89228faeb6751159"}, ] [package.dependencies] packaging = ">=17.1" +setuptools = "*" typing-extensions = "*" [package.extras] cli = ["fire"] docs = ["requests (>=2.0.0)"] -typing = ["mypy (>=1.0.0)"] +typing = ["mypy (>=1.0.0)", "types-setuptools"] [[package]] name = "linearmodels" @@ -3958,46 +4003,46 @@ statsmodels = ">=0.11" [[package]] name = "llvmlite" -version = "0.40.1" +version = "0.41.1" description = "lightweight wrapper around basic LLVM functionality" optional = true python-versions = ">=3.8" files = [ - {file = "llvmlite-0.40.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:84ce9b1c7a59936382ffde7871978cddcda14098e5a76d961e204523e5c372fb"}, - {file = "llvmlite-0.40.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3673c53cb21c65d2ff3704962b5958e967c6fc0bd0cff772998face199e8d87b"}, - {file = "llvmlite-0.40.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bba2747cf5b4954e945c287fe310b3fcc484e2a9d1b0c273e99eb17d103bb0e6"}, - {file = "llvmlite-0.40.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbd5e82cc990e5a3e343a3bf855c26fdfe3bfae55225f00efd01c05bbda79918"}, - {file = "llvmlite-0.40.1-cp310-cp310-win32.whl", hash = "sha256:09f83ea7a54509c285f905d968184bba00fc31ebf12f2b6b1494d677bb7dde9b"}, - {file = "llvmlite-0.40.1-cp310-cp310-win_amd64.whl", hash = "sha256:7b37297f3cbd68d14a97223a30620589d98ad1890e5040c9e5fc181063f4ed49"}, - {file = "llvmlite-0.40.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a66a5bd580951751b4268f4c3bddcef92682814d6bc72f3cd3bb67f335dd7097"}, - {file = "llvmlite-0.40.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:467b43836b388eaedc5a106d76761e388dbc4674b2f2237bc477c6895b15a634"}, - {file = "llvmlite-0.40.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c23edd196bd797dc3a7860799054ea3488d2824ecabc03f9135110c2e39fcbc"}, - {file = "llvmlite-0.40.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a36d9f244b6680cb90bbca66b146dabb2972f4180c64415c96f7c8a2d8b60a36"}, - {file = "llvmlite-0.40.1-cp311-cp311-win_amd64.whl", hash = "sha256:5b3076dc4e9c107d16dc15ecb7f2faf94f7736cd2d5e9f4dc06287fd672452c1"}, - {file = "llvmlite-0.40.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4a7525db121f2e699809b539b5308228854ccab6693ecb01b52c44a2f5647e20"}, - {file = "llvmlite-0.40.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:84747289775d0874e506f907a4513db889471607db19b04de97d144047fec885"}, - {file = "llvmlite-0.40.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e35766e42acef0fe7d1c43169a8ffc327a47808fae6a067b049fe0e9bbf84dd5"}, - {file = "llvmlite-0.40.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cda71de10a1f48416309e408ea83dab5bf36058f83e13b86a2961defed265568"}, - {file = "llvmlite-0.40.1-cp38-cp38-win32.whl", hash = "sha256:96707ebad8b051bbb4fc40c65ef93b7eeee16643bd4d579a14d11578e4b7a647"}, - {file = "llvmlite-0.40.1-cp38-cp38-win_amd64.whl", hash = "sha256:e44f854dc11559795bcdeaf12303759e56213d42dabbf91a5897aa2d8b033810"}, - {file = "llvmlite-0.40.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f643d15aacd0b0b0dc8b74b693822ba3f9a53fa63bc6a178c2dba7cc88f42144"}, - {file = "llvmlite-0.40.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:39a0b4d0088c01a469a5860d2e2d7a9b4e6a93c0f07eb26e71a9a872a8cadf8d"}, - {file = "llvmlite-0.40.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9329b930d699699846623054121ed105fd0823ed2180906d3b3235d361645490"}, - {file = "llvmlite-0.40.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2dbbb8424037ca287983b115a29adf37d806baf7e1bf4a67bd2cffb74e085ed"}, - {file = "llvmlite-0.40.1-cp39-cp39-win32.whl", hash = "sha256:e74e7bec3235a1e1c9ad97d897a620c5007d0ed80c32c84c1d787e7daa17e4ec"}, - {file = "llvmlite-0.40.1-cp39-cp39-win_amd64.whl", hash = "sha256:ff8f31111bb99d135ff296757dc81ab36c2dee54ed4bd429158a96da9807c316"}, - {file = "llvmlite-0.40.1.tar.gz", hash = "sha256:5cdb0d45df602099d833d50bd9e81353a5e036242d3c003c5b294fc61d1986b4"}, + {file = "llvmlite-0.41.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c1e1029d47ee66d3a0c4d6088641882f75b93db82bd0e6178f7bd744ebce42b9"}, + {file = "llvmlite-0.41.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:150d0bc275a8ac664a705135e639178883293cf08c1a38de3bbaa2f693a0a867"}, + {file = "llvmlite-0.41.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1eee5cf17ec2b4198b509272cf300ee6577229d237c98cc6e63861b08463ddc6"}, + {file = "llvmlite-0.41.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0dd0338da625346538f1173a17cabf21d1e315cf387ca21b294ff209d176e244"}, + {file = "llvmlite-0.41.1-cp310-cp310-win32.whl", hash = "sha256:fa1469901a2e100c17eb8fe2678e34bd4255a3576d1a543421356e9c14d6e2ae"}, + {file = "llvmlite-0.41.1-cp310-cp310-win_amd64.whl", hash = "sha256:2b76acee82ea0e9304be6be9d4b3840208d050ea0dcad75b1635fa06e949a0ae"}, + {file = "llvmlite-0.41.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:210e458723436b2469d61b54b453474e09e12a94453c97ea3fbb0742ba5a83d8"}, + {file = "llvmlite-0.41.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:855f280e781d49e0640aef4c4af586831ade8f1a6c4df483fb901cbe1a48d127"}, + {file = "llvmlite-0.41.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b67340c62c93a11fae482910dc29163a50dff3dfa88bc874872d28ee604a83be"}, + {file = "llvmlite-0.41.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2181bb63ef3c607e6403813421b46982c3ac6bfc1f11fa16a13eaafb46f578e6"}, + {file = "llvmlite-0.41.1-cp311-cp311-win_amd64.whl", hash = "sha256:9564c19b31a0434f01d2025b06b44c7ed422f51e719ab5d24ff03b7560066c9a"}, + {file = "llvmlite-0.41.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5940bc901fb0325970415dbede82c0b7f3e35c2d5fd1d5e0047134c2c46b3281"}, + {file = "llvmlite-0.41.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8b0a9a47c28f67a269bb62f6256e63cef28d3c5f13cbae4fab587c3ad506778b"}, + {file = "llvmlite-0.41.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8afdfa6da33f0b4226af8e64cfc2b28986e005528fbf944d0a24a72acfc9432"}, + {file = "llvmlite-0.41.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8454c1133ef701e8c050a59edd85d238ee18bb9a0eb95faf2fca8b909ee3c89a"}, + {file = "llvmlite-0.41.1-cp38-cp38-win32.whl", hash = "sha256:2d92c51e6e9394d503033ffe3292f5bef1566ab73029ec853861f60ad5c925d0"}, + {file = "llvmlite-0.41.1-cp38-cp38-win_amd64.whl", hash = "sha256:df75594e5a4702b032684d5481db3af990b69c249ccb1d32687b8501f0689432"}, + {file = "llvmlite-0.41.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:04725975e5b2af416d685ea0769f4ecc33f97be541e301054c9f741003085802"}, + {file = "llvmlite-0.41.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bf14aa0eb22b58c231243dccf7e7f42f7beec48970f2549b3a6acc737d1a4ba4"}, + {file = "llvmlite-0.41.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92c32356f669e036eb01016e883b22add883c60739bc1ebee3a1cc0249a50828"}, + {file = "llvmlite-0.41.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24091a6b31242bcdd56ae2dbea40007f462260bc9bdf947953acc39dffd54f8f"}, + {file = "llvmlite-0.41.1-cp39-cp39-win32.whl", hash = "sha256:880cb57ca49e862e1cd077104375b9d1dfdc0622596dfa22105f470d7bacb309"}, + {file = "llvmlite-0.41.1-cp39-cp39-win_amd64.whl", hash = "sha256:92f093986ab92e71c9ffe334c002f96defc7986efda18397d0f08534f3ebdc4d"}, + {file = "llvmlite-0.41.1.tar.gz", hash = "sha256:f19f767a018e6ec89608e1f6b13348fa2fcde657151137cb64e56d48598a92db"}, ] [[package]] name = "loguru" -version = "0.7.0" +version = "0.7.2" description = "Python logging made (stupidly) simple" optional = false python-versions = ">=3.5" files = [ - {file = "loguru-0.7.0-py3-none-any.whl", hash = "sha256:b93aa30099fa6860d4727f1b81f8718e965bb96253fa190fab2077aaad6d15d3"}, - {file = "loguru-0.7.0.tar.gz", hash = "sha256:1612053ced6ae84d7959dd7d5e431a0532642237ec21f7fd83ac73fe539e03e1"}, + {file = "loguru-0.7.2-py3-none-any.whl", hash = "sha256:003d71e3d3ed35f0f8984898359d65b79e5b21943f78af86aa5491210429b8eb"}, + {file = "loguru-0.7.2.tar.gz", hash = "sha256:e671a53522515f34fd406340ee968cb9ecafbc4b36c679da03c18fd8d0bd51ac"}, ] [package.dependencies] @@ -4005,22 +4050,22 @@ colorama = {version = ">=0.3.4", markers = "sys_platform == \"win32\""} win32-setctime = {version = ">=1.0.0", markers = "sys_platform == \"win32\""} [package.extras] -dev = ["Sphinx (==5.3.0)", "colorama (==0.4.5)", "colorama (==0.4.6)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v0.990)", "pre-commit (==3.2.1)", "pytest (==6.1.2)", "pytest (==7.2.1)", "pytest-cov (==2.12.1)", "pytest-cov (==4.0.0)", "pytest-mypy-plugins (==1.10.1)", "pytest-mypy-plugins (==1.9.3)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.2.0)", "tox (==3.27.1)", "tox (==4.4.6)"] +dev = ["Sphinx (==7.2.5)", "colorama (==0.4.5)", "colorama (==0.4.6)", "exceptiongroup (==1.1.3)", "freezegun (==1.1.0)", "freezegun (==1.2.2)", "mypy (==v0.910)", "mypy (==v0.971)", "mypy (==v1.4.1)", "mypy (==v1.5.1)", "pre-commit (==3.4.0)", "pytest (==6.1.2)", "pytest (==7.4.0)", "pytest-cov (==2.12.1)", "pytest-cov (==4.1.0)", "pytest-mypy-plugins (==1.9.3)", "pytest-mypy-plugins (==3.0.0)", "sphinx-autobuild (==2021.3.14)", "sphinx-rtd-theme (==1.3.0)", "tox (==3.27.1)", "tox (==4.11.0)"] [[package]] name = "lsprotocol" -version = "2023.0.0a2" +version = "2023.0.1" description = "Python implementation of the Language Server Protocol." optional = true python-versions = ">=3.7" files = [ - {file = "lsprotocol-2023.0.0a2-py3-none-any.whl", hash = "sha256:c4f2f77712b50d065b17f9b50d2b88c480dc2ce4bbaa56eea8269dbf54bc9701"}, - {file = "lsprotocol-2023.0.0a2.tar.gz", hash = "sha256:80aae7e39171b49025876a524937c10be2eb986f4be700ca22ee7d186b8488aa"}, + {file = "lsprotocol-2023.0.1-py3-none-any.whl", hash = "sha256:c75223c9e4af2f24272b14c6375787438279369236cd568f596d4951052a60f2"}, + {file = "lsprotocol-2023.0.1.tar.gz", hash = "sha256:cc5c15130d2403c18b734304339e51242d3018a05c4f7d0f198ad6e0cd21861d"}, ] [package.dependencies] attrs = ">=21.3.0" -cattrs = "*" +cattrs = "!=23.2.1" [[package]] name = "lunarcalendar" @@ -4040,120 +4085,184 @@ pytz = "*" [[package]] name = "lxml" -version = "4.9.3" +version = "5.2.1" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" +python-versions = ">=3.6" files = [ - {file = "lxml-4.9.3-cp27-cp27m-macosx_11_0_x86_64.whl", hash = "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c"}, - {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d"}, - {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef"}, - {file = "lxml-4.9.3-cp27-cp27m-win32.whl", hash = "sha256:2c74524e179f2ad6d2a4f7caf70e2d96639c0954c943ad601a9e146c76408ed7"}, - {file = "lxml-4.9.3-cp27-cp27m-win_amd64.whl", hash = "sha256:4f1026bc732b6a7f96369f7bfe1a4f2290fb34dce00d8644bc3036fb351a4ca1"}, - {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb"}, - {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e"}, - {file = "lxml-4.9.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991"}, - {file = "lxml-4.9.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd"}, - {file = "lxml-4.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ae8b9c6deb1e634ba4f1930eb67ef6e6bf6a44b6eb5ad605642b2d6d5ed9ce3c"}, - {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8"}, - {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76"}, - {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23"}, - {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1247694b26342a7bf47c02e513d32225ededd18045264d40758abeb3c838a51f"}, - {file = "lxml-4.9.3-cp310-cp310-win32.whl", hash = "sha256:cdb650fc86227eba20de1a29d4b2c1bfe139dc75a0669270033cb2ea3d391b85"}, - {file = "lxml-4.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d"}, - {file = "lxml-4.9.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5"}, - {file = "lxml-4.9.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf"}, - {file = "lxml-4.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:9767e79108424fb6c3edf8f81e6730666a50feb01a328f4a016464a5893f835a"}, - {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f"}, - {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b"}, - {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120"}, - {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e28c51fa0ce5674be9f560c6761c1b441631901993f76700b1b30ca6c8378d6"}, - {file = "lxml-4.9.3-cp311-cp311-win32.whl", hash = "sha256:0bfd0767c5c1de2551a120673b72e5d4b628737cb05414f03c3277bf9bed3305"}, - {file = "lxml-4.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:25f32acefac14ef7bd53e4218fe93b804ef6f6b92ffdb4322bb6d49d94cad2bc"}, - {file = "lxml-4.9.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:d3ff32724f98fbbbfa9f49d82852b159e9784d6094983d9a8b7f2ddaebb063d4"}, - {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48d6ed886b343d11493129e019da91d4039826794a3e3027321c56d9e71505be"}, - {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9a92d3faef50658dd2c5470af249985782bf754c4e18e15afb67d3ab06233f13"}, - {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b4e4bc18382088514ebde9328da057775055940a1f2e18f6ad2d78aa0f3ec5b9"}, - {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fc9b106a1bf918db68619fdcd6d5ad4f972fdd19c01d19bdb6bf63f3589a9ec5"}, - {file = "lxml-4.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:d37017287a7adb6ab77e1c5bee9bcf9660f90ff445042b790402a654d2ad81d8"}, - {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:56dc1f1ebccc656d1b3ed288f11e27172a01503fc016bcabdcbc0978b19352b7"}, - {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:578695735c5a3f51569810dfebd05dd6f888147a34f0f98d4bb27e92b76e05c2"}, - {file = "lxml-4.9.3-cp35-cp35m-win32.whl", hash = "sha256:704f61ba8c1283c71b16135caf697557f5ecf3e74d9e453233e4771d68a1f42d"}, - {file = "lxml-4.9.3-cp35-cp35m-win_amd64.whl", hash = "sha256:c41bfca0bd3532d53d16fd34d20806d5c2b1ace22a2f2e4c0008570bf2c58833"}, - {file = "lxml-4.9.3-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12"}, - {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5"}, - {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98"}, - {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e3cd95e10c2610c360154afdc2f1480aea394f4a4f1ea0a5eacce49640c9b190"}, - {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2"}, - {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c"}, - {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584"}, - {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0c0850c8b02c298d3c7006b23e98249515ac57430e16a166873fc47a5d549287"}, - {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:aca086dc5f9ef98c512bac8efea4483eb84abbf926eaeedf7b91479feb092458"}, - {file = "lxml-4.9.3-cp36-cp36m-win32.whl", hash = "sha256:50baa9c1c47efcaef189f31e3d00d697c6d4afda5c3cde0302d063492ff9b477"}, - {file = "lxml-4.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf"}, - {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601"}, - {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129"}, - {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:141f1d1a9b663c679dc524af3ea1773e618907e96075262726c7612c02b149a4"}, - {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d"}, - {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693"}, - {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4"}, - {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:081d32421db5df44c41b7f08a334a090a545c54ba977e47fd7cc2deece78809a"}, - {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:23eed6d7b1a3336ad92d8e39d4bfe09073c31bfe502f20ca5116b2a334f8ec02"}, - {file = "lxml-4.9.3-cp37-cp37m-win32.whl", hash = "sha256:1509dd12b773c02acd154582088820893109f6ca27ef7291b003d0e81666109f"}, - {file = "lxml-4.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52"}, - {file = "lxml-4.9.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc"}, - {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac"}, - {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:71d66ee82e7417828af6ecd7db817913cb0cf9d4e61aa0ac1fde0583d84358db"}, - {file = "lxml-4.9.3-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce"}, - {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42"}, - {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa"}, - {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3e9bdd30efde2b9ccfa9cb5768ba04fe71b018a25ea093379c857c9dad262c40"}, - {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fcdd00edfd0a3001e0181eab3e63bd5c74ad3e67152c84f93f13769a40e073a7"}, - {file = "lxml-4.9.3-cp38-cp38-win32.whl", hash = "sha256:57aba1bbdf450b726d58b2aea5fe47c7875f5afb2c4a23784ed78f19a0462574"}, - {file = "lxml-4.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96"}, - {file = "lxml-4.9.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340"}, - {file = "lxml-4.9.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7"}, - {file = "lxml-4.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fbf521479bcac1e25a663df882c46a641a9bff6b56dc8b0fafaebd2f66fb231b"}, - {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da"}, - {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e"}, - {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d"}, - {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6420a005548ad52154c8ceab4a1290ff78d757f9e5cbc68f8c77089acd3c432"}, - {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bb3bb49c7a6ad9d981d734ef7c7193bc349ac338776a0360cc671eaee89bcf69"}, - {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d27be7405547d1f958b60837dc4c1007da90b8b23f54ba1f8b728c78fdb19d50"}, - {file = "lxml-4.9.3-cp39-cp39-win32.whl", hash = "sha256:8df133a2ea5e74eef5e8fc6f19b9e085f758768a16e9877a60aec455ed2609b2"}, - {file = "lxml-4.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2"}, - {file = "lxml-4.9.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35"}, - {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0"}, - {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:05186a0f1346ae12553d66df1cfce6f251589fea3ad3da4f3ef4e34b2d58c6a3"}, - {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b"}, - {file = "lxml-4.9.3-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b"}, - {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7"}, - {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:50670615eaf97227d5dc60de2dc99fb134a7130d310d783314e7724bf163f75d"}, - {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b"}, - {file = "lxml-4.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a"}, - {file = "lxml-4.9.3-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0"}, - {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694"}, - {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e4da8ca0c0c0aea88fd46be8e44bd49716772358d648cce45fe387f7b92374a7"}, - {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4"}, - {file = "lxml-4.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9"}, - {file = "lxml-4.9.3.tar.gz", hash = "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c"}, + {file = "lxml-5.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1f7785f4f789fdb522729ae465adcaa099e2a3441519df750ebdccc481d961a1"}, + {file = "lxml-5.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cc6ee342fb7fa2471bd9b6d6fdfc78925a697bf5c2bcd0a302e98b0d35bfad3"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:794f04eec78f1d0e35d9e0c36cbbb22e42d370dda1609fb03bcd7aeb458c6377"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817d420c60a5183953c783b0547d9eb43b7b344a2c46f69513d5952a78cddf3"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2213afee476546a7f37c7a9b4ad4d74b1e112a6fafffc9185d6d21f043128c81"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b070bbe8d3f0f6147689bed981d19bbb33070225373338df755a46893528104a"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e02c5175f63effbd7c5e590399c118d5db6183bbfe8e0d118bdb5c2d1b48d937"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:3dc773b2861b37b41a6136e0b72a1a44689a9c4c101e0cddb6b854016acc0aa8"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:d7520db34088c96cc0e0a3ad51a4fd5b401f279ee112aa2b7f8f976d8582606d"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:bcbf4af004f98793a95355980764b3d80d47117678118a44a80b721c9913436a"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2b44bec7adf3e9305ce6cbfa47a4395667e744097faed97abb4728748ba7d47"}, + {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1c5bb205e9212d0ebddf946bc07e73fa245c864a5f90f341d11ce7b0b854475d"}, + {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2c9d147f754b1b0e723e6afb7ba1566ecb162fe4ea657f53d2139bbf894d050a"}, + {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:3545039fa4779be2df51d6395e91a810f57122290864918b172d5dc7ca5bb433"}, + {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a91481dbcddf1736c98a80b122afa0f7296eeb80b72344d7f45dc9f781551f56"}, + {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2ddfe41ddc81f29a4c44c8ce239eda5ade4e7fc305fb7311759dd6229a080052"}, + {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a7baf9ffc238e4bf401299f50e971a45bfcc10a785522541a6e3179c83eabf0a"}, + {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:31e9a882013c2f6bd2f2c974241bf4ba68c85eba943648ce88936d23209a2e01"}, + {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0a15438253b34e6362b2dc41475e7f80de76320f335e70c5528b7148cac253a1"}, + {file = "lxml-5.2.1-cp310-cp310-win32.whl", hash = "sha256:6992030d43b916407c9aa52e9673612ff39a575523c5f4cf72cdef75365709a5"}, + {file = "lxml-5.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:da052e7962ea2d5e5ef5bc0355d55007407087392cf465b7ad84ce5f3e25fe0f"}, + {file = "lxml-5.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:70ac664a48aa64e5e635ae5566f5227f2ab7f66a3990d67566d9907edcbbf867"}, + {file = "lxml-5.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1ae67b4e737cddc96c99461d2f75d218bdf7a0c3d3ad5604d1f5e7464a2f9ffe"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f18a5a84e16886898e51ab4b1d43acb3083c39b14c8caeb3589aabff0ee0b270"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6f2c8372b98208ce609c9e1d707f6918cc118fea4e2c754c9f0812c04ca116d"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:394ed3924d7a01b5bd9a0d9d946136e1c2f7b3dc337196d99e61740ed4bc6fe1"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d077bc40a1fe984e1a9931e801e42959a1e6598edc8a3223b061d30fbd26bbc"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:764b521b75701f60683500d8621841bec41a65eb739b8466000c6fdbc256c240"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:3a6b45da02336895da82b9d472cd274b22dc27a5cea1d4b793874eead23dd14f"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:5ea7b6766ac2dfe4bcac8b8595107665a18ef01f8c8343f00710b85096d1b53a"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:e196a4ff48310ba62e53a8e0f97ca2bca83cdd2fe2934d8b5cb0df0a841b193a"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:200e63525948e325d6a13a76ba2911f927ad399ef64f57898cf7c74e69b71095"}, + {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dae0ed02f6b075426accbf6b2863c3d0a7eacc1b41fb40f2251d931e50188dad"}, + {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:ab31a88a651039a07a3ae327d68ebdd8bc589b16938c09ef3f32a4b809dc96ef"}, + {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:df2e6f546c4df14bc81f9498bbc007fbb87669f1bb707c6138878c46b06f6510"}, + {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5dd1537e7cc06efd81371f5d1a992bd5ab156b2b4f88834ca852de4a8ea523fa"}, + {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9b9ec9c9978b708d488bec36b9e4c94d88fd12ccac3e62134a9d17ddba910ea9"}, + {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8e77c69d5892cb5ba71703c4057091e31ccf534bd7f129307a4d084d90d014b8"}, + {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a8d5c70e04aac1eda5c829a26d1f75c6e5286c74743133d9f742cda8e53b9c2f"}, + {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c94e75445b00319c1fad60f3c98b09cd63fe1134a8a953dcd48989ef42318534"}, + {file = "lxml-5.2.1-cp311-cp311-win32.whl", hash = "sha256:4951e4f7a5680a2db62f7f4ab2f84617674d36d2d76a729b9a8be4b59b3659be"}, + {file = "lxml-5.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:5c670c0406bdc845b474b680b9a5456c561c65cf366f8db5a60154088c92d102"}, + {file = "lxml-5.2.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:abc25c3cab9ec7fcd299b9bcb3b8d4a1231877e425c650fa1c7576c5107ab851"}, + {file = "lxml-5.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6935bbf153f9a965f1e07c2649c0849d29832487c52bb4a5c5066031d8b44fd5"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d793bebb202a6000390a5390078e945bbb49855c29c7e4d56a85901326c3b5d9"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afd5562927cdef7c4f5550374acbc117fd4ecc05b5007bdfa57cc5355864e0a4"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0e7259016bc4345a31af861fdce942b77c99049d6c2107ca07dc2bba2435c1d9"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:530e7c04f72002d2f334d5257c8a51bf409db0316feee7c87e4385043be136af"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59689a75ba8d7ffca577aefd017d08d659d86ad4585ccc73e43edbfc7476781a"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f9737bf36262046213a28e789cc82d82c6ef19c85a0cf05e75c670a33342ac2c"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:3a74c4f27167cb95c1d4af1c0b59e88b7f3e0182138db2501c353555f7ec57f4"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:68a2610dbe138fa8c5826b3f6d98a7cfc29707b850ddcc3e21910a6fe51f6ca0"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f0a1bc63a465b6d72569a9bba9f2ef0334c4e03958e043da1920299100bc7c08"}, + {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c2d35a1d047efd68027817b32ab1586c1169e60ca02c65d428ae815b593e65d4"}, + {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:79bd05260359170f78b181b59ce871673ed01ba048deef4bf49a36ab3e72e80b"}, + {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:865bad62df277c04beed9478fe665b9ef63eb28fe026d5dedcb89b537d2e2ea6"}, + {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:44f6c7caff88d988db017b9b0e4ab04934f11e3e72d478031efc7edcac6c622f"}, + {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:71e97313406ccf55d32cc98a533ee05c61e15d11b99215b237346171c179c0b0"}, + {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:057cdc6b86ab732cf361f8b4d8af87cf195a1f6dc5b0ff3de2dced242c2015e0"}, + {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f3bbbc998d42f8e561f347e798b85513ba4da324c2b3f9b7969e9c45b10f6169"}, + {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:491755202eb21a5e350dae00c6d9a17247769c64dcf62d8c788b5c135e179dc4"}, + {file = "lxml-5.2.1-cp312-cp312-win32.whl", hash = "sha256:8de8f9d6caa7f25b204fc861718815d41cbcf27ee8f028c89c882a0cf4ae4134"}, + {file = "lxml-5.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:f2a9efc53d5b714b8df2b4b3e992accf8ce5bbdfe544d74d5c6766c9e1146a3a"}, + {file = "lxml-5.2.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:70a9768e1b9d79edca17890175ba915654ee1725975d69ab64813dd785a2bd5c"}, + {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c38d7b9a690b090de999835f0443d8aa93ce5f2064035dfc48f27f02b4afc3d0"}, + {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5670fb70a828663cc37552a2a85bf2ac38475572b0e9b91283dc09efb52c41d1"}, + {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:958244ad566c3ffc385f47dddde4145088a0ab893504b54b52c041987a8c1863"}, + {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6241d4eee5f89453307c2f2bfa03b50362052ca0af1efecf9fef9a41a22bb4f"}, + {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2a66bf12fbd4666dd023b6f51223aed3d9f3b40fef06ce404cb75bafd3d89536"}, + {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:9123716666e25b7b71c4e1789ec829ed18663152008b58544d95b008ed9e21e9"}, + {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:0c3f67e2aeda739d1cc0b1102c9a9129f7dc83901226cc24dd72ba275ced4218"}, + {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:5d5792e9b3fb8d16a19f46aa8208987cfeafe082363ee2745ea8b643d9cc5b45"}, + {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:88e22fc0a6684337d25c994381ed8a1580a6f5ebebd5ad41f89f663ff4ec2885"}, + {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:21c2e6b09565ba5b45ae161b438e033a86ad1736b8c838c766146eff8ceffff9"}, + {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_s390x.whl", hash = "sha256:afbbdb120d1e78d2ba8064a68058001b871154cc57787031b645c9142b937a62"}, + {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:627402ad8dea044dde2eccde4370560a2b750ef894c9578e1d4f8ffd54000461"}, + {file = "lxml-5.2.1-cp36-cp36m-win32.whl", hash = "sha256:e89580a581bf478d8dcb97d9cd011d567768e8bc4095f8557b21c4d4c5fea7d0"}, + {file = "lxml-5.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:59565f10607c244bc4c05c0c5fa0c190c990996e0c719d05deec7030c2aa8289"}, + {file = "lxml-5.2.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:857500f88b17a6479202ff5fe5f580fc3404922cd02ab3716197adf1ef628029"}, + {file = "lxml-5.2.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56c22432809085b3f3ae04e6e7bdd36883d7258fcd90e53ba7b2e463efc7a6af"}, + {file = "lxml-5.2.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a55ee573116ba208932e2d1a037cc4b10d2c1cb264ced2184d00b18ce585b2c0"}, + {file = "lxml-5.2.1-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:6cf58416653c5901e12624e4013708b6e11142956e7f35e7a83f1ab02f3fe456"}, + {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:64c2baa7774bc22dd4474248ba16fe1a7f611c13ac6123408694d4cc93d66dbd"}, + {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:74b28c6334cca4dd704e8004cba1955af0b778cf449142e581e404bd211fb619"}, + {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7221d49259aa1e5a8f00d3d28b1e0b76031655ca74bb287123ef56c3db92f213"}, + {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3dbe858ee582cbb2c6294dc85f55b5f19c918c2597855e950f34b660f1a5ede6"}, + {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:04ab5415bf6c86e0518d57240a96c4d1fcfc3cb370bb2ac2a732b67f579e5a04"}, + {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:6ab833e4735a7e5533711a6ea2df26459b96f9eec36d23f74cafe03631647c41"}, + {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f443cdef978430887ed55112b491f670bba6462cea7a7742ff8f14b7abb98d75"}, + {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:9e2addd2d1866fe112bc6f80117bcc6bc25191c5ed1bfbcf9f1386a884252ae8"}, + {file = "lxml-5.2.1-cp37-cp37m-win32.whl", hash = "sha256:f51969bac61441fd31f028d7b3b45962f3ecebf691a510495e5d2cd8c8092dbd"}, + {file = "lxml-5.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:b0b58fbfa1bf7367dde8a557994e3b1637294be6cf2169810375caf8571a085c"}, + {file = "lxml-5.2.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3e183c6e3298a2ed5af9d7a356ea823bccaab4ec2349dc9ed83999fd289d14d5"}, + {file = "lxml-5.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:804f74efe22b6a227306dd890eecc4f8c59ff25ca35f1f14e7482bbce96ef10b"}, + {file = "lxml-5.2.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:08802f0c56ed150cc6885ae0788a321b73505d2263ee56dad84d200cab11c07a"}, + {file = "lxml-5.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f8c09ed18ecb4ebf23e02b8e7a22a05d6411911e6fabef3a36e4f371f4f2585"}, + {file = "lxml-5.2.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3d30321949861404323c50aebeb1943461a67cd51d4200ab02babc58bd06a86"}, + {file = "lxml-5.2.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:b560e3aa4b1d49e0e6c847d72665384db35b2f5d45f8e6a5c0072e0283430533"}, + {file = "lxml-5.2.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:058a1308914f20784c9f4674036527e7c04f7be6fb60f5d61353545aa7fcb739"}, + {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:adfb84ca6b87e06bc6b146dc7da7623395db1e31621c4785ad0658c5028b37d7"}, + {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:417d14450f06d51f363e41cace6488519038f940676ce9664b34ebf5653433a5"}, + {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a2dfe7e2473f9b59496247aad6e23b405ddf2e12ef0765677b0081c02d6c2c0b"}, + {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bf2e2458345d9bffb0d9ec16557d8858c9c88d2d11fed53998512504cd9df49b"}, + {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:58278b29cb89f3e43ff3e0c756abbd1518f3ee6adad9e35b51fb101c1c1daaec"}, + {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:64641a6068a16201366476731301441ce93457eb8452056f570133a6ceb15fca"}, + {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:78bfa756eab503673991bdcf464917ef7845a964903d3302c5f68417ecdc948c"}, + {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:11a04306fcba10cd9637e669fd73aa274c1c09ca64af79c041aa820ea992b637"}, + {file = "lxml-5.2.1-cp38-cp38-win32.whl", hash = "sha256:66bc5eb8a323ed9894f8fa0ee6cb3e3fb2403d99aee635078fd19a8bc7a5a5da"}, + {file = "lxml-5.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:9676bfc686fa6a3fa10cd4ae6b76cae8be26eb5ec6811d2a325636c460da1806"}, + {file = "lxml-5.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cf22b41fdae514ee2f1691b6c3cdeae666d8b7fa9434de445f12bbeee0cf48dd"}, + {file = "lxml-5.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ec42088248c596dbd61d4ae8a5b004f97a4d91a9fd286f632e42e60b706718d7"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd53553ddad4a9c2f1f022756ae64abe16da1feb497edf4d9f87f99ec7cf86bd"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feaa45c0eae424d3e90d78823f3828e7dc42a42f21ed420db98da2c4ecf0a2cb"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddc678fb4c7e30cf830a2b5a8d869538bc55b28d6c68544d09c7d0d8f17694dc"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:853e074d4931dbcba7480d4dcab23d5c56bd9607f92825ab80ee2bd916edea53"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc4691d60512798304acb9207987e7b2b7c44627ea88b9d77489bbe3e6cc3bd4"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:beb72935a941965c52990f3a32d7f07ce869fe21c6af8b34bf6a277b33a345d3"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:6588c459c5627fefa30139be4d2e28a2c2a1d0d1c265aad2ba1935a7863a4913"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:588008b8497667f1ddca7c99f2f85ce8511f8f7871b4a06ceede68ab62dff64b"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6787b643356111dfd4032b5bffe26d2f8331556ecb79e15dacb9275da02866e"}, + {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7c17b64b0a6ef4e5affae6a3724010a7a66bda48a62cfe0674dabd46642e8b54"}, + {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:27aa20d45c2e0b8cd05da6d4759649170e8dfc4f4e5ef33a34d06f2d79075d57"}, + {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d4f2cc7060dc3646632d7f15fe68e2fa98f58e35dd5666cd525f3b35d3fed7f8"}, + {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff46d772d5f6f73564979cd77a4fffe55c916a05f3cb70e7c9c0590059fb29ef"}, + {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:96323338e6c14e958d775700ec8a88346014a85e5de73ac7967db0367582049b"}, + {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:52421b41ac99e9d91934e4d0d0fe7da9f02bfa7536bb4431b4c05c906c8c6919"}, + {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:7a7efd5b6d3e30d81ec68ab8a88252d7c7c6f13aaa875009fe3097eb4e30b84c"}, + {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ed777c1e8c99b63037b91f9d73a6aad20fd035d77ac84afcc205225f8f41188"}, + {file = "lxml-5.2.1-cp39-cp39-win32.whl", hash = "sha256:644df54d729ef810dcd0f7732e50e5ad1bd0a135278ed8d6bcb06f33b6b6f708"}, + {file = "lxml-5.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:9ca66b8e90daca431b7ca1408cae085d025326570e57749695d6a01454790e95"}, + {file = "lxml-5.2.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9b0ff53900566bc6325ecde9181d89afadc59c5ffa39bddf084aaedfe3b06a11"}, + {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd6037392f2d57793ab98d9e26798f44b8b4da2f2464388588f48ac52c489ea1"}, + {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b9c07e7a45bb64e21df4b6aa623cb8ba214dfb47d2027d90eac197329bb5e94"}, + {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3249cc2989d9090eeac5467e50e9ec2d40704fea9ab72f36b034ea34ee65ca98"}, + {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f42038016852ae51b4088b2862126535cc4fc85802bfe30dea3500fdfaf1864e"}, + {file = "lxml-5.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:533658f8fbf056b70e434dff7e7aa611bcacb33e01f75de7f821810e48d1bb66"}, + {file = "lxml-5.2.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:622020d4521e22fb371e15f580d153134bfb68d6a429d1342a25f051ec72df1c"}, + {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efa7b51824aa0ee957ccd5a741c73e6851de55f40d807f08069eb4c5a26b2baa"}, + {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c6ad0fbf105f6bcc9300c00010a2ffa44ea6f555df1a2ad95c88f5656104817"}, + {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e233db59c8f76630c512ab4a4daf5a5986da5c3d5b44b8e9fc742f2a24dbd460"}, + {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6a014510830df1475176466b6087fc0c08b47a36714823e58d8b8d7709132a96"}, + {file = "lxml-5.2.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d38c8f50ecf57f0463399569aa388b232cf1a2ffb8f0a9a5412d0db57e054860"}, + {file = "lxml-5.2.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5aea8212fb823e006b995c4dda533edcf98a893d941f173f6c9506126188860d"}, + {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff097ae562e637409b429a7ac958a20aab237a0378c42dabaa1e3abf2f896e5f"}, + {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f5d65c39f16717a47c36c756af0fb36144069c4718824b7533f803ecdf91138"}, + {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3d0c3dd24bb4605439bf91068598d00c6370684f8de4a67c2992683f6c309d6b"}, + {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e32be23d538753a8adb6c85bd539f5fd3b15cb987404327c569dfc5fd8366e85"}, + {file = "lxml-5.2.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cc518cea79fd1e2f6c90baafa28906d4309d24f3a63e801d855e7424c5b34144"}, + {file = "lxml-5.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a0af35bd8ebf84888373630f73f24e86bf016642fb8576fba49d3d6b560b7cbc"}, + {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8aca2e3a72f37bfc7b14ba96d4056244001ddcc18382bd0daa087fd2e68a354"}, + {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ca1e8188b26a819387b29c3895c47a5e618708fe6f787f3b1a471de2c4a94d9"}, + {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c8ba129e6d3b0136a0f50345b2cb3db53f6bda5dd8c7f5d83fbccba97fb5dcb5"}, + {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e998e304036198b4f6914e6a1e2b6f925208a20e2042563d9734881150c6c246"}, + {file = "lxml-5.2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d3be9b2076112e51b323bdf6d5a7f8a798de55fb8d95fcb64bd179460cdc0704"}, + {file = "lxml-5.2.1.tar.gz", hash = "sha256:3f7765e69bbce0906a7c74d5fe46d2c7a7596147318dbc08e4a2431f3060e306"}, ] [package.extras] cssselect = ["cssselect (>=0.7)"] +html-clean = ["lxml-html-clean"] html5 = ["html5lib"] htmlsoup = ["BeautifulSoup4"] -source = ["Cython (>=0.29.35)"] +source = ["Cython (>=3.0.10)"] [[package]] name = "macholib" -version = "1.16.2" +version = "1.16.3" description = "Mach-O header analysis and editing" optional = true python-versions = "*" files = [ - {file = "macholib-1.16.2-py2.py3-none-any.whl", hash = "sha256:44c40f2cd7d6726af8fa6fe22549178d3a4dfecc35a9cd15ea916d9c83a688e0"}, - {file = "macholib-1.16.2.tar.gz", hash = "sha256:557bbfa1bb255c20e9abafe7ed6cd8046b48d9525db2f9b77d3122a63a2a8bf8"}, + {file = "macholib-1.16.3-py2.py3-none-any.whl", hash = "sha256:0e315d7583d38b8c77e815b1ecbdbf504a8258d8b3e17b61165c6feb60d18f2c"}, + {file = "macholib-1.16.3.tar.gz", hash = "sha256:07ae9e15e8e4cd9a788013d81f5908b3609aa76f9b1421bae9c4d7606ec86a30"}, ] [package.dependencies] @@ -4161,19 +4270,20 @@ altgraph = ">=0.17" [[package]] name = "markdown" -version = "3.4.3" +version = "3.6" description = "Python implementation of John Gruber's Markdown." optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Markdown-3.4.3-py3-none-any.whl", hash = "sha256:065fd4df22da73a625f14890dd77eb8040edcbd68794bcd35943be14490608b2"}, - {file = "Markdown-3.4.3.tar.gz", hash = "sha256:8bf101198e004dc93e84a12a7395e31aac6a9c9942848ae1d99b9d72cf9b3520"}, + {file = "Markdown-3.6-py3-none-any.whl", hash = "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f"}, + {file = "Markdown-3.6.tar.gz", hash = "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224"}, ] [package.dependencies] importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} [package.extras] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] testing = ["coverage", "pyyaml"] [[package]] @@ -4200,121 +4310,127 @@ testing = ["coverage", "psutil", "pytest (>=3.6,<4)", "pytest-benchmark (>=3.2,< [[package]] name = "markupsafe" -version = "2.1.3" +version = "2.1.5" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.7" files = [ - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, - {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, - {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, - {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, - {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, - {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, - {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, - {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, ] [[package]] name = "matplotlib" -version = "3.7.2" +version = "3.7.5" description = "Python plotting package" optional = false python-versions = ">=3.8" files = [ - {file = "matplotlib-3.7.2-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:2699f7e73a76d4c110f4f25be9d2496d6ab4f17345307738557d345f099e07de"}, - {file = "matplotlib-3.7.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a8035ba590658bae7562786c9cc6ea1a84aa49d3afab157e414c9e2ea74f496d"}, - {file = "matplotlib-3.7.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2f8e4a49493add46ad4a8c92f63e19d548b2b6ebbed75c6b4c7f46f57d36cdd1"}, - {file = "matplotlib-3.7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71667eb2ccca4c3537d9414b1bc00554cb7f91527c17ee4ec38027201f8f1603"}, - {file = "matplotlib-3.7.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:152ee0b569a37630d8628534c628456b28686e085d51394da6b71ef84c4da201"}, - {file = "matplotlib-3.7.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:070f8dddd1f5939e60aacb8fa08f19551f4b0140fab16a3669d5cd6e9cb28fc8"}, - {file = "matplotlib-3.7.2-cp310-cp310-win32.whl", hash = "sha256:fdbb46fad4fb47443b5b8ac76904b2e7a66556844f33370861b4788db0f8816a"}, - {file = "matplotlib-3.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:23fb1750934e5f0128f9423db27c474aa32534cec21f7b2153262b066a581fd1"}, - {file = "matplotlib-3.7.2-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:30e1409b857aa8a747c5d4f85f63a79e479835f8dffc52992ac1f3f25837b544"}, - {file = "matplotlib-3.7.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:50e0a55ec74bf2d7a0ebf50ac580a209582c2dd0f7ab51bc270f1b4a0027454e"}, - {file = "matplotlib-3.7.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ac60daa1dc83e8821eed155796b0f7888b6b916cf61d620a4ddd8200ac70cd64"}, - {file = "matplotlib-3.7.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:305e3da477dc8607336ba10bac96986d6308d614706cae2efe7d3ffa60465b24"}, - {file = "matplotlib-3.7.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c308b255efb9b06b23874236ec0f10f026673ad6515f602027cc8ac7805352d"}, - {file = "matplotlib-3.7.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60c521e21031632aa0d87ca5ba0c1c05f3daacadb34c093585a0be6780f698e4"}, - {file = "matplotlib-3.7.2-cp311-cp311-win32.whl", hash = "sha256:26bede320d77e469fdf1bde212de0ec889169b04f7f1179b8930d66f82b30cbc"}, - {file = "matplotlib-3.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:af4860132c8c05261a5f5f8467f1b269bf1c7c23902d75f2be57c4a7f2394b3e"}, - {file = "matplotlib-3.7.2-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:a1733b8e84e7e40a9853e505fe68cc54339f97273bdfe6f3ed980095f769ddc7"}, - {file = "matplotlib-3.7.2-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:d9881356dc48e58910c53af82b57183879129fa30492be69058c5b0d9fddf391"}, - {file = "matplotlib-3.7.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f081c03f413f59390a80b3e351cc2b2ea0205839714dbc364519bcf51f4b56ca"}, - {file = "matplotlib-3.7.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1cd120fca3407a225168238b790bd5c528f0fafde6172b140a2f3ab7a4ea63e9"}, - {file = "matplotlib-3.7.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a2c1590b90aa7bd741b54c62b78de05d4186271e34e2377e0289d943b3522273"}, - {file = "matplotlib-3.7.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6d2ff3c984b8a569bc1383cd468fc06b70d7b59d5c2854ca39f1436ae8394117"}, - {file = "matplotlib-3.7.2-cp38-cp38-win32.whl", hash = "sha256:5dea00b62d28654b71ca92463656d80646675628d0828e08a5f3b57e12869e13"}, - {file = "matplotlib-3.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:0f506a1776ee94f9e131af1ac6efa6e5bc7cb606a3e389b0ccb6e657f60bb676"}, - {file = "matplotlib-3.7.2-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:6515e878f91894c2e4340d81f0911857998ccaf04dbc1bba781e3d89cbf70608"}, - {file = "matplotlib-3.7.2-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:71f7a8c6b124e904db550f5b9fe483d28b896d4135e45c4ea381ad3b8a0e3256"}, - {file = "matplotlib-3.7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12f01b92ecd518e0697da4d97d163b2b3aa55eb3eb4e2c98235b3396d7dad55f"}, - {file = "matplotlib-3.7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7e28d6396563955f7af437894a36bf2b279462239a41028323e04b85179058b"}, - {file = "matplotlib-3.7.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbcf59334ff645e6a67cd5f78b4b2cdb76384cdf587fa0d2dc85f634a72e1a3e"}, - {file = "matplotlib-3.7.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:318c89edde72ff95d8df67d82aca03861240512994a597a435a1011ba18dbc7f"}, - {file = "matplotlib-3.7.2-cp39-cp39-win32.whl", hash = "sha256:ce55289d5659b5b12b3db4dc9b7075b70cef5631e56530f14b2945e8836f2d20"}, - {file = "matplotlib-3.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:2ecb5be2b2815431c81dc115667e33da0f5a1bcf6143980d180d09a717c4a12e"}, - {file = "matplotlib-3.7.2-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:fdcd28360dbb6203fb5219b1a5658df226ac9bebc2542a9e8f457de959d713d0"}, - {file = "matplotlib-3.7.2-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c3cca3e842b11b55b52c6fb8bd6a4088693829acbfcdb3e815fa9b7d5c92c1b"}, - {file = "matplotlib-3.7.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ebf577c7a6744e9e1bd3fee45fc74a02710b214f94e2bde344912d85e0c9af7c"}, - {file = "matplotlib-3.7.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:936bba394682049919dda062d33435b3be211dc3dcaa011e09634f060ec878b2"}, - {file = "matplotlib-3.7.2-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bc221ffbc2150458b1cd71cdd9ddd5bb37962b036e41b8be258280b5b01da1dd"}, - {file = "matplotlib-3.7.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35d74ebdb3f71f112b36c2629cf32323adfbf42679e2751252acd468f5001c07"}, - {file = "matplotlib-3.7.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:717157e61b3a71d3d26ad4e1770dc85156c9af435659a25ee6407dc866cb258d"}, - {file = "matplotlib-3.7.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:20f844d6be031948148ba49605c8b96dfe7d3711d1b63592830d650622458c11"}, - {file = "matplotlib-3.7.2.tar.gz", hash = "sha256:a8cdb91dddb04436bd2f098b8fdf4b81352e68cf4d2c6756fcc414791076569b"}, + {file = "matplotlib-3.7.5-cp310-cp310-macosx_10_12_universal2.whl", hash = "sha256:4a87b69cb1cb20943010f63feb0b2901c17a3b435f75349fd9865713bfa63925"}, + {file = "matplotlib-3.7.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:d3ce45010fefb028359accebb852ca0c21bd77ec0f281952831d235228f15810"}, + {file = "matplotlib-3.7.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fbea1e762b28400393d71be1a02144aa16692a3c4c676ba0178ce83fc2928fdd"}, + {file = "matplotlib-3.7.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec0e1adc0ad70ba8227e957551e25a9d2995e319c29f94a97575bb90fa1d4469"}, + {file = "matplotlib-3.7.5-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6738c89a635ced486c8a20e20111d33f6398a9cbebce1ced59c211e12cd61455"}, + {file = "matplotlib-3.7.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1210b7919b4ed94b5573870f316bca26de3e3b07ffdb563e79327dc0e6bba515"}, + {file = "matplotlib-3.7.5-cp310-cp310-win32.whl", hash = "sha256:068ebcc59c072781d9dcdb82f0d3f1458271c2de7ca9c78f5bd672141091e9e1"}, + {file = "matplotlib-3.7.5-cp310-cp310-win_amd64.whl", hash = "sha256:f098ffbaab9df1e3ef04e5a5586a1e6b1791380698e84938d8640961c79b1fc0"}, + {file = "matplotlib-3.7.5-cp311-cp311-macosx_10_12_universal2.whl", hash = "sha256:f65342c147572673f02a4abec2d5a23ad9c3898167df9b47c149f32ce61ca078"}, + {file = "matplotlib-3.7.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:4ddf7fc0e0dc553891a117aa083039088d8a07686d4c93fb8a810adca68810af"}, + {file = "matplotlib-3.7.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0ccb830fc29442360d91be48527809f23a5dcaee8da5f4d9b2d5b867c1b087b8"}, + {file = "matplotlib-3.7.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efc6bb28178e844d1f408dd4d6341ee8a2e906fc9e0fa3dae497da4e0cab775d"}, + {file = "matplotlib-3.7.5-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b15c4c2d374f249f324f46e883340d494c01768dd5287f8bc00b65b625ab56c"}, + {file = "matplotlib-3.7.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d028555421912307845e59e3de328260b26d055c5dac9b182cc9783854e98fb"}, + {file = "matplotlib-3.7.5-cp311-cp311-win32.whl", hash = "sha256:fe184b4625b4052fa88ef350b815559dd90cc6cc8e97b62f966e1ca84074aafa"}, + {file = "matplotlib-3.7.5-cp311-cp311-win_amd64.whl", hash = "sha256:084f1f0f2f1010868c6f1f50b4e1c6f2fb201c58475494f1e5b66fed66093647"}, + {file = "matplotlib-3.7.5-cp312-cp312-macosx_10_12_universal2.whl", hash = "sha256:34bceb9d8ddb142055ff27cd7135f539f2f01be2ce0bafbace4117abe58f8fe4"}, + {file = "matplotlib-3.7.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:c5a2134162273eb8cdfd320ae907bf84d171de948e62180fa372a3ca7cf0f433"}, + {file = "matplotlib-3.7.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:039ad54683a814002ff37bf7981aa1faa40b91f4ff84149beb53d1eb64617980"}, + {file = "matplotlib-3.7.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4d742ccd1b09e863b4ca58291728db645b51dab343eebb08d5d4b31b308296ce"}, + {file = "matplotlib-3.7.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:743b1c488ca6a2bc7f56079d282e44d236bf375968bfd1b7ba701fd4d0fa32d6"}, + {file = "matplotlib-3.7.5-cp312-cp312-win_amd64.whl", hash = "sha256:fbf730fca3e1f23713bc1fae0a57db386e39dc81ea57dc305c67f628c1d7a342"}, + {file = "matplotlib-3.7.5-cp38-cp38-macosx_10_12_universal2.whl", hash = "sha256:cfff9b838531698ee40e40ea1a8a9dc2c01edb400b27d38de6ba44c1f9a8e3d2"}, + {file = "matplotlib-3.7.5-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:1dbcca4508bca7847fe2d64a05b237a3dcaec1f959aedb756d5b1c67b770c5ee"}, + {file = "matplotlib-3.7.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4cdf4ef46c2a1609a50411b66940b31778db1e4b73d4ecc2eaa40bd588979b13"}, + {file = "matplotlib-3.7.5-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:167200ccfefd1674b60e957186dfd9baf58b324562ad1a28e5d0a6b3bea77905"}, + {file = "matplotlib-3.7.5-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:53e64522934df6e1818b25fd48cf3b645b11740d78e6ef765fbb5fa5ce080d02"}, + {file = "matplotlib-3.7.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3e3bc79b2d7d615067bd010caff9243ead1fc95cf735c16e4b2583173f717eb"}, + {file = "matplotlib-3.7.5-cp38-cp38-win32.whl", hash = "sha256:6b641b48c6819726ed47c55835cdd330e53747d4efff574109fd79b2d8a13748"}, + {file = "matplotlib-3.7.5-cp38-cp38-win_amd64.whl", hash = "sha256:f0b60993ed3488b4532ec6b697059897891927cbfc2b8d458a891b60ec03d9d7"}, + {file = "matplotlib-3.7.5-cp39-cp39-macosx_10_12_universal2.whl", hash = "sha256:090964d0afaff9c90e4d8de7836757e72ecfb252fb02884016d809239f715651"}, + {file = "matplotlib-3.7.5-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:9fc6fcfbc55cd719bc0bfa60bde248eb68cf43876d4c22864603bdd23962ba25"}, + {file = "matplotlib-3.7.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7cc3078b019bb863752b8b60e8b269423000f1603cb2299608231996bd9d54"}, + {file = "matplotlib-3.7.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e4e9a868e8163abaaa8259842d85f949a919e1ead17644fb77a60427c90473c"}, + {file = "matplotlib-3.7.5-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fa7ebc995a7d747dacf0a717d0eb3aa0f0c6a0e9ea88b0194d3a3cd241a1500f"}, + {file = "matplotlib-3.7.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3785bfd83b05fc0e0c2ae4c4a90034fe693ef96c679634756c50fe6efcc09856"}, + {file = "matplotlib-3.7.5-cp39-cp39-win32.whl", hash = "sha256:29b058738c104d0ca8806395f1c9089dfe4d4f0f78ea765c6c704469f3fffc81"}, + {file = "matplotlib-3.7.5-cp39-cp39-win_amd64.whl", hash = "sha256:fd4028d570fa4b31b7b165d4a685942ae9cdc669f33741e388c01857d9723eab"}, + {file = "matplotlib-3.7.5-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:2a9a3f4d6a7f88a62a6a18c7e6a84aedcaf4faf0708b4ca46d87b19f1b526f88"}, + {file = "matplotlib-3.7.5-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9b3fd853d4a7f008a938df909b96db0b454225f935d3917520305b90680579c"}, + {file = "matplotlib-3.7.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0ad550da9f160737d7890217c5eeed4337d07e83ca1b2ca6535078f354e7675"}, + {file = "matplotlib-3.7.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:20da7924a08306a861b3f2d1da0d1aa9a6678e480cf8eacffe18b565af2813e7"}, + {file = "matplotlib-3.7.5-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b45c9798ea6bb920cb77eb7306409756a7fab9db9b463e462618e0559aecb30e"}, + {file = "matplotlib-3.7.5-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a99866267da1e561c7776fe12bf4442174b79aac1a47bd7e627c7e4d077ebd83"}, + {file = "matplotlib-3.7.5-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b6aa62adb6c268fc87d80f963aca39c64615c31830b02697743c95590ce3fbb"}, + {file = "matplotlib-3.7.5-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:e530ab6a0afd082d2e9c17eb1eb064a63c5b09bb607b2b74fa41adbe3e162286"}, + {file = "matplotlib-3.7.5.tar.gz", hash = "sha256:1e5c971558ebc811aa07f54c7b7c677d78aa518ef4c390e14673a09e0860184a"}, ] [package.dependencies] @@ -4323,21 +4439,21 @@ cycler = ">=0.10" fonttools = ">=4.22.0" importlib-resources = {version = ">=3.2.0", markers = "python_version < \"3.10\""} kiwisolver = ">=1.0.1" -numpy = ">=1.20" +numpy = ">=1.20,<2" packaging = ">=20.0" pillow = ">=6.2.0" -pyparsing = ">=2.3.1,<3.1" +pyparsing = ">=2.3.1" python-dateutil = ">=2.7" [[package]] name = "matplotlib-inline" -version = "0.1.6" +version = "0.1.7" description = "Inline Matplotlib backend for Jupyter" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, - {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, ] [package.dependencies] @@ -4375,13 +4491,13 @@ testing = ["coverage", "pytest (>=3.6,<4)", "pytest-cov", "pytest-regressions"] [[package]] name = "mistune" -version = "3.0.1" +version = "3.0.2" description = "A sane and fast Markdown parser with useful plugins and renderers" optional = false python-versions = ">=3.7" files = [ - {file = "mistune-3.0.1-py3-none-any.whl", hash = "sha256:b9b3e438efbb57c62b5beb5e134dab664800bdf1284a7ee09e8b12b13eb1aac6"}, - {file = "mistune-3.0.1.tar.gz", hash = "sha256:e912116c13aa0944f9dc530db38eb88f6a77087ab128f49f84a48f4c05ea163c"}, + {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, + {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, ] [[package]] @@ -4413,24 +4529,24 @@ files = [ [[package]] name = "more-itertools" -version = "9.1.0" +version = "10.2.0" description = "More routines for operating on iterables, beyond itertools" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "more-itertools-9.1.0.tar.gz", hash = "sha256:cabaa341ad0389ea83c17a94566a53ae4c9d07349861ecb14dc6d0345cf9ac5d"}, - {file = "more_itertools-9.1.0-py3-none-any.whl", hash = "sha256:d2bc7f02446e86a68911e58ded76d6561eea00cddfb2a91e7019bbb586c799f3"}, + {file = "more-itertools-10.2.0.tar.gz", hash = "sha256:8fccb480c43d3e99a00087634c06dd02b0d50fbf088b380de5a41a015ec239e1"}, + {file = "more_itertools-10.2.0-py3-none-any.whl", hash = "sha256:686b06abe565edfab151cb8fd385a05651e1fdf8f0a14191e4439283421f8684"}, ] [[package]] name = "mplfinance" -version = "0.12.9b7" +version = "0.12.10b0" description = "Utilities for the visualization, and visual analysis, of financial data" optional = false python-versions = "*" files = [ - {file = "mplfinance-0.12.9b7-py3-none-any.whl", hash = "sha256:8b5d186f0cd504f34da7547933c27e87f237fe3721a83de6b93c6eaf28377dcd"}, - {file = "mplfinance-0.12.9b7.tar.gz", hash = "sha256:8c0ef47dfb465ea95b7c3577e261b57b5d6ad2bce6d287a17b8b4dd2fbacc92e"}, + {file = "mplfinance-0.12.10b0-py3-none-any.whl", hash = "sha256:76d3b095f05ff35de730751649de063bea4064d0c49b21b6182c82997a7f52bb"}, + {file = "mplfinance-0.12.10b0.tar.gz", hash = "sha256:7da150b5851aa5119ad6e06b55e48338b619bb6773f1b85df5de67a5ffd917bf"}, ] [package.dependencies] @@ -4455,85 +4571,101 @@ requests = ">=2.28.1" [[package]] name = "multidict" -version = "6.0.4" +version = "6.0.5" description = "multidict implementation" optional = false python-versions = ">=3.7" files = [ - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, - {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, - {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, - {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, - {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, - {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, - {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, - {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, - {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, - {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, - {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, - {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, - {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:228b644ae063c10e7f324ab1ab6b548bdf6f8b47f3ec234fef1093bc2735e5f9"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:896ebdcf62683551312c30e20614305f53125750803b614e9e6ce74a96232604"}, + {file = "multidict-6.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:411bf8515f3be9813d06004cac41ccf7d1cd46dfe233705933dd163b60e37600"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d147090048129ce3c453f0292e7697d333db95e52616b3793922945804a433c"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:215ed703caf15f578dca76ee6f6b21b7603791ae090fbf1ef9d865571039ade5"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c6390cf87ff6234643428991b7359b5f59cc15155695deb4eda5c777d2b880f"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21fd81c4ebdb4f214161be351eb5bcf385426bf023041da2fd9e60681f3cebae"}, + {file = "multidict-6.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3cc2ad10255f903656017363cd59436f2111443a76f996584d1077e43ee51182"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6939c95381e003f54cd4c5516740faba40cf5ad3eeff460c3ad1d3e0ea2549bf"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:220dd781e3f7af2c2c1053da9fa96d9cf3072ca58f057f4c5adaaa1cab8fc442"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:766c8f7511df26d9f11cd3a8be623e59cca73d44643abab3f8c8c07620524e4a"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:fe5d7785250541f7f5019ab9cba2c71169dc7d74d0f45253f8313f436458a4ef"}, + {file = "multidict-6.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1c1496e73051918fcd4f58ff2e0f2f3066d1c76a0c6aeffd9b45d53243702cc"}, + {file = "multidict-6.0.5-cp310-cp310-win32.whl", hash = "sha256:7afcdd1fc07befad18ec4523a782cde4e93e0a2bf71239894b8d61ee578c1319"}, + {file = "multidict-6.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:99f60d34c048c5c2fabc766108c103612344c46e35d4ed9ae0673d33c8fb26e8"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f285e862d2f153a70586579c15c44656f888806ed0e5b56b64489afe4a2dbfba"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:53689bb4e102200a4fafa9de9c7c3c212ab40a7ab2c8e474491914d2305f187e"}, + {file = "multidict-6.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:612d1156111ae11d14afaf3a0669ebf6c170dbb735e510a7438ffe2369a847fd"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7be7047bd08accdb7487737631d25735c9a04327911de89ff1b26b81745bd4e3"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de170c7b4fe6859beb8926e84f7d7d6c693dfe8e27372ce3b76f01c46e489fcf"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:04bde7a7b3de05732a4eb39c94574db1ec99abb56162d6c520ad26f83267de29"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85f67aed7bb647f93e7520633d8f51d3cbc6ab96957c71272b286b2f30dc70ed"}, + {file = "multidict-6.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:425bf820055005bfc8aa9a0b99ccb52cc2f4070153e34b701acc98d201693733"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d3eb1ceec286eba8220c26f3b0096cf189aea7057b6e7b7a2e60ed36b373b77f"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7901c05ead4b3fb75113fb1dd33eb1253c6d3ee37ce93305acd9d38e0b5f21a4"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e0e79d91e71b9867c73323a3444724d496c037e578a0e1755ae159ba14f4f3d1"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:29bfeb0dff5cb5fdab2023a7a9947b3b4af63e9c47cae2a10ad58394b517fddc"}, + {file = "multidict-6.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e030047e85cbcedbfc073f71836d62dd5dadfbe7531cae27789ff66bc551bd5e"}, + {file = "multidict-6.0.5-cp311-cp311-win32.whl", hash = "sha256:2f4848aa3baa109e6ab81fe2006c77ed4d3cd1e0ac2c1fbddb7b1277c168788c"}, + {file = "multidict-6.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:2faa5ae9376faba05f630d7e5e6be05be22913782b927b19d12b8145968a85ea"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:51d035609b86722963404f711db441cf7134f1889107fb171a970c9701f92e1e"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cbebcd5bcaf1eaf302617c114aa67569dd3f090dd0ce8ba9e35e9985b41ac35b"}, + {file = "multidict-6.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ffc42c922dbfddb4a4c3b438eb056828719f07608af27d163191cb3e3aa6cc5"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ceb3b7e6a0135e092de86110c5a74e46bda4bd4fbfeeb3a3bcec79c0f861e450"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79660376075cfd4b2c80f295528aa6beb2058fd289f4c9252f986751a4cd0496"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4428b29611e989719874670fd152b6625500ad6c686d464e99f5aaeeaca175a"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84a5c3a5f7ce6db1f999fb9438f686bc2e09d38143f2d93d8406ed2dd6b9226"}, + {file = "multidict-6.0.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76c0de87358b192de7ea9649beb392f107dcad9ad27276324c24c91774ca5271"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:79a6d2ba910adb2cbafc95dad936f8b9386e77c84c35bc0add315b856d7c3abb"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:92d16a3e275e38293623ebf639c471d3e03bb20b8ebb845237e0d3664914caef"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:fb616be3538599e797a2017cccca78e354c767165e8858ab5116813146041a24"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:14c2976aa9038c2629efa2c148022ed5eb4cb939e15ec7aace7ca932f48f9ba6"}, + {file = "multidict-6.0.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:435a0984199d81ca178b9ae2c26ec3d49692d20ee29bc4c11a2a8d4514c67eda"}, + {file = "multidict-6.0.5-cp312-cp312-win32.whl", hash = "sha256:9fe7b0653ba3d9d65cbe7698cca585bf0f8c83dbbcc710db9c90f478e175f2d5"}, + {file = "multidict-6.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:01265f5e40f5a17f8241d52656ed27192be03bfa8764d88e8220141d1e4b3556"}, + {file = "multidict-6.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:19fe01cea168585ba0f678cad6f58133db2aa14eccaf22f88e4a6dccadfad8b3"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6bf7a982604375a8d49b6cc1b781c1747f243d91b81035a9b43a2126c04766f5"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:107c0cdefe028703fb5dafe640a409cb146d44a6ae201e55b35a4af8e95457dd"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:403c0911cd5d5791605808b942c88a8155c2592e05332d2bf78f18697a5fa15e"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aeaf541ddbad8311a87dd695ed9642401131ea39ad7bc8cf3ef3967fd093b626"}, + {file = "multidict-6.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e4972624066095e52b569e02b5ca97dbd7a7ddd4294bf4e7247d52635630dd83"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d946b0a9eb8aaa590df1fe082cee553ceab173e6cb5b03239716338629c50c7a"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b55358304d7a73d7bdf5de62494aaf70bd33015831ffd98bc498b433dfe5b10c"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a3145cb08d8625b2d3fee1b2d596a8766352979c9bffe5d7833e0503d0f0b5e5"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d65f25da8e248202bd47445cec78e0025c0fe7582b23ec69c3b27a640dd7a8e3"}, + {file = "multidict-6.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c9bf56195c6bbd293340ea82eafd0071cb3d450c703d2c93afb89f93b8386ccc"}, + {file = "multidict-6.0.5-cp37-cp37m-win32.whl", hash = "sha256:69db76c09796b313331bb7048229e3bee7928eb62bab5e071e9f7fcc4879caee"}, + {file = "multidict-6.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:fce28b3c8a81b6b36dfac9feb1de115bab619b3c13905b419ec71d03a3fc1423"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76f067f5121dcecf0d63a67f29080b26c43c71a98b10c701b0677e4a065fbd54"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b82cc8ace10ab5bd93235dfaab2021c70637005e1ac787031f4d1da63d493c1d"}, + {file = "multidict-6.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5cb241881eefd96b46f89b1a056187ea8e9ba14ab88ba632e68d7a2ecb7aadf7"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8e94e6912639a02ce173341ff62cc1201232ab86b8a8fcc05572741a5dc7d93"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09a892e4a9fb47331da06948690ae38eaa2426de97b4ccbfafbdcbe5c8f37ff8"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:55205d03e8a598cfc688c71ca8ea5f66447164efff8869517f175ea632c7cb7b"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b15024f864916b4951adb95d3a80c9431299080341ab9544ed148091b53f50"}, + {file = "multidict-6.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2a1dee728b52b33eebff5072817176c172050d44d67befd681609b4746e1c2e"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:edd08e6f2f1a390bf137080507e44ccc086353c8e98c657e666c017718561b89"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60d698e8179a42ec85172d12f50b1668254628425a6bd611aba022257cac1386"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:3d25f19500588cbc47dc19081d78131c32637c25804df8414463ec908631e453"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:4cc0ef8b962ac7a5e62b9e826bd0cd5040e7d401bc45a6835910ed699037a461"}, + {file = "multidict-6.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:eca2e9d0cc5a889850e9bbd68e98314ada174ff6ccd1129500103df7a94a7a44"}, + {file = "multidict-6.0.5-cp38-cp38-win32.whl", hash = "sha256:4a6a4f196f08c58c59e0b8ef8ec441d12aee4125a7d4f4fef000ccb22f8d7241"}, + {file = "multidict-6.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:0275e35209c27a3f7951e1ce7aaf93ce0d163b28948444bec61dd7badc6d3f8c"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e7be68734bd8c9a513f2b0cfd508802d6609da068f40dc57d4e3494cefc92929"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1d9ea7a7e779d7a3561aade7d596649fbecfa5c08a7674b11b423783217933f9"}, + {file = "multidict-6.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ea1456df2a27c73ce51120fa2f519f1bea2f4a03a917f4a43c8707cf4cbbae1a"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf590b134eb70629e350691ecca88eac3e3b8b3c86992042fb82e3cb1830d5e1"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5c0631926c4f58e9a5ccce555ad7747d9a9f8b10619621f22f9635f069f6233e"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dce1c6912ab9ff5f179eaf6efe7365c1f425ed690b03341911bf4939ef2f3046"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0868d64af83169e4d4152ec612637a543f7a336e4a307b119e98042e852ad9c"}, + {file = "multidict-6.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:141b43360bfd3bdd75f15ed811850763555a251e38b2405967f8e25fb43f7d40"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7df704ca8cf4a073334e0427ae2345323613e4df18cc224f647f251e5e75a527"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6214c5a5571802c33f80e6c84713b2c79e024995b9c5897f794b43e714daeec9"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:cd6c8fca38178e12c00418de737aef1261576bd1b6e8c6134d3e729a4e858b38"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e02021f87a5b6932fa6ce916ca004c4d441509d33bbdbeca70d05dff5e9d2479"}, + {file = "multidict-6.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ebd8d160f91a764652d3e51ce0d2956b38efe37c9231cd82cfc0bed2e40b581c"}, + {file = "multidict-6.0.5-cp39-cp39-win32.whl", hash = "sha256:04da1bb8c8dbadf2a18a452639771951c662c5ad03aefe4884775454be322c9b"}, + {file = "multidict-6.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:d6f6d4f185481c9669b9447bf9d9cf3b95a0e9df9d169bbc17e363b7d5487755"}, + {file = "multidict-6.0.5-py3-none-any.whl", hash = "sha256:0d63c74e3d7ab26de115c49bffc92cc77ed23395303d496eae515d4204a625e7"}, + {file = "multidict-6.0.5.tar.gz", hash = "sha256:f7e301075edaf50500f0b341543c41194d8df3ae5caf4702f2095f3ca73dd8da"}, ] [[package]] @@ -4549,49 +4681,49 @@ files = [ [[package]] name = "mutagen" -version = "1.46.0" +version = "1.47.0" description = "read and write audio tags for many formats" optional = true python-versions = ">=3.7" files = [ - {file = "mutagen-1.46.0-py3-none-any.whl", hash = "sha256:8af0728aa2d5c3ee5a727e28d0627966641fddfe804c23eabb5926a4d770aed5"}, - {file = "mutagen-1.46.0.tar.gz", hash = "sha256:6e5f8ba84836b99fe60be5fb27f84be4ad919bbb6b49caa6ae81e70584b55e58"}, + {file = "mutagen-1.47.0-py3-none-any.whl", hash = "sha256:edd96f50c5907a9539d8e5bba7245f62c9f520aef333d13392a79a4f70aca719"}, + {file = "mutagen-1.47.0.tar.gz", hash = "sha256:719fadef0a978c31b4cf3c956261b3c58b6948b32023078a2117b1de09f0fc99"}, ] [[package]] name = "mypy" -version = "1.5.1" +version = "1.9.0" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f33592ddf9655a4894aef22d134de7393e95fcbdc2d15c1ab65828eee5c66c70"}, - {file = "mypy-1.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:258b22210a4a258ccd077426c7a181d789d1121aca6db73a83f79372f5569ae0"}, - {file = "mypy-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9ec1f695f0c25986e6f7f8778e5ce61659063268836a38c951200c57479cc12"}, - {file = "mypy-1.5.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:abed92d9c8f08643c7d831300b739562b0a6c9fcb028d211134fc9ab20ccad5d"}, - {file = "mypy-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:a156e6390944c265eb56afa67c74c0636f10283429171018446b732f1a05af25"}, - {file = "mypy-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6ac9c21bfe7bc9f7f1b6fae441746e6a106e48fc9de530dea29e8cd37a2c0cc4"}, - {file = "mypy-1.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51cb1323064b1099e177098cb939eab2da42fea5d818d40113957ec954fc85f4"}, - {file = "mypy-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:596fae69f2bfcb7305808c75c00f81fe2829b6236eadda536f00610ac5ec2243"}, - {file = "mypy-1.5.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:32cb59609b0534f0bd67faebb6e022fe534bdb0e2ecab4290d683d248be1b275"}, - {file = "mypy-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:159aa9acb16086b79bbb0016145034a1a05360626046a929f84579ce1666b315"}, - {file = "mypy-1.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f6b0e77db9ff4fda74de7df13f30016a0a663928d669c9f2c057048ba44f09bb"}, - {file = "mypy-1.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:26f71b535dfc158a71264e6dc805a9f8d2e60b67215ca0bfa26e2e1aa4d4d373"}, - {file = "mypy-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fc3a600f749b1008cc75e02b6fb3d4db8dbcca2d733030fe7a3b3502902f161"}, - {file = "mypy-1.5.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:26fb32e4d4afa205b24bf645eddfbb36a1e17e995c5c99d6d00edb24b693406a"}, - {file = "mypy-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:82cb6193de9bbb3844bab4c7cf80e6227d5225cc7625b068a06d005d861ad5f1"}, - {file = "mypy-1.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4a465ea2ca12804d5b34bb056be3a29dc47aea5973b892d0417c6a10a40b2d65"}, - {file = "mypy-1.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9fece120dbb041771a63eb95e4896791386fe287fefb2837258925b8326d6160"}, - {file = "mypy-1.5.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d28ddc3e3dfeab553e743e532fb95b4e6afad51d4706dd22f28e1e5e664828d2"}, - {file = "mypy-1.5.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:57b10c56016adce71fba6bc6e9fd45d8083f74361f629390c556738565af8eeb"}, - {file = "mypy-1.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:ff0cedc84184115202475bbb46dd99f8dcb87fe24d5d0ddfc0fe6b8575c88d2f"}, - {file = "mypy-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8f772942d372c8cbac575be99f9cc9d9fb3bd95c8bc2de6c01411e2c84ebca8a"}, - {file = "mypy-1.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5d627124700b92b6bbaa99f27cbe615c8ea7b3402960f6372ea7d65faf376c14"}, - {file = "mypy-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:361da43c4f5a96173220eb53340ace68cda81845cd88218f8862dfb0adc8cddb"}, - {file = "mypy-1.5.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:330857f9507c24de5c5724235e66858f8364a0693894342485e543f5b07c8693"}, - {file = "mypy-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:c543214ffdd422623e9fedd0869166c2f16affe4ba37463975043ef7d2ea8770"}, - {file = "mypy-1.5.1-py3-none-any.whl", hash = "sha256:f757063a83970d67c444f6e01d9550a7402322af3557ce7630d3c957386fa8f5"}, - {file = "mypy-1.5.1.tar.gz", hash = "sha256:b031b9601f1060bf1281feab89697324726ba0c0bae9d7cd7ab4b690940f0b92"}, + {file = "mypy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f8a67616990062232ee4c3952f41c779afac41405806042a8126fe96e098419f"}, + {file = "mypy-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d357423fa57a489e8c47b7c85dfb96698caba13d66e086b412298a1a0ea3b0ed"}, + {file = "mypy-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49c87c15aed320de9b438ae7b00c1ac91cd393c1b854c2ce538e2a72d55df150"}, + {file = "mypy-1.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:48533cdd345c3c2e5ef48ba3b0d3880b257b423e7995dada04248725c6f77374"}, + {file = "mypy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:4d3dbd346cfec7cb98e6cbb6e0f3c23618af826316188d587d1c1bc34f0ede03"}, + {file = "mypy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:653265f9a2784db65bfca694d1edd23093ce49740b2244cde583aeb134c008f3"}, + {file = "mypy-1.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a3c007ff3ee90f69cf0a15cbcdf0995749569b86b6d2f327af01fd1b8aee9dc"}, + {file = "mypy-1.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2418488264eb41f69cc64a69a745fad4a8f86649af4b1041a4c64ee61fc61129"}, + {file = "mypy-1.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:68edad3dc7d70f2f17ae4c6c1b9471a56138ca22722487eebacfd1eb5321d612"}, + {file = "mypy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:85ca5fcc24f0b4aeedc1d02f93707bccc04733f21d41c88334c5482219b1ccb3"}, + {file = "mypy-1.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aceb1db093b04db5cd390821464504111b8ec3e351eb85afd1433490163d60cd"}, + {file = "mypy-1.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0235391f1c6f6ce487b23b9dbd1327b4ec33bb93934aa986efe8a9563d9349e6"}, + {file = "mypy-1.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4d5ddc13421ba3e2e082a6c2d74c2ddb3979c39b582dacd53dd5d9431237185"}, + {file = "mypy-1.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:190da1ee69b427d7efa8aa0d5e5ccd67a4fb04038c380237a0d96829cb157913"}, + {file = "mypy-1.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:fe28657de3bfec596bbeef01cb219833ad9d38dd5393fc649f4b366840baefe6"}, + {file = "mypy-1.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e54396d70be04b34f31d2edf3362c1edd023246c82f1730bbf8768c28db5361b"}, + {file = "mypy-1.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5e6061f44f2313b94f920e91b204ec600982961e07a17e0f6cd83371cb23f5c2"}, + {file = "mypy-1.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81a10926e5473c5fc3da8abb04119a1f5811a236dc3a38d92015cb1e6ba4cb9e"}, + {file = "mypy-1.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b685154e22e4e9199fc95f298661deea28aaede5ae16ccc8cbb1045e716b3e04"}, + {file = "mypy-1.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:5d741d3fc7c4da608764073089e5f58ef6352bedc223ff58f2f038c2c4698a89"}, + {file = "mypy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:587ce887f75dd9700252a3abbc9c97bbe165a4a630597845c61279cf32dfbf02"}, + {file = "mypy-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f88566144752999351725ac623471661c9d1cd8caa0134ff98cceeea181789f4"}, + {file = "mypy-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:61758fabd58ce4b0720ae1e2fea5cfd4431591d6d590b197775329264f86311d"}, + {file = "mypy-1.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e49499be624dead83927e70c756970a0bc8240e9f769389cdf5714b0784ca6bf"}, + {file = "mypy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:571741dc4194b4f82d344b15e8837e8c5fcc462d66d076748142327626a1b6e9"}, + {file = "mypy-1.9.0-py3-none-any.whl", hash = "sha256:a260627a570559181a9ea5de61ac6297aa5af202f06fd7ab093ce74e7181e43e"}, + {file = "mypy-1.9.0.tar.gz", hash = "sha256:3cc5da0127e6a478cddd906068496a97a7618a21ce9b54bde5bf7e539c7af974"}, ] [package.dependencies] @@ -4602,6 +4734,7 @@ typing-extensions = ">=4.1.0" [package.extras] dmypy = ["psutil (>=4.0)"] install-types = ["pip"] +mypyc = ["setuptools (>=50)"] reports = ["lxml"] [[package]] @@ -4677,34 +4810,35 @@ test = ["coverage", "nbval", "pytest", "pytest-cov", "pytest-jupyter", "pytest-p [[package]] name = "nbclient" -version = "0.6.8" +version = "0.10.0" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." optional = false -python-versions = ">=3.7.0" +python-versions = ">=3.8.0" files = [ - {file = "nbclient-0.6.8-py3-none-any.whl", hash = "sha256:7cce8b415888539180535953f80ea2385cdbb444944cdeb73ffac1556fdbc228"}, - {file = "nbclient-0.6.8.tar.gz", hash = "sha256:268fde3457cafe1539e32eb1c6d796bbedb90b9e92bacd3e43d83413734bb0e8"}, + {file = "nbclient-0.10.0-py3-none-any.whl", hash = "sha256:f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f"}, + {file = "nbclient-0.10.0.tar.gz", hash = "sha256:4b3f1b7dba531e498449c4db4f53da339c91d449dc11e9af3a43b4eb5c5abb09"}, ] [package.dependencies] -jupyter-client = ">=6.1.5" -nbformat = ">=5.0" -nest-asyncio = "*" -traitlets = ">=5.2.2" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +nbformat = ">=5.1" +traitlets = ">=5.4" [package.extras] -sphinx = ["Sphinx (>=1.7)", "autodoc-traits", "mock", "moto", "myst-parser", "sphinx-book-theme"] -test = ["black", "check-manifest", "flake8", "ipykernel", "ipython", "ipywidgets", "mypy", "nbconvert", "pip (>=18.1)", "pre-commit", "pytest (>=4.1)", "pytest-asyncio", "pytest-cov (>=2.6.1)", "setuptools (>=60.0)", "testpath", "twine (>=1.11.0)", "xmltodict"] +dev = ["pre-commit"] +docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"] +test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] [[package]] name = "nbconvert" -version = "7.7.2" -description = "Converting Jupyter Notebooks" +version = "7.16.3" +description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." optional = false python-versions = ">=3.8" files = [ - {file = "nbconvert-7.7.2-py3-none-any.whl", hash = "sha256:25e0cf2b663ee0cd5a90afb6b2f2940bf1abe5cc5bc995b88c8156ca65fa7ede"}, - {file = "nbconvert-7.7.2.tar.gz", hash = "sha256:36d3e7bf32f0c075878176cdeeb645931c994cbed5b747bc7a570ba8cd2321f3"}, + {file = "nbconvert-7.16.3-py3-none-any.whl", hash = "sha256:ddeff14beeeedf3dd0bc506623e41e4507e551736de59df69a91f86700292b3b"}, + {file = "nbconvert-7.16.3.tar.gz", hash = "sha256:a6733b78ce3d47c3f85e504998495b07e6ea9cf9bf6ec1c98dda63ec6ad19142"}, ] [package.dependencies] @@ -4731,24 +4865,24 @@ docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sp qtpdf = ["nbconvert[qtpng]"] qtpng = ["pyqtwebengine (>=5.15)"] serve = ["tornado (>=6.1)"] -test = ["flaky", "ipykernel", "ipywidgets (>=7)", "pre-commit", "pytest", "pytest-dependency"] +test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest (>=7)"] webpdf = ["playwright"] [[package]] name = "nbformat" -version = "5.9.1" +version = "5.10.4" description = "The Jupyter Notebook format" optional = false python-versions = ">=3.8" files = [ - {file = "nbformat-5.9.1-py3-none-any.whl", hash = "sha256:b7968ebf4811178a4108ee837eae1442e3f054132100f0359219e9ed1ce3ca45"}, - {file = "nbformat-5.9.1.tar.gz", hash = "sha256:3a7f52d040639cbd8a3890218c8b0ffb93211588c57446c90095e32ba5881b5d"}, + {file = "nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b"}, + {file = "nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a"}, ] [package.dependencies] -fastjsonschema = "*" +fastjsonschema = ">=2.15" jsonschema = ">=2.6" -jupyter-core = "*" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" traitlets = ">=5.1" [package.extras] @@ -4757,32 +4891,32 @@ test = ["pep440", "pre-commit", "pytest", "testpath"] [[package]] name = "nbmake" -version = "1.4.1" +version = "1.1" description = "Pytest plugin for testing notebooks" optional = false -python-versions = ">=3.7.0,<4.0.0" +python-versions = ">=3.6.1,<4.0.0" files = [ - {file = "nbmake-1.4.1-py3-none-any.whl", hash = "sha256:1c1619fc54a2fb64bfd84acbdf13b2ffba0e4a03bfea1684f4648f28ca850ada"}, - {file = "nbmake-1.4.1.tar.gz", hash = "sha256:7f602ba5195e80e4f2527944bb06d3b4df0d1520e73ba66126b51132b1f646ea"}, + {file = "nbmake-1.1-py3-none-any.whl", hash = "sha256:04603dd8b7894830f7079b317bc81df29b15ddd0db014279c58145b6fce80d7a"}, + {file = "nbmake-1.1.tar.gz", hash = "sha256:d59158797cecb7d7b248a061854fbd7fa0bdd9ff2c19b0d0bae8ee2ca90ffd13"}, ] [package.dependencies] ipykernel = ">=5.4.0" -nbclient = ">=0.6.6,<0.7.0" +nbclient = ">=0.3,<1.0" nbformat = ">=5.0.8,<6.0.0" pydantic = ">=1.7.2,<2.0.0" Pygments = ">=2.7.3,<3.0.0" -pytest = ">=6.1.0" +pytest = ">=6.1.0,<7.0.0" [[package]] name = "nest-asyncio" -version = "1.5.6" +version = "1.6.0" description = "Patch asyncio to allow nested event loops" optional = false python-versions = ">=3.5" files = [ - {file = "nest_asyncio-1.5.6-py3-none-any.whl", hash = "sha256:b9a953fb40dceaa587d109609098db21900182b16440652454a146cffb06e8b8"}, - {file = "nest_asyncio-1.5.6.tar.gz", hash = "sha256:d267cc1ff794403f7df692964d1d2a3fa9418ffea2a3f6859a439ff482fef290"}, + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, ] [[package]] @@ -4821,13 +4955,13 @@ pandas = ">=1.1" [[package]] name = "nixtlats" -version = "0.1.11" -description = "Nixtla SDK" +version = "0.1.21" +description = "TimeGPT SDK" optional = false python-versions = ">=3.7" files = [ - {file = "nixtlats-0.1.11-py3-none-any.whl", hash = "sha256:f2ddda8e23aa58e7f771892186176b687d2302e445ff762dcf699d1cea06b75d"}, - {file = "nixtlats-0.1.11.tar.gz", hash = "sha256:778c340fddf02f3b6a11bd69ccd797a83fab1c67177b85f11bc61ceb6c41f1c3"}, + {file = "nixtlats-0.1.21-py3-none-any.whl", hash = "sha256:9706dad5b1d9b2706df0f2f0fcd6144235bdcb96826691c6e91ecf3ac182a13a"}, + {file = "nixtlats-0.1.21.tar.gz", hash = "sha256:f15a657bc5314bb794e816bf4ba76fd7b09ced4d0a95ecf9ea7041d4b48cba58"}, ] [package.dependencies] @@ -4835,9 +4969,14 @@ httpx = "*" pandas = "*" pydantic = "<2" requests = "*" +tenacity = "*" +utilsforecast = ">=0.0.13" [package.extras] -dev = ["black", "nbdev", "openbb", "plotly", "python-dotenv", "statsforecast"] +date-extras = ["holidays"] +dev = ["black", "dask", "fugue[ray] (>=0.8.7)", "holidays", "nbdev", "plotly", "pyspark", "python-dotenv", "ray[serve-grpc]", "statsforecast", "utilsforecast[plotting] (>=0.0.5)"] +distributed = ["dask", "fugue[ray] (>=0.8.7)", "pyspark", "ray[serve-grpc]"] +plotting = ["utilsforecast[plotting] (>=0.0.5)"] [[package]] name = "nltk" @@ -4880,13 +5019,13 @@ setuptools = "*" [[package]] name = "notebook" -version = "6.5.4" +version = "6.5.6" description = "A web-based notebook environment for interactive computing" optional = false python-versions = ">=3.7" files = [ - {file = "notebook-6.5.4-py3-none-any.whl", hash = "sha256:dd17e78aefe64c768737b32bf171c1c766666a21cc79a44d37a1700771cab56f"}, - {file = "notebook-6.5.4.tar.gz", hash = "sha256:517209568bd47261e2def27a140e97d49070602eea0d226a696f42a7f16c9a4e"}, + {file = "notebook-6.5.6-py3-none-any.whl", hash = "sha256:c1e2eb2e3b6079a0552a04974883a48d04c3c05792170d64a4b23d707d453181"}, + {file = "notebook-6.5.6.tar.gz", hash = "sha256:b4625a4b7a597839dd3156b140d5ba2c7123761f98245a3290f67a8b8ee048d9"}, ] [package.dependencies] @@ -4894,14 +5033,14 @@ argon2-cffi = "*" ipykernel = "*" ipython-genutils = "*" jinja2 = "*" -jupyter-client = ">=5.3.4" +jupyter-client = ">=5.3.4,<8" jupyter-core = ">=4.6.1" nbclassic = ">=0.4.7" nbconvert = ">=5" nbformat = "*" nest-asyncio = ">=1.5" prometheus-client = "*" -pyzmq = ">=17" +pyzmq = ">=17,<25" Send2Trash = ">=1.8.0" terminado = ">=0.8.3" tornado = ">=6.1" @@ -4914,13 +5053,13 @@ test = ["coverage", "nbval", "pytest", "pytest-cov", "requests", "requests-unixs [[package]] name = "notebook-shim" -version = "0.2.3" +version = "0.2.4" description = "A shim layer for notebook traits and config" optional = false python-versions = ">=3.7" files = [ - {file = "notebook_shim-0.2.3-py3-none-any.whl", hash = "sha256:a83496a43341c1674b093bfcebf0fe8e74cbe7eda5fd2bbc56f8e39e1486c0c7"}, - {file = "notebook_shim-0.2.3.tar.gz", hash = "sha256:f69388ac283ae008cd506dda10d0288b09a017d822d5e8c7129a152cbd3ce7e9"}, + {file = "notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef"}, + {file = "notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb"}, ] [package.dependencies] @@ -4931,41 +5070,38 @@ test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync" [[package]] name = "numba" -version = "0.57.1" +version = "0.58.1" description = "compiling Python code using LLVM" optional = true python-versions = ">=3.8" files = [ - {file = "numba-0.57.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:db8268eb5093cae2288942a8cbd69c9352f6fe6e0bfa0a9a27679436f92e4248"}, - {file = "numba-0.57.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:643cb09a9ba9e1bd8b060e910aeca455e9442361e80fce97690795ff9840e681"}, - {file = "numba-0.57.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:53e9fab973d9e82c9f8449f75994a898daaaf821d84f06fbb0b9de2293dd9306"}, - {file = "numba-0.57.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c0602e4f896e6a6d844517c3ab434bc978e7698a22a733cc8124465898c28fa8"}, - {file = "numba-0.57.1-cp310-cp310-win32.whl", hash = "sha256:3d6483c27520d16cf5d122868b79cad79e48056ecb721b52d70c126bed65431e"}, - {file = "numba-0.57.1-cp310-cp310-win_amd64.whl", hash = "sha256:a32ee263649aa3c3587b833d6311305379529570e6c20deb0c6f4fb5bc7020db"}, - {file = "numba-0.57.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c078f84b5529a7fdb8413bb33d5100f11ec7b44aa705857d9eb4e54a54ff505"}, - {file = "numba-0.57.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e447c4634d1cc99ab50d4faa68f680f1d88b06a2a05acf134aa6fcc0342adeca"}, - {file = "numba-0.57.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4838edef2df5f056cb8974670f3d66562e751040c448eb0b67c7e2fec1726649"}, - {file = "numba-0.57.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9b17fbe4a69dcd9a7cd49916b6463cd9a82af5f84911feeb40793b8bce00dfa7"}, - {file = "numba-0.57.1-cp311-cp311-win_amd64.whl", hash = "sha256:93df62304ada9b351818ba19b1cfbddaf72cd89348e81474326ca0b23bf0bae1"}, - {file = "numba-0.57.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8e00ca63c5d0ad2beeb78d77f087b3a88c45ea9b97e7622ab2ec411a868420ee"}, - {file = "numba-0.57.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ff66d5b022af6c7d81ddbefa87768e78ed4f834ab2da6ca2fd0d60a9e69b94f5"}, - {file = "numba-0.57.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:60ec56386076e9eed106a87c96626d5686fbb16293b9834f0849cf78c9491779"}, - {file = "numba-0.57.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6c057ccedca95df23802b6ccad86bb318be624af45b5a38bb8412882be57a681"}, - {file = "numba-0.57.1-cp38-cp38-win32.whl", hash = "sha256:5a82bf37444039c732485c072fda21a361790ed990f88db57fd6941cd5e5d307"}, - {file = "numba-0.57.1-cp38-cp38-win_amd64.whl", hash = "sha256:9bcc36478773ce838f38afd9a4dfafc328d4ffb1915381353d657da7f6473282"}, - {file = "numba-0.57.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ae50c8c90c2ce8057f9618b589223e13faa8cbc037d8f15b4aad95a2c33a0582"}, - {file = "numba-0.57.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9a1b2b69448e510d672ff9a6b18d2db9355241d93c6a77677baa14bec67dc2a0"}, - {file = "numba-0.57.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3cf78d74ad9d289fbc1e5b1c9f2680fca7a788311eb620581893ab347ec37a7e"}, - {file = "numba-0.57.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f47dd214adc5dcd040fe9ad2adbd2192133c9075d2189ce1b3d5f9d72863ef05"}, - {file = "numba-0.57.1-cp39-cp39-win32.whl", hash = "sha256:a3eac19529956185677acb7f01864919761bfffbb9ae04bbbe5e84bbc06cfc2b"}, - {file = "numba-0.57.1-cp39-cp39-win_amd64.whl", hash = "sha256:9587ba1bf5f3035575e45562ada17737535c6d612df751e811d702693a72d95e"}, - {file = "numba-0.57.1.tar.gz", hash = "sha256:33c0500170d213e66d90558ad6aca57d3e03e97bb11da82e6d87ab793648cb17"}, + {file = "numba-0.58.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:07f2fa7e7144aa6f275f27260e73ce0d808d3c62b30cff8906ad1dec12d87bbe"}, + {file = "numba-0.58.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7bf1ddd4f7b9c2306de0384bf3854cac3edd7b4d8dffae2ec1b925e4c436233f"}, + {file = "numba-0.58.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bc2d904d0319d7a5857bd65062340bed627f5bfe9ae4a495aef342f072880d50"}, + {file = "numba-0.58.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4e79b6cc0d2bf064a955934a2e02bf676bc7995ab2db929dbbc62e4c16551be6"}, + {file = "numba-0.58.1-cp310-cp310-win_amd64.whl", hash = "sha256:81fe5b51532478149b5081311b0fd4206959174e660c372b94ed5364cfb37c82"}, + {file = "numba-0.58.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:bcecd3fb9df36554b342140a4d77d938a549be635d64caf8bd9ef6c47a47f8aa"}, + {file = "numba-0.58.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a1eaa744f518bbd60e1f7ccddfb8002b3d06bd865b94a5d7eac25028efe0e0ff"}, + {file = "numba-0.58.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bf68df9c307fb0aa81cacd33faccd6e419496fdc621e83f1efce35cdc5e79cac"}, + {file = "numba-0.58.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:55a01e1881120e86d54efdff1be08381886fe9f04fc3006af309c602a72bc44d"}, + {file = "numba-0.58.1-cp311-cp311-win_amd64.whl", hash = "sha256:811305d5dc40ae43c3ace5b192c670c358a89a4d2ae4f86d1665003798ea7a1a"}, + {file = "numba-0.58.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ea5bfcf7d641d351c6a80e8e1826eb4a145d619870016eeaf20bbd71ef5caa22"}, + {file = "numba-0.58.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e63d6aacaae1ba4ef3695f1c2122b30fa3d8ba039c8f517784668075856d79e2"}, + {file = "numba-0.58.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6fe7a9d8e3bd996fbe5eac0683227ccef26cba98dae6e5cee2c1894d4b9f16c1"}, + {file = "numba-0.58.1-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:898af055b03f09d33a587e9425500e5be84fc90cd2f80b3fb71c6a4a17a7e354"}, + {file = "numba-0.58.1-cp38-cp38-win_amd64.whl", hash = "sha256:d3e2fe81fe9a59fcd99cc572002101119059d64d31eb6324995ee8b0f144a306"}, + {file = "numba-0.58.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c765aef472a9406a97ea9782116335ad4f9ef5c9f93fc05fd44aab0db486954"}, + {file = "numba-0.58.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e9356e943617f5e35a74bf56ff6e7cc83e6b1865d5e13cee535d79bf2cae954"}, + {file = "numba-0.58.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:240e7a1ae80eb6b14061dc91263b99dc8d6af9ea45d310751b780888097c1aaa"}, + {file = "numba-0.58.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:45698b995914003f890ad839cfc909eeb9c74921849c712a05405d1a79c50f68"}, + {file = "numba-0.58.1-cp39-cp39-win_amd64.whl", hash = "sha256:bd3dda77955be03ff366eebbfdb39919ce7c2620d86c906203bed92124989032"}, + {file = "numba-0.58.1.tar.gz", hash = "sha256:487ded0633efccd9ca3a46364b40006dbdaca0f95e99b8b83e778d1195ebcbaa"}, ] [package.dependencies] importlib-metadata = {version = "*", markers = "python_version < \"3.9\""} -llvmlite = "==0.40.*" -numpy = ">=1.21,<1.25" +llvmlite = "==0.41.*" +numpy = ">=1.22,<1.27" [[package]] name = "numpy" @@ -5055,114 +5191,58 @@ files = [ [package.dependencies] et-xmlfile = "*" -[[package]] -name = "orjson" -version = "3.9.2" -description = "Fast, correct Python JSON library supporting dataclasses, datetimes, and numpy" -optional = true -python-versions = ">=3.7" -files = [ - {file = "orjson-3.9.2-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:7323e4ca8322b1ecb87562f1ec2491831c086d9faa9a6c6503f489dadbed37d7"}, - {file = "orjson-3.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1272688ea1865f711b01ba479dea2d53e037ea00892fd04196b5875f7021d9d3"}, - {file = "orjson-3.9.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0b9a26f1d1427a9101a1e8910f2e2df1f44d3d18ad5480ba031b15d5c1cb282e"}, - {file = "orjson-3.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6a5ca55b0d8f25f18b471e34abaee4b175924b6cd62f59992945b25963443141"}, - {file = "orjson-3.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:877872db2c0f41fbe21f852ff642ca842a43bc34895b70f71c9d575df31fffb4"}, - {file = "orjson-3.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a39c2529d75373b7167bf84c814ef9b8f3737a339c225ed6c0df40736df8748"}, - {file = "orjson-3.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:84ebd6fdf138eb0eb4280045442331ee71c0aab5e16397ba6645f32f911bfb37"}, - {file = "orjson-3.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5a60a1cfcfe310547a1946506dd4f1ed0a7d5bd5b02c8697d9d5dcd8d2e9245e"}, - {file = "orjson-3.9.2-cp310-none-win32.whl", hash = "sha256:2ae61f5d544030a6379dbc23405df66fea0777c48a0216d2d83d3e08b69eb676"}, - {file = "orjson-3.9.2-cp310-none-win_amd64.whl", hash = "sha256:c290c4f81e8fd0c1683638802c11610b2f722b540f8e5e858b6914b495cf90c8"}, - {file = "orjson-3.9.2-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:02ef014f9a605e84b675060785e37ec9c0d2347a04f1307a9d6840ab8ecd6f55"}, - {file = "orjson-3.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:992af54265ada1c1579500d6594ed73fe333e726de70d64919cf37f93defdd06"}, - {file = "orjson-3.9.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a40958f7af7c6d992ee67b2da4098dca8b770fc3b4b3834d540477788bfa76d3"}, - {file = "orjson-3.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:93864dec3e3dd058a2dbe488d11ac0345214a6a12697f53a63e34de7d28d4257"}, - {file = "orjson-3.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16fdf5a82df80c544c3c91516ab3882cd1ac4f1f84eefeafa642e05cef5f6699"}, - {file = "orjson-3.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:275b5a18fd9ed60b2720543d3ddac170051c43d680e47d04ff5203d2c6d8ebf1"}, - {file = "orjson-3.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b9aea6dcb99fcbc9f6d1dd84fca92322fda261da7fb014514bb4689c7c2097a8"}, - {file = "orjson-3.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:7d74ae0e101d17c22ef67b741ba356ab896fc0fa64b301c2bf2bb0a4d874b190"}, - {file = "orjson-3.9.2-cp311-none-win32.whl", hash = "sha256:a9a7d618f99b2d67365f2b3a588686195cb6e16666cd5471da603a01315c17cc"}, - {file = "orjson-3.9.2-cp311-none-win_amd64.whl", hash = "sha256:6320b28e7bdb58c3a3a5efffe04b9edad3318d82409e84670a9b24e8035a249d"}, - {file = "orjson-3.9.2-cp37-cp37m-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:368e9cc91ecb7ac21f2aa475e1901204110cf3e714e98649c2502227d248f947"}, - {file = "orjson-3.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58e9e70f0dcd6a802c35887f306b555ff7a214840aad7de24901fc8bd9cf5dde"}, - {file = "orjson-3.9.2-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:00c983896c2e01c94c0ef72fd7373b2aa06d0c0eed0342c4884559f812a6835b"}, - {file = "orjson-3.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ee743e8890b16c87a2f89733f983370672272b61ee77429c0a5899b2c98c1a7"}, - {file = "orjson-3.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7b065942d362aad4818ff599d2f104c35a565c2cbcbab8c09ec49edba91da75"}, - {file = "orjson-3.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e46e9c5b404bb9e41d5555762fd410d5466b7eb1ec170ad1b1609cbebe71df21"}, - {file = "orjson-3.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:8170157288714678ffd64f5de33039e1164a73fd8b6be40a8a273f80093f5c4f"}, - {file = "orjson-3.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e3e2f087161947dafe8319ea2cfcb9cea4bb9d2172ecc60ac3c9738f72ef2909"}, - {file = "orjson-3.9.2-cp37-none-win32.whl", hash = "sha256:373b7b2ad11975d143556fdbd2c27e1150b535d2c07e0b48dc434211ce557fe6"}, - {file = "orjson-3.9.2-cp37-none-win_amd64.whl", hash = "sha256:d7de3dbbe74109ae598692113cec327fd30c5a30ebca819b21dfa4052f7b08ef"}, - {file = "orjson-3.9.2-cp38-cp38-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:8cd4385c59bbc1433cad4a80aca65d2d9039646a9c57f8084897549b55913b17"}, - {file = "orjson-3.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a74036aab1a80c361039290cdbc51aa7adc7ea13f56e5ef94e9be536abd227bd"}, - {file = "orjson-3.9.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1aaa46d7d4ae55335f635eadc9be0bd9bcf742e6757209fc6dc697e390010adc"}, - {file = "orjson-3.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e52c67ed6bb368083aa2078ea3ccbd9721920b93d4b06c43eb4e20c4c860046"}, - {file = "orjson-3.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1a6cdfcf9c7dd4026b2b01fdff56986251dc0cc1e980c690c79eec3ae07b36e7"}, - {file = "orjson-3.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1882a70bb69595b9ec5aac0040a819e94d2833fe54901e2b32f5e734bc259a8b"}, - {file = "orjson-3.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:fc05e060d452145ab3c0b5420769e7356050ea311fc03cb9d79c481982917cca"}, - {file = "orjson-3.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f8bc2c40d9bb26efefb10949d261a47ca196772c308babc538dd9f4b73e8d386"}, - {file = "orjson-3.9.2-cp38-none-win32.whl", hash = "sha256:302d80198d8d5b658065627da3a356cbe5efa082b89b303f162f030c622e0a17"}, - {file = "orjson-3.9.2-cp38-none-win_amd64.whl", hash = "sha256:3164fc20a585ec30a9aff33ad5de3b20ce85702b2b2a456852c413e3f0d7ab09"}, - {file = "orjson-3.9.2-cp39-cp39-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:7a6ccadf788531595ed4728aa746bc271955448d2460ff0ef8e21eb3f2a281ba"}, - {file = "orjson-3.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3245d230370f571c945f69aab823c279a868dc877352817e22e551de155cb06c"}, - {file = "orjson-3.9.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:205925b179550a4ee39b8418dd4c94ad6b777d165d7d22614771c771d44f57bd"}, - {file = "orjson-3.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0325fe2d69512187761f7368c8cda1959bcb75fc56b8e7a884e9569112320e57"}, - {file = "orjson-3.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:806704cd58708acc66a064a9a58e3be25cf1c3f9f159e8757bd3f515bfabdfa1"}, - {file = "orjson-3.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03fb36f187a0c19ff38f6289418863df8b9b7880cdbe279e920bef3a09d8dab1"}, - {file = "orjson-3.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:20925d07a97c49c6305bff1635318d9fc1804aa4ccacb5fb0deb8a910e57d97a"}, - {file = "orjson-3.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:eebfed53bec5674e981ebe8ed2cf00b3f7bcda62d634733ff779c264307ea505"}, - {file = "orjson-3.9.2-cp39-none-win32.whl", hash = "sha256:ba60f09d735f16593950c6adf033fbb526faa94d776925579a87b777db7d0838"}, - {file = "orjson-3.9.2-cp39-none-win_amd64.whl", hash = "sha256:869b961df5fcedf6c79f4096119b35679b63272362e9b745e668f0391a892d39"}, - {file = "orjson-3.9.2.tar.gz", hash = "sha256:24257c8f641979bf25ecd3e27251b5cc194cdd3a6e96004aac8446f5e63d9664"}, -] - [[package]] name = "osqp" -version = "0.6.3" +version = "0.6.5" description = "OSQP: The Operator Splitting QP Solver" optional = true python-versions = "*" files = [ - {file = "osqp-0.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6b7d923c836f1d07115057e595245ccc1694ecae730a1affda78fc6f3c8d239"}, - {file = "osqp-0.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dfda08c38c3521012740a73ef782f97dfc54a41deae4b0bc4afd18d0e74da0"}, - {file = "osqp-0.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7eafa3f3e82dd36c52f3f4ef19a95142405c807c272c4b53c5971c53535d7804"}, - {file = "osqp-0.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:3cbb6efdaffb7387dc0037dfe3259d4803e5ad7217e6f20fb605c92953214b9d"}, - {file = "osqp-0.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1b2049b2c42565dcaa63ddca1c4028b1fb20aab141453f5d77e8ff5b1a99a2cf"}, - {file = "osqp-0.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:146b89f2cfbf59eaeb2c47e3a312f2034138df78d80ce052364810dc0ef70fc4"}, - {file = "osqp-0.6.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0084e3d733c75687d68bc133bc380ce471dfe6f7724af2718a43491782eec8d6"}, - {file = "osqp-0.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:1b573fe1cd0e82239a279c58817c1d365187ef862e928b2b9c828c3c516ad3c2"}, - {file = "osqp-0.6.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c3951ef505177b858c6cd34de980346014cae3d2234c93db960b12c5885f9a2"}, - {file = "osqp-0.6.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc18f87c9549032c163ce590a5e32079df94ee656c8fb357ba607aa9d78fab81"}, - {file = "osqp-0.6.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c07b1a4b538aab629b0fae69f644b7e76f81f94d65230014d482e296dacd046b"}, - {file = "osqp-0.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:60abec3593870990b16f00bd5017096a7091fb00b68d0db3383fc048ca8e55c9"}, - {file = "osqp-0.6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b73bdd9589901841af83c5ed6a4092b4fac5a0beff9e32682d8526d1f16a728c"}, - {file = "osqp-0.6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71d9f611823af4a8b241c86805920e5382cd65c7f94fd3615b4eef999ed94c7c"}, - {file = "osqp-0.6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30fbc3b3c028c06a6c5f1e66be7b7106ad48a29e0dc5bd82393f82dd68235ef8"}, - {file = "osqp-0.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fe57e4bde071b388518ecb068f26319506dd9cb107363d3d80c12d2e59fc1e81"}, - {file = "osqp-0.6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:41f304d1d7f91af07d8f0b01e5af29ec3bb8824f0102c7fd8b13b497be120da4"}, - {file = "osqp-0.6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea7d8c92bcdf4fef98d777f13d39060d425ef2e8778ed487c96a6fa10848cdea"}, - {file = "osqp-0.6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f3a3c6d2708868e5e3fe2da300d6523cbf68a3d8734ce9c5043db37391969f5"}, - {file = "osqp-0.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:1c548a0b3691850e7e22f3624a128d8af33416d70a9b5976a47d4d832028dcd8"}, - {file = "osqp-0.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:387e7abd737dfe32c9ec00ad74af25328cdd0d0f634d79530655c040a5cb9590"}, - {file = "osqp-0.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1445e10a94e01698e13c87a7debf6ac1a15f3acd1f8f6340cb1ad945db4732b"}, - {file = "osqp-0.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0441c10f7fe5f46692a9b44a57138977bb112ae3f8127151671968c5d9ec5dbb"}, - {file = "osqp-0.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:b15e65a307fbbabf60248bb9bc204e61d5d4ae64e00427a69e2dad9622f4c29d"}, - {file = "osqp-0.6.3.tar.gz", hash = "sha256:03e460e683ec2ce0f839353ddfa3c4c8ffa509ab8cf6a2b2afbb586fa453e180"}, + {file = "osqp-0.6.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e8024dba07281111af39e71bff6449fb22a37bf3358aa0c7fd1daa6bca692c99"}, + {file = "osqp-0.6.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a68e247f2bbb53e87f1c1ca80ff3fc86b781f771d6da2a2ecd2f6e7492c802f3"}, + {file = "osqp-0.6.5-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e81e299637eb2342e30eb2df0ec45dc243683af0a71676c9b45b9337bb05da97"}, + {file = "osqp-0.6.5-cp310-cp310-win_amd64.whl", hash = "sha256:42425632927d983cbe935067783b944ebd4959e9eb6611da8401007b66a0c841"}, + {file = "osqp-0.6.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a7b180db09be1c3e3cb4109396b894f481ca9c6e160a530acd71f1769610f96c"}, + {file = "osqp-0.6.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:648f4beff10c16620f3b95e86dee702052d587b847ddbd5d8f71ad39ac36db3a"}, + {file = "osqp-0.6.5-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7649d56d775662e0a5d1665ed220d585f904d14a49cc6931bf27725bb9c4b2e0"}, + {file = "osqp-0.6.5-cp311-cp311-win_amd64.whl", hash = "sha256:b033b7aec973a655cfec4558e0c4fc92ee9f914bcb0a669e0156398d8ddbef8f"}, + {file = "osqp-0.6.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5c344619465e625aac6d13812d442dd31d4a9ab243e39abb5938c3f6116409b0"}, + {file = "osqp-0.6.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:000ad48aa071ecc4c75ebc39d1291752fe3a9937a30d00fff5dc61663ec67eeb"}, + {file = "osqp-0.6.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a36a40df69db5195fba613341663db2c7dcf977eb75b9578a8fd7682bbe02324"}, + {file = "osqp-0.6.5-cp312-cp312-win_amd64.whl", hash = "sha256:3d8212db7c55af1961ccce4a32fd382bfe34e2198664ea3f81cc47eef8d0f288"}, + {file = "osqp-0.6.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ca7d80c0767b1350cd74e4f1446ec51661152690d38b1382ceccdfccd757afce"}, + {file = "osqp-0.6.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b15e2b96d4d9b2eff37a05405372c69cf17ada3d1e42c5e28cbdbd053189ab5"}, + {file = "osqp-0.6.5-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a41600e34ece7156606fd3620987fdf224b0a35c857540cb5bf45072f5c022b"}, + {file = "osqp-0.6.5-cp36-cp36m-win_amd64.whl", hash = "sha256:8c38574b35a3ddfb794aafee9bc5a74635160b9fc52bbc89ae6164fe207556de"}, + {file = "osqp-0.6.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d06f614e3be1b1f3cd68569b2dc3628c2fdef1e7c4b992672fe05efb1add9801"}, + {file = "osqp-0.6.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25a6b995e0a022bd1c33d20d8846d9a068df89cec288b905b5cdfdb98a2ffae8"}, + {file = "osqp-0.6.5-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:09de9b53e7513ee4ade3024ce9f36ef993d916118d0927cce740d086882ea92c"}, + {file = "osqp-0.6.5-cp37-cp37m-win_amd64.whl", hash = "sha256:1f80f85d515ef29b90fb34f137857e75d4fcf21a715d644f54d2cf9494567fab"}, + {file = "osqp-0.6.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:de9b9e96001e8f0b2e474106ac75e220fd9279e1635b107b836a6035795e8d07"}, + {file = "osqp-0.6.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fe545d7a87a46cfc57dfb9f0aa2788d2f29e0c71dc1ac57e92f9c9d93064753"}, + {file = "osqp-0.6.5-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49ab020b5fd7abb5da99e01e47bf81f817ba1df6895e3d3ba4893722cc24d9b6"}, + {file = "osqp-0.6.5-cp38-cp38-win_amd64.whl", hash = "sha256:5d1b5ed6fc4faea94117a0abe140fefe980449b29d3907bd2e6ec1c18eca3d43"}, + {file = "osqp-0.6.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dca127b7a333ce53fb430fc441b2e0aee2df619693d967277a8f8fd095e95007"}, + {file = "osqp-0.6.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ec902844defedf7c5a5ed482b93286d1735a65b71bb27c93e18c929f313c93d"}, + {file = "osqp-0.6.5-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f25a9e1e8f1db38094dc7ee544e603e31fe7bf1b2a3fc75c78c1d39a727e2540"}, + {file = "osqp-0.6.5-cp39-cp39-win_amd64.whl", hash = "sha256:6dce90d8c4ad551489a452573ea819e089e1e1c3b23bbd8f155bb6059ce8ef36"}, + {file = "osqp-0.6.5.tar.gz", hash = "sha256:b2810aee7be2373add8b6c0be5ad99b810288774abca421751cb032d6a5aedef"}, ] [package.dependencies] numpy = ">=1.7" qdldl = "*" -scipy = ">=0.13.2" +scipy = ">=0.13.2,<1.12.0" [[package]] name = "packaging" -version = "23.1" +version = "24.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, ] [[package]] @@ -5264,13 +5344,13 @@ test = ["ta-lib"] [[package]] name = "pandocfilters" -version = "1.5.0" +version = "1.5.1" description = "Utilities for writing pandoc filters in python" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ - {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, - {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, + {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, + {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, ] [[package]] @@ -5308,39 +5388,39 @@ test = ["attrs (>=17.4.0)", "azure-datalake-store (>=0.0.30)", "azure-storage-bl [[package]] name = "parso" -version = "0.8.3" +version = "0.8.4" description = "A Python Parser" optional = false python-versions = ">=3.6" files = [ - {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, - {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, ] [package.extras] -qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] -testing = ["docopt", "pytest (<6.0.0)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] [[package]] name = "pathspec" -version = "0.11.1" +version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, - {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, ] [[package]] name = "patsy" -version = "0.5.3" +version = "0.5.6" description = "A Python package for describing statistical models and for building design matrices." optional = false python-versions = "*" files = [ - {file = "patsy-0.5.3-py2.py3-none-any.whl", hash = "sha256:7eb5349754ed6aa982af81f636479b1b8db9d5b1a6e957a6016ec0534b5c86b7"}, - {file = "patsy-0.5.3.tar.gz", hash = "sha256:bdc18001875e319bc91c812c1eb6a10be4bb13cb81eb763f466179dca3b67277"}, + {file = "patsy-0.5.6-py2.py3-none-any.whl", hash = "sha256:19056886fd8fa71863fa32f0eb090267f21fb74be00f19f5c70b2e9d76c883c6"}, + {file = "patsy-0.5.6.tar.gz", hash = "sha256:95c6d47a7222535f84bff7f63d7303f2e297747a598db89cf5c67f0c0c7d2cdb"}, ] [package.dependencies] @@ -5352,23 +5432,23 @@ test = ["pytest", "pytest-cov", "scipy"] [[package]] name = "pbr" -version = "5.11.1" +version = "6.0.0" description = "Python Build Reasonableness" optional = false python-versions = ">=2.6" files = [ - {file = "pbr-5.11.1-py2.py3-none-any.whl", hash = "sha256:567f09558bae2b3ab53cb3c1e2e33e726ff3338e7bae3db5dc954b3a44eef12b"}, - {file = "pbr-5.11.1.tar.gz", hash = "sha256:aefc51675b0b533d56bb5fd1c8c6c0522fe31896679882e1c4c63d5e4a0fccb3"}, + {file = "pbr-6.0.0-py2.py3-none-any.whl", hash = "sha256:4a7317d5e3b17a3dccb6a8cfe67dab65b20551404c52c8ed41279fa4f0cb4cda"}, + {file = "pbr-6.0.0.tar.gz", hash = "sha256:d1377122a5a00e2f940ee482999518efe16d745d423a670c27773dfbc3c9a7d9"}, ] [[package]] name = "peewee" -version = "3.17.1" +version = "3.17.3" description = "a little orm" optional = false python-versions = "*" files = [ - {file = "peewee-3.17.1.tar.gz", hash = "sha256:e009ac4227c4fdc0058a56e822ad5987684f0a1fbb20fed577200785102581c3"}, + {file = "peewee-3.17.3.tar.gz", hash = "sha256:ef15f90b628e41a584be8306cdc3243c51f73ce88b06154d9572f6d0284a0169"}, ] [[package]] @@ -5384,13 +5464,13 @@ files = [ [[package]] name = "pexpect" -version = "4.8.0" +version = "4.9.0" description = "Pexpect allows easy control of interactive console applications." optional = false python-versions = "*" files = [ - {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, - {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, ] [package.dependencies] @@ -5409,82 +5489,89 @@ files = [ [[package]] name = "pillow" -version = "9.5.0" +version = "10.3.0" description = "Python Imaging Library (Fork)" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "Pillow-9.5.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16"}, - {file = "Pillow-9.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5"}, - {file = "Pillow-9.5.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903"}, - {file = "Pillow-9.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a"}, - {file = "Pillow-9.5.0-cp310-cp310-win32.whl", hash = "sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44"}, - {file = "Pillow-9.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32"}, - {file = "Pillow-9.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99"}, - {file = "Pillow-9.5.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"}, - {file = "Pillow-9.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296"}, - {file = "Pillow-9.5.0-cp311-cp311-win32.whl", hash = "sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec"}, - {file = "Pillow-9.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4"}, - {file = "Pillow-9.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089"}, - {file = "Pillow-9.5.0-cp312-cp312-win32.whl", hash = "sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb"}, - {file = "Pillow-9.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b"}, - {file = "Pillow-9.5.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392"}, - {file = "Pillow-9.5.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47"}, - {file = "Pillow-9.5.0-cp37-cp37m-win32.whl", hash = "sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7"}, - {file = "Pillow-9.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597"}, - {file = "Pillow-9.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf"}, - {file = "Pillow-9.5.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96"}, - {file = "Pillow-9.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f"}, - {file = "Pillow-9.5.0-cp38-cp38-win32.whl", hash = "sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc"}, - {file = "Pillow-9.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66"}, - {file = "Pillow-9.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705"}, - {file = "Pillow-9.5.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a"}, - {file = "Pillow-9.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865"}, - {file = "Pillow-9.5.0-cp39-cp39-win32.whl", hash = "sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964"}, - {file = "Pillow-9.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-macosx_10_10_x86_64.whl", hash = "sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829"}, - {file = "Pillow-9.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7"}, - {file = "Pillow-9.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799"}, - {file = "Pillow-9.5.0.tar.gz", hash = "sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, + {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78618cdbccaa74d3f88d0ad6cb8ac3007f1a6fa5c6f19af64b55ca170bfa1edf"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261ddb7ca91fcf71757979534fb4c128448b5b4c55cb6152d280312062f69599"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:ce49c67f4ea0609933d01c0731b34b8695a7a748d6c8d186f95e7d085d2fe475"}, + {file = "pillow-10.3.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:b14f16f94cbc61215115b9b1236f9c18403c15dd3c52cf629072afa9d54c1cbf"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d33891be6df59d93df4d846640f0e46f1a807339f09e79a8040bc887bdcd7ed3"}, + {file = "pillow-10.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b50811d664d392f02f7761621303eba9d1b056fb1868c8cdf4231279645c25f5"}, + {file = "pillow-10.3.0-cp310-cp310-win32.whl", hash = "sha256:ca2870d5d10d8726a27396d3ca4cf7976cec0f3cb706debe88e3a5bd4610f7d2"}, + {file = "pillow-10.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:f0d0591a0aeaefdaf9a5e545e7485f89910c977087e7de2b6c388aec32011e9f"}, + {file = "pillow-10.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:ccce24b7ad89adb5a1e34a6ba96ac2530046763912806ad4c247356a8f33a67b"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:5f77cf66e96ae734717d341c145c5949c63180842a545c47a0ce7ae52ca83795"}, + {file = "pillow-10.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4b878386c4bf293578b48fc570b84ecfe477d3b77ba39a6e87150af77f40c57"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdcbb4068117dfd9ce0138d068ac512843c52295ed996ae6dd1faf537b6dbc27"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9797a6c8fe16f25749b371c02e2ade0efb51155e767a971c61734b1bf6293994"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:9e91179a242bbc99be65e139e30690e081fe6cb91a8e77faf4c409653de39451"}, + {file = "pillow-10.3.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:1b87bd9d81d179bd8ab871603bd80d8645729939f90b71e62914e816a76fc6bd"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81d09caa7b27ef4e61cb7d8fbf1714f5aec1c6b6c5270ee53504981e6e9121ad"}, + {file = "pillow-10.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:048ad577748b9fa4a99a0548c64f2cb8d672d5bf2e643a739ac8faff1164238c"}, + {file = "pillow-10.3.0-cp311-cp311-win32.whl", hash = "sha256:7161ec49ef0800947dc5570f86568a7bb36fa97dd09e9827dc02b718c5643f09"}, + {file = "pillow-10.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8eb0908e954d093b02a543dc963984d6e99ad2b5e36503d8a0aaf040505f747d"}, + {file = "pillow-10.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:4e6f7d1c414191c1199f8996d3f2282b9ebea0945693fb67392c75a3a320941f"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:e46f38133e5a060d46bd630faa4d9fa0202377495df1f068a8299fd78c84de84"}, + {file = "pillow-10.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:50b8eae8f7334ec826d6eeffaeeb00e36b5e24aa0b9df322c247539714c6df19"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d3bea1c75f8c53ee4d505c3e67d8c158ad4df0d83170605b50b64025917f338"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19aeb96d43902f0a783946a0a87dbdad5c84c936025b8419da0a0cd7724356b1"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:74d28c17412d9caa1066f7a31df8403ec23d5268ba46cd0ad2c50fb82ae40462"}, + {file = "pillow-10.3.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:ff61bfd9253c3915e6d41c651d5f962da23eda633cf02262990094a18a55371a"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d886f5d353333b4771d21267c7ecc75b710f1a73d72d03ca06df49b09015a9ef"}, + {file = "pillow-10.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4b5ec25d8b17217d635f8935dbc1b9aa5907962fae29dff220f2659487891cd3"}, + {file = "pillow-10.3.0-cp312-cp312-win32.whl", hash = "sha256:51243f1ed5161b9945011a7360e997729776f6e5d7005ba0c6879267d4c5139d"}, + {file = "pillow-10.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:412444afb8c4c7a6cc11a47dade32982439925537e483be7c0ae0cf96c4f6a0b"}, + {file = "pillow-10.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:798232c92e7665fe82ac085f9d8e8ca98826f8e27859d9a96b41d519ecd2e49a"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:4eaa22f0d22b1a7e93ff0a596d57fdede2e550aecffb5a1ef1106aaece48e96b"}, + {file = "pillow-10.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cd5e14fbf22a87321b24c88669aad3a51ec052eb145315b3da3b7e3cc105b9a2"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1530e8f3a4b965eb6a7785cf17a426c779333eb62c9a7d1bbcf3ffd5bf77a4aa"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d512aafa1d32efa014fa041d38868fda85028e3f930a96f85d49c7d8ddc0383"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:339894035d0ede518b16073bdc2feef4c991ee991a29774b33e515f1d308e08d"}, + {file = "pillow-10.3.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:aa7e402ce11f0885305bfb6afb3434b3cd8f53b563ac065452d9d5654c7b86fd"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0ea2a783a2bdf2a561808fe4a7a12e9aa3799b701ba305de596bc48b8bdfce9d"}, + {file = "pillow-10.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c78e1b00a87ce43bb37642c0812315b411e856a905d58d597750eb79802aaaa3"}, + {file = "pillow-10.3.0-cp38-cp38-win32.whl", hash = "sha256:72d622d262e463dfb7595202d229f5f3ab4b852289a1cd09650362db23b9eb0b"}, + {file = "pillow-10.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:2034f6759a722da3a3dbd91a81148cf884e91d1b747992ca288ab88c1de15999"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2ed854e716a89b1afcedea551cd85f2eb2a807613752ab997b9974aaa0d56936"}, + {file = "pillow-10.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:dc1a390a82755a8c26c9964d457d4c9cbec5405896cba94cf51f36ea0d855002"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4203efca580f0dd6f882ca211f923168548f7ba334c189e9eab1178ab840bf60"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3102045a10945173d38336f6e71a8dc71bcaeed55c3123ad4af82c52807b9375"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:6fb1b30043271ec92dc65f6d9f0b7a830c210b8a96423074b15c7bc999975f57"}, + {file = "pillow-10.3.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:1dfc94946bc60ea375cc39cff0b8da6c7e5f8fcdc1d946beb8da5c216156ddd8"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b09b86b27a064c9624d0a6c54da01c1beaf5b6cadfa609cf63789b1d08a797b9"}, + {file = "pillow-10.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d3b2348a78bc939b4fed6552abfd2e7988e0f81443ef3911a4b8498ca084f6eb"}, + {file = "pillow-10.3.0-cp39-cp39-win32.whl", hash = "sha256:45ebc7b45406febf07fef35d856f0293a92e7417ae7933207e90bf9090b70572"}, + {file = "pillow-10.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:0ba26351b137ca4e0db0342d5d00d2e355eb29372c05afd544ebf47c0956ffeb"}, + {file = "pillow-10.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:50fd3f6b26e3441ae07b7c979309638b72abc1a25da31a81a7fbd9495713ef4f"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_10_10_x86_64.whl", hash = "sha256:6b02471b72526ab8a18c39cb7967b72d194ec53c1fd0a70b050565a0f366d355"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8ab74c06ffdab957d7670c2a5a6e1a70181cd10b727cd788c4dd9005b6a8acd9"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:048eeade4c33fdf7e08da40ef402e748df113fd0b4584e32c4af74fe78baaeb2"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2ec1e921fd07c7cda7962bad283acc2f2a9ccc1b971ee4b216b75fad6f0463"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:4c8e73e99da7db1b4cad7f8d682cf6abad7844da39834c288fbfa394a47bbced"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:16563993329b79513f59142a6b02055e10514c1a8e86dca8b48a893e33cf91e3"}, + {file = "pillow-10.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:dd78700f5788ae180b5ee8902c6aea5a5726bac7c364b202b4b3e3ba2d293170"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_10_10_x86_64.whl", hash = "sha256:aff76a55a8aa8364d25400a210a65ff59d0168e0b4285ba6bf2bd83cf675ba32"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:b7bc2176354defba3edc2b9a777744462da2f8e921fbaf61e52acb95bafa9828"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:793b4e24db2e8742ca6423d3fde8396db336698c55cd34b660663ee9e45ed37f"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93480005693d247f8346bc8ee28c72a2191bdf1f6b5db469c096c0c867ac015"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83341b89884e2b2e55886e8fbbf37c3fa5efd6c8907124aeb72f285ae5696e5"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:1a1d1915db1a4fdb2754b9de292642a39a7fb28f1736699527bb649484fb966a"}, + {file = "pillow-10.3.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a0eaa93d054751ee9964afa21c06247779b90440ca41d184aeb5d410f20ff591"}, + {file = "pillow-10.3.0.tar.gz", hash = "sha256:9d2455fbf44c914840c793e89aa82d0e1763a14253a000743719ae5946814b2d"}, ] [package.extras] docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-removed-in", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] [[package]] name = "pkgutil-resolve-name" @@ -5499,66 +5586,43 @@ files = [ [[package]] name = "platformdirs" -version = "3.9.1" +version = "4.2.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "platformdirs-3.9.1-py3-none-any.whl", hash = "sha256:ad8291ae0ae5072f66c16945166cb11c63394c7a3ad1b1bc9828ca3162da8c2f"}, - {file = "platformdirs-3.9.1.tar.gz", hash = "sha256:1b42b450ad933e981d56e59f1b97495428c9bd60698baab9f3eb3d00d5822421"}, + {file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"}, + {file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"}, ] [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] [[package]] name = "plotly" -version = "5.15.0" +version = "5.21.0" description = "An open-source, interactive data visualization library for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "plotly-5.15.0-py2.py3-none-any.whl", hash = "sha256:3508876bbd6aefb8a692c21a7128ca87ce42498dd041efa5c933ee44b55aab24"}, - {file = "plotly-5.15.0.tar.gz", hash = "sha256:822eabe53997d5ebf23c77e1d1fcbf3bb6aa745eb05d532afd4b6f9a2e2ab02f"}, + {file = "plotly-5.21.0-py3-none-any.whl", hash = "sha256:a33f41fd5922e45b2b253f795b200d14452eb625790bb72d0a72cf1328a6abbf"}, + {file = "plotly-5.21.0.tar.gz", hash = "sha256:69243f8c165d4be26c0df1c6f0b7b258e2dfeefe032763404ad7e7fb7d7c2073"}, ] [package.dependencies] packaging = "*" tenacity = ">=6.2.0" -[[package]] -name = "plotly-resampler" -version = "0.8.3.2" -description = "Visualizing large time series with plotly" -optional = true -python-versions = ">=3.7.1,<4.0.0" -files = [ - {file = "plotly_resampler-0.8.3.2-cp310-cp310-manylinux_2_35_x86_64.whl", hash = "sha256:c3de2cef735e68fce5c64033cd725b650a9af25e56629bca81d12475c689e58b"}, - {file = "plotly_resampler-0.8.3.2.tar.gz", hash = "sha256:5cac870d6d269cdd71d28def4cae310c609c02aac636c0831176188f16021f44"}, -] - -[package.dependencies] -dash = ">=2.2.0,<3.0.0" -jupyter-dash = ">=0.4.2" -numpy = {version = ">=1.14", markers = "python_version < \"3.11\""} -orjson = ">=3.8.0,<4.0.0" -pandas = ">=1.3.5,<2.0.0" -plotly = ">=5.5.0,<6.0.0" -trace-updater = ">=0.0.8" - -[package.extras] -inline-persistent = ["Flask-Cors (>=3.0.10,<4.0.0)", "kaleido (==0.2.1)"] - [[package]] name = "pluggy" -version = "1.2.0" +version = "1.4.0" description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pluggy-1.2.0-py3-none-any.whl", hash = "sha256:c2fd55a7d7a3863cba1a013e4e2414658b1d07b6bc57b3919e0c63c9abb99849"}, - {file = "pluggy-1.2.0.tar.gz", hash = "sha256:d12f0c4b579b15f5e054301bb226ee85eeeba08ffec228092f8defbaa3a4c4b3"}, + {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, + {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, ] [package.extras] @@ -5582,42 +5646,48 @@ requests = "*" [[package]] name = "pmdarima" -version = "2.0.3" +version = "2.0.4" description = "Python's forecast::auto.arima equivalent" optional = true python-versions = ">=3.7" files = [ - {file = "pmdarima-2.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6091a48a9e7eb3e48fdcd748bb7bdfa90635cfde110c2a5fd1ebc0c30f6c8ef5"}, - {file = "pmdarima-2.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a9da525af80651e9d44e71c7483052e6bc68eb741768a15fb0142dbffdf50f42"}, - {file = "pmdarima-2.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14b606363f777b4ab17821c989637aa11f209ec8285d46666a7744236995798c"}, - {file = "pmdarima-2.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:68be6ce7f4f66247236c44f20ac27d7252a096bd61971cd766cd7b01c34f38b4"}, - {file = "pmdarima-2.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:95e2e4629932b7b657ea7e6f9db610a71cafce704d8f44d51b7643853a78c2fe"}, - {file = "pmdarima-2.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8749730e7911715de6e4087011c5d5bcd93b4b5f6ae150e6ff615d29ca0bf49d"}, - {file = "pmdarima-2.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fe5f3ed46eadb72f66fc295983331a8e25a84c7873f06b292ed0bad196007b56"}, - {file = "pmdarima-2.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d90729d8574966dbfc198ec1e3d7f30604e5b899fff0f8683b8160ee0bc24654"}, - {file = "pmdarima-2.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ffa898354370612df043c9ea12b536cf31ef88eb9f2558a4a73983420362fd06"}, - {file = "pmdarima-2.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:d74124f5eac7a273bc03a04bdffe3ed59f4960b5ada85fdfc5c6d5fe4a56dcc2"}, - {file = "pmdarima-2.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e89c69b5908777789fb20efe9202ab8ea8a2c7a19b6a9d3f65102483bdb3e4a1"}, - {file = "pmdarima-2.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77258305437a235c890bacb0a847e1cfbbc670ca8f92a7feab67f03088d3d3ef"}, - {file = "pmdarima-2.0.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cce9784abe6b4742b6c557432342585de4236a29978df037d17a6c3116a16940"}, - {file = "pmdarima-2.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:076f4904865f43510f8a82b3bdcd9d5e0f54de67217a9898d633ef6f625825c4"}, - {file = "pmdarima-2.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b4b0840080fbbbdc0eaaa988f268b8471087ca5f16047d3a95363418da1544b2"}, - {file = "pmdarima-2.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a9b0f49f36dc85b6b8fec2a8d1c56d5b6d2706ca478d1d90c95e37688bed4a01"}, - {file = "pmdarima-2.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47522b466e3894bfbbd58a39150a89ccf75ef0cb661e3ecb96c199e749e5f60b"}, - {file = "pmdarima-2.0.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0914aab1dfd840e49b67964c664db7439f2a59b10af3c8635eac32061707f436"}, - {file = "pmdarima-2.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:09d24b4bae78b04c496c9f99bd6bd050813bdda38e149b57bfa0fe1642613b93"}, - {file = "pmdarima-2.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d941ee5940f4a9796d7bd19e720b58a44eaa5331b28ccd7194f2bf6fc2d5ee1e"}, - {file = "pmdarima-2.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:849bc7d1ec929df538698f3eca752a5526090cbe5d625c11c28bf1885bd6509a"}, - {file = "pmdarima-2.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8ba53a952e374747e5be1263d74e10c9f780503fbd1a1e6156417a7d8e67507"}, - {file = "pmdarima-2.0.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3cfaeaf31ff5c89ab60b4fc2e671c5ecd5d1bba99f3cd93c4a2bb19cba79d51"}, - {file = "pmdarima-2.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:e53685f08e971cdb1bf077418af55e7aae8397fcdefb3a335b7293d420245c62"}, - {file = "pmdarima-2.0.3.tar.gz", hash = "sha256:91acb3f7c12f3cfd6263efe323d3b8f94b58dcd242d68f11560a6c717001b01f"}, + {file = "pmdarima-2.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8e6c16672e0f122e63ab1d7282a362c762783264a07636bbc9d4ae3d58ac7605"}, + {file = "pmdarima-2.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c9a839a477100331c47aa8a841c198ecb0b3fab4aff958622d31fec86d2aea76"}, + {file = "pmdarima-2.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ccd9e2186ba1ef45006f6c88dc9ecd6121ddb8914114bebcfa0d42899b40ced7"}, + {file = "pmdarima-2.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:165bdf787f5dafd5faab543d20524413b765d9cb6f020f0e1846551e7678414a"}, + {file = "pmdarima-2.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:cbde33812c37f441ba70d9e7b0479c758d56ad77a8dcbdead1fb8baad9aee806"}, + {file = "pmdarima-2.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d961c99b445e53eadf6627c61bf800f403bd247b7ec2f62c6dfe8a0b1bcbf0b"}, + {file = "pmdarima-2.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:78e815c51074411bbe8433a912af4cc8dac394d9330cfedf57dd5ce08efe4a65"}, + {file = "pmdarima-2.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8022484256492bc425f0053b3a0346ab0a877f0f668664be738fe07f6b423c08"}, + {file = "pmdarima-2.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:46677b68efffde66aa1291799b39b91420961967fa2b6e041e26bb263782d38d"}, + {file = "pmdarima-2.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:bc594dd981bca5217b4448c96e82dbd60553b07263517a5cb0510b4bfe66ded1"}, + {file = "pmdarima-2.0.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:62a4ff308fbb5074a66c0877ba6b472d0fc406cbc0b5a2dba7e8fa800c9dd8ca"}, + {file = "pmdarima-2.0.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7e215ec6130b917843d26e0698637f976e4a6cc9dbd521bf44547668d08f058a"}, + {file = "pmdarima-2.0.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d837bc00266a234d9292914f19a67e04ca8361d9c309b70fc8f16c1ed863551"}, + {file = "pmdarima-2.0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8790bff665a5ebaa36ddbbfd0e8ea51ad2e5809270dc74d462d5c2498b26220f"}, + {file = "pmdarima-2.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:a8bf7913bdbd0e286489b2111080a0f51f5d9d3ee5e05b7011a691207047ddcf"}, + {file = "pmdarima-2.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5bce63dca165948a2311eff0c200e57370829855fce6e7d3fe930497f2f9fc04"}, + {file = "pmdarima-2.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c1ed01cbb399d9cdbe3f12f2ef505a144826769ec3ad75f6075cadbe8447a13"}, + {file = "pmdarima-2.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73060d28ffabeae7374ab48ba7882b29ae6998de3e3e34f5484c64e0baefda0d"}, + {file = "pmdarima-2.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:776e21e076393c6fe86895ffe71e6769c9b3fe0dffb92d6f6558657580cf0a42"}, + {file = "pmdarima-2.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ec865e8fb07378c470f3e41a77d6705875a674cefbe6c0185e9bc070e642da5c"}, + {file = "pmdarima-2.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:670ca1f93ed4f8239e7fbd7d1dd156108899e15e8fb0717b2b3fa605fa6ace35"}, + {file = "pmdarima-2.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab1ee166f511d2497d6b357bf0cac84326efff25349eb777aea5b030ed6bf8bb"}, + {file = "pmdarima-2.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9ead43510adfe3c0d4000e37427bfcf11ba6cc3b26091368a847c5da010e052"}, + {file = "pmdarima-2.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:c1213f3fa1e3ced9796f4092f9bd4be1881205f77bc2f5a1494695134a92000e"}, + {file = "pmdarima-2.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6e0e3c90e7a91b44599f08cd9c62880466860e76bd1b0ca2d2ff8e72834a1a7f"}, + {file = "pmdarima-2.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8fe612384e4989f010dacdefbff874231f5b7351dfb84bcbfe9ed8d718fc4115"}, + {file = "pmdarima-2.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db842d97905b171c867aae1a492b8c958ec1bae987c3ee41c561a06d99a19efd"}, + {file = "pmdarima-2.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a03936d681c720b0e44565d099de2619b762cb9d443f3043de9a78888aff6bb2"}, + {file = "pmdarima-2.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:13ba7061d4e9d48f21e1c393bfaa3d6b31f60a8c97ddbe8d455fa675c594f9e4"}, + {file = "pmdarima-2.0.4.tar.gz", hash = "sha256:b87f9d9f5b7dc2ddbd053687c2264e26ac98fd4118e843c7e9bc3dd7343e5c1a"}, ] [package.dependencies] Cython = ">=0.29,<0.29.18 || >0.29.18,<0.29.31 || >0.29.31" joblib = ">=0.11" numpy = ">=1.21.2" +packaging = ">=17.1" pandas = ">=0.19" scikit-learn = ">=0.22" scipy = ">=1.3.2" @@ -5627,13 +5697,13 @@ urllib3 = "*" [[package]] name = "posthog" -version = "3.0.1" +version = "3.5.0" description = "Integrate PostHog into any python application." optional = false python-versions = "*" files = [ - {file = "posthog-3.0.1-py2.py3-none-any.whl", hash = "sha256:9c7f92fecc713257d4b2710d05b456569c9156fbdd3e85655ba7ba5ba6c7b3ae"}, - {file = "posthog-3.0.1.tar.gz", hash = "sha256:57d2791ff5752ce56ba0f9bb8876faf3ca9208f1c2c6ceaeb5a2504c34493767"}, + {file = "posthog-3.5.0-py2.py3-none-any.whl", hash = "sha256:3c672be7ba6f95d555ea207d4486c171d06657eb34b3ce25eb043bfe7b6b5b76"}, + {file = "posthog-3.5.0.tar.gz", hash = "sha256:8f7e3b2c6e8714d0c0c542a2109b83a7549f63b7113a133ab2763a89245ef2ef"}, ] [package.dependencies] @@ -5646,7 +5716,7 @@ six = ">=1.5" [package.extras] dev = ["black", "flake8", "flake8-print", "isort", "pre-commit"] sentry = ["django", "sentry-sdk"] -test = ["coverage", "flake8", "freezegun (==0.3.15)", "mock (>=2.0.0)", "pylint", "pytest"] +test = ["coverage", "flake8", "freezegun (==0.3.15)", "mock (>=2.0.0)", "pylint", "pytest", "pytest-timeout"] [[package]] name = "praw" @@ -5673,13 +5743,13 @@ test = ["betamax (>=0.8,<0.9)", "betamax-matchers (>=0.3.0,<0.5)", "pytest (>=2. [[package]] name = "prawcore" -version = "2.3.0" -description = "Low-level communication layer for PRAW 4+." +version = "2.4.0" +description = "\"Low-level communication layer for PRAW 4+." optional = false -python-versions = "~=3.6" +python-versions = "~=3.8" files = [ - {file = "prawcore-2.3.0-py3-none-any.whl", hash = "sha256:48c17db447fa06a13ca3e722201f443031437708daa736c05a1df895fbcceff5"}, - {file = "prawcore-2.3.0.tar.gz", hash = "sha256:daf1ccd4b7a80dc4e6567d48336d782e94a9a6dad83770fc2edf76dc9a84f56d"}, + {file = "prawcore-2.4.0-py3-none-any.whl", hash = "sha256:29af5da58d85704b439ad3c820873ad541f4535e00bb98c66f0fbcc8c603065a"}, + {file = "prawcore-2.4.0.tar.gz", hash = "sha256:b7b2b5a1d04406e086ab4e79988dc794df16059862f329f4c6a43ed09986c335"}, ] [package.dependencies] @@ -5687,9 +5757,9 @@ requests = ">=2.6.0,<3.0" [package.extras] ci = ["coveralls"] -dev = ["betamax (>=0.8,<0.9)", "betamax-matchers (>=0.4.0,<0.5)", "betamax-serializers (>=0.2.0,<0.3)", "black", "flake8", "flynt", "mock (>=0.8)", "pre-commit", "pydocstyle", "pytest", "testfixtures (>4.13.2,<7)"] -lint = ["black", "flake8", "flynt", "pre-commit", "pydocstyle"] -test = ["betamax (>=0.8,<0.9)", "betamax-matchers (>=0.4.0,<0.5)", "betamax-serializers (>=0.2.0,<0.3)", "mock (>=0.8)", "pytest", "testfixtures (>4.13.2,<7)"] +dev = ["packaging", "prawcore[lint]", "prawcore[test]"] +lint = ["pre-commit", "ruff (>=0.0.291)"] +test = ["betamax (>=0.8,<0.9)", "pytest (>=2.7.3)", "urllib3 (==1.26.*)"] [[package]] name = "pre-commit" @@ -5711,13 +5781,13 @@ virtualenv = ">=20.10.0" [[package]] name = "prometheus-client" -version = "0.17.1" +version = "0.20.0" description = "Python client for the Prometheus monitoring system." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "prometheus_client-0.17.1-py3-none-any.whl", hash = "sha256:e537f37160f6807b8202a6fc4764cdd19bac5480ddd3e0d463c3002b34462101"}, - {file = "prometheus_client-0.17.1.tar.gz", hash = "sha256:21e674f39831ae3f8acde238afd9a27a37d0d2fb5a28ea094f0ce25d2cbf2091"}, + {file = "prometheus_client-0.20.0-py3-none-any.whl", hash = "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7"}, + {file = "prometheus_client-0.20.0.tar.gz", hash = "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89"}, ] [package.extras] @@ -5725,13 +5795,13 @@ twisted = ["twisted"] [[package]] name = "prompt-toolkit" -version = "3.0.39" +version = "3.0.43" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-3.0.39-py3-none-any.whl", hash = "sha256:9dffbe1d8acf91e3de75f3b544e4842382fc06c6babe903ac9acb74dc6e08d88"}, - {file = "prompt_toolkit-3.0.39.tar.gz", hash = "sha256:04505ade687dc26dc4284b1ad19a83be2f2afe83e7a828ace0c72f3a1df72aac"}, + {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, + {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, ] [package.dependencies] @@ -5813,25 +5883,27 @@ files = [ [[package]] name = "psutil" -version = "5.9.5" +version = "5.9.8" description = "Cross-platform lib for process and system monitoring in Python." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "psutil-5.9.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:be8929ce4313f9f8146caad4272f6abb8bf99fc6cf59344a3167ecd74f4f203f"}, - {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ab8ed1a1d77c95453db1ae00a3f9c50227ebd955437bcf2a574ba8adbf6a74d5"}, - {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4aef137f3345082a3d3232187aeb4ac4ef959ba3d7c10c33dd73763fbc063da4"}, - {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ea8518d152174e1249c4f2a1c89e3e6065941df2fa13a1ab45327716a23c2b48"}, - {file = "psutil-5.9.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:acf2aef9391710afded549ff602b5887d7a2349831ae4c26be7c807c0a39fac4"}, - {file = "psutil-5.9.5-cp27-none-win32.whl", hash = "sha256:5b9b8cb93f507e8dbaf22af6a2fd0ccbe8244bf30b1baad6b3954e935157ae3f"}, - {file = "psutil-5.9.5-cp27-none-win_amd64.whl", hash = "sha256:8c5f7c5a052d1d567db4ddd231a9d27a74e8e4a9c3f44b1032762bd7b9fdcd42"}, - {file = "psutil-5.9.5-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:3c6f686f4225553615612f6d9bc21f1c0e305f75d7d8454f9b46e901778e7217"}, - {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a7dd9997128a0d928ed4fb2c2d57e5102bb6089027939f3b722f3a210f9a8da"}, - {file = "psutil-5.9.5-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89518112647f1276b03ca97b65cc7f64ca587b1eb0278383017c2a0dcc26cbe4"}, - {file = "psutil-5.9.5-cp36-abi3-win32.whl", hash = "sha256:104a5cc0e31baa2bcf67900be36acde157756b9c44017b86b2c049f11957887d"}, - {file = "psutil-5.9.5-cp36-abi3-win_amd64.whl", hash = "sha256:b258c0c1c9d145a1d5ceffab1134441c4c5113b2417fafff7315a917a026c3c9"}, - {file = "psutil-5.9.5-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30"}, - {file = "psutil-5.9.5.tar.gz", hash = "sha256:5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c"}, + {file = "psutil-5.9.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, + {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, + {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, + {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, + {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, + {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, + {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, + {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, + {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, + {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, ] [package.extras] @@ -5875,125 +5947,149 @@ files = [ [[package]] name = "pyarrow" -version = "12.0.1" +version = "15.0.2" description = "Python library for Apache Arrow" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pyarrow-12.0.1-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:6d288029a94a9bb5407ceebdd7110ba398a00412c5b0155ee9813a40d246c5df"}, - {file = "pyarrow-12.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:345e1828efdbd9aa4d4de7d5676778aba384a2c3add896d995b23d368e60e5af"}, - {file = "pyarrow-12.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d6009fdf8986332b2169314da482baed47ac053311c8934ac6651e614deacd6"}, - {file = "pyarrow-12.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d3c4cbbf81e6dd23fe921bc91dc4619ea3b79bc58ef10bce0f49bdafb103daf"}, - {file = "pyarrow-12.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:cdacf515ec276709ac8042c7d9bd5be83b4f5f39c6c037a17a60d7ebfd92c890"}, - {file = "pyarrow-12.0.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:749be7fd2ff260683f9cc739cb862fb11be376de965a2a8ccbf2693b098db6c7"}, - {file = "pyarrow-12.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6895b5fb74289d055c43db3af0de6e16b07586c45763cb5e558d38b86a91e3a7"}, - {file = "pyarrow-12.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1887bdae17ec3b4c046fcf19951e71b6a619f39fa674f9881216173566c8f718"}, - {file = "pyarrow-12.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2c9cb8eeabbadf5fcfc3d1ddea616c7ce893db2ce4dcef0ac13b099ad7ca082"}, - {file = "pyarrow-12.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:ce4aebdf412bd0eeb800d8e47db854f9f9f7e2f5a0220440acf219ddfddd4f63"}, - {file = "pyarrow-12.0.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:e0d8730c7f6e893f6db5d5b86eda42c0a130842d101992b581e2138e4d5663d3"}, - {file = "pyarrow-12.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43364daec02f69fec89d2315f7fbfbeec956e0d991cbbef471681bd77875c40f"}, - {file = "pyarrow-12.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:051f9f5ccf585f12d7de836e50965b3c235542cc896959320d9776ab93f3b33d"}, - {file = "pyarrow-12.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:be2757e9275875d2a9c6e6052ac7957fbbfc7bc7370e4a036a9b893e96fedaba"}, - {file = "pyarrow-12.0.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:cf812306d66f40f69e684300f7af5111c11f6e0d89d6b733e05a3de44961529d"}, - {file = "pyarrow-12.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:459a1c0ed2d68671188b2118c63bac91eaef6fc150c77ddd8a583e3c795737bf"}, - {file = "pyarrow-12.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85e705e33eaf666bbe508a16fd5ba27ca061e177916b7a317ba5a51bee43384c"}, - {file = "pyarrow-12.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9120c3eb2b1f6f516a3b7a9714ed860882d9ef98c4b17edcdc91d95b7528db60"}, - {file = "pyarrow-12.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:c780f4dc40460015d80fcd6a6140de80b615349ed68ef9adb653fe351778c9b3"}, - {file = "pyarrow-12.0.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:a3c63124fc26bf5f95f508f5d04e1ece8cc23a8b0af2a1e6ab2b1ec3fdc91b24"}, - {file = "pyarrow-12.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b13329f79fa4472324f8d32dc1b1216616d09bd1e77cfb13104dec5463632c36"}, - {file = "pyarrow-12.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb656150d3d12ec1396f6dde542db1675a95c0cc8366d507347b0beed96e87ca"}, - {file = "pyarrow-12.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6251e38470da97a5b2e00de5c6a049149f7b2bd62f12fa5dbb9ac674119ba71a"}, - {file = "pyarrow-12.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:3de26da901216149ce086920547dfff5cd22818c9eab67ebc41e863a5883bac7"}, - {file = "pyarrow-12.0.1.tar.gz", hash = "sha256:cce317fc96e5b71107bf1f9f184d5e54e2bd14bbf3f9a3d62819961f0af86fec"}, + {file = "pyarrow-15.0.2-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:88b340f0a1d05b5ccc3d2d986279045655b1fe8e41aba6ca44ea28da0d1455d8"}, + {file = "pyarrow-15.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eaa8f96cecf32da508e6c7f69bb8401f03745c050c1dd42ec2596f2e98deecac"}, + {file = "pyarrow-15.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23c6753ed4f6adb8461e7c383e418391b8d8453c5d67e17f416c3a5d5709afbd"}, + {file = "pyarrow-15.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f639c059035011db8c0497e541a8a45d98a58dbe34dc8fadd0ef128f2cee46e5"}, + {file = "pyarrow-15.0.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:290e36a59a0993e9a5224ed2fb3e53375770f07379a0ea03ee2fce2e6d30b423"}, + {file = "pyarrow-15.0.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:06c2bb2a98bc792f040bef31ad3e9be6a63d0cb39189227c08a7d955db96816e"}, + {file = "pyarrow-15.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:f7a197f3670606a960ddc12adbe8075cea5f707ad7bf0dffa09637fdbb89f76c"}, + {file = "pyarrow-15.0.2-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:5f8bc839ea36b1f99984c78e06e7a06054693dc2af8920f6fb416b5bca9944e4"}, + {file = "pyarrow-15.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f5e81dfb4e519baa6b4c80410421528c214427e77ca0ea9461eb4097c328fa33"}, + {file = "pyarrow-15.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a4f240852b302a7af4646c8bfe9950c4691a419847001178662a98915fd7ee7"}, + {file = "pyarrow-15.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e7d9cfb5a1e648e172428c7a42b744610956f3b70f524aa3a6c02a448ba853e"}, + {file = "pyarrow-15.0.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:2d4f905209de70c0eb5b2de6763104d5a9a37430f137678edfb9a675bac9cd98"}, + {file = "pyarrow-15.0.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:90adb99e8ce5f36fbecbbc422e7dcbcbed07d985eed6062e459e23f9e71fd197"}, + {file = "pyarrow-15.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:b116e7fd7889294cbd24eb90cd9bdd3850be3738d61297855a71ac3b8124ee38"}, + {file = "pyarrow-15.0.2-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:25335e6f1f07fdaa026a61c758ee7d19ce824a866b27bba744348fa73bb5a440"}, + {file = "pyarrow-15.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:90f19e976d9c3d8e73c80be84ddbe2f830b6304e4c576349d9360e335cd627fc"}, + {file = "pyarrow-15.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a22366249bf5fd40ddacc4f03cd3160f2d7c247692945afb1899bab8a140ddfb"}, + {file = "pyarrow-15.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c2a335198f886b07e4b5ea16d08ee06557e07db54a8400cc0d03c7f6a22f785f"}, + {file = "pyarrow-15.0.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:3e6d459c0c22f0b9c810a3917a1de3ee704b021a5fb8b3bacf968eece6df098f"}, + {file = "pyarrow-15.0.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:033b7cad32198754d93465dcfb71d0ba7cb7cd5c9afd7052cab7214676eec38b"}, + {file = "pyarrow-15.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:29850d050379d6e8b5a693098f4de7fd6a2bea4365bfd073d7c57c57b95041ee"}, + {file = "pyarrow-15.0.2-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:7167107d7fb6dcadb375b4b691b7e316f4368f39f6f45405a05535d7ad5e5058"}, + {file = "pyarrow-15.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e85241b44cc3d365ef950432a1b3bd44ac54626f37b2e3a0cc89c20e45dfd8bf"}, + {file = "pyarrow-15.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:248723e4ed3255fcd73edcecc209744d58a9ca852e4cf3d2577811b6d4b59818"}, + {file = "pyarrow-15.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ff3bdfe6f1b81ca5b73b70a8d482d37a766433823e0c21e22d1d7dde76ca33f"}, + {file = "pyarrow-15.0.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:f3d77463dee7e9f284ef42d341689b459a63ff2e75cee2b9302058d0d98fe142"}, + {file = "pyarrow-15.0.2-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:8c1faf2482fb89766e79745670cbca04e7018497d85be9242d5350cba21357e1"}, + {file = "pyarrow-15.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:28f3016958a8e45a1069303a4a4f6a7d4910643fc08adb1e2e4a7ff056272ad3"}, + {file = "pyarrow-15.0.2-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:89722cb64286ab3d4daf168386f6968c126057b8c7ec3ef96302e81d8cdb8ae4"}, + {file = "pyarrow-15.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cd0ba387705044b3ac77b1b317165c0498299b08261d8122c96051024f953cd5"}, + {file = "pyarrow-15.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad2459bf1f22b6a5cdcc27ebfd99307d5526b62d217b984b9f5c974651398832"}, + {file = "pyarrow-15.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58922e4bfece8b02abf7159f1f53a8f4d9f8e08f2d988109126c17c3bb261f22"}, + {file = "pyarrow-15.0.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:adccc81d3dc0478ea0b498807b39a8d41628fa9210729b2f718b78cb997c7c91"}, + {file = "pyarrow-15.0.2-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:8bd2baa5fe531571847983f36a30ddbf65261ef23e496862ece83bdceb70420d"}, + {file = "pyarrow-15.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6669799a1d4ca9da9c7e06ef48368320f5856f36f9a4dd31a11839dda3f6cc8c"}, + {file = "pyarrow-15.0.2.tar.gz", hash = "sha256:9c9bc803cb3b7bfacc1e96ffbfd923601065d9d3f911179d81e72d99fd74a3d9"}, ] [package.dependencies] -numpy = ">=1.16.6" +numpy = ">=1.16.6,<2" [[package]] name = "pyasn1" -version = "0.5.0" +version = "0.6.0" description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = ">=3.8" files = [ - {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, - {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, + {file = "pyasn1-0.6.0-py2.py3-none-any.whl", hash = "sha256:cca4bb0f2df5504f02f6f8a775b6e416ff9b0b3b16f7ee80b5a3153d9b804473"}, + {file = "pyasn1-0.6.0.tar.gz", hash = "sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c"}, ] [[package]] name = "pyasn1-modules" -version = "0.3.0" +version = "0.4.0" description = "A collection of ASN.1-based protocols modules" optional = true -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = ">=3.8" files = [ - {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, - {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, + {file = "pyasn1_modules-0.4.0-py3-none-any.whl", hash = "sha256:be04f15b66c206eed667e0bb5ab27e2b1855ea54a842e5037738099e8ca4ae0b"}, + {file = "pyasn1_modules-0.4.0.tar.gz", hash = "sha256:831dbcea1b177b28c9baddf4c6d1013c24c3accd14a1873fffaa6a2e905f17b6"}, ] [package.dependencies] -pyasn1 = ">=0.4.6,<0.6.0" +pyasn1 = ">=0.4.6,<0.7.0" + +[[package]] +name = "pybind11" +version = "2.12.0" +description = "Seamless operability between C++11 and Python" +optional = true +python-versions = ">=3.6" +files = [ + {file = "pybind11-2.12.0-py3-none-any.whl", hash = "sha256:df8d60b94f9e714d81013db233393d430ebf9f3551642b82291cf1b14d1afdbd"}, + {file = "pybind11-2.12.0.tar.gz", hash = "sha256:5e3c557a84b06b969247630407fc4d985bed157b4253b13153b8e8e165e0c3dc"}, +] + +[package.extras] +global = ["pybind11-global (==2.12.0)"] [[package]] name = "pycares" -version = "4.3.0" +version = "4.4.0" description = "Python interface for c-ares" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "pycares-4.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:19c9cdd3322d422931982939773e453e491dfc5c0b2e23d7266959315c7a0824"}, - {file = "pycares-4.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9e56e9cdf46a092970dc4b75bbabddea9f480be5eeadc3fcae3eb5c6807c4136"}, - {file = "pycares-4.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c75a6241c79b935048272cb77df498da64b8defc8c4b29fdf9870e43ba4cbb4"}, - {file = "pycares-4.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24d8654fac3742791b8bef59d1fbb3e19ae6a5c48876a6d98659f7c66ee546c4"}, - {file = "pycares-4.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ebf50b049a245880f1aa16a6f72c4408e0a65b49ea1d3bf13383a44a2cabd2bf"}, - {file = "pycares-4.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:84daf560962763c0359fd79c750ef480f0fda40c08b57765088dbe362e8dc452"}, - {file = "pycares-4.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:978d10da7ee74b9979c494afa8b646411119ad0186a29c7f13c72bb4295630c6"}, - {file = "pycares-4.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c5b9d7fe52eb3d243f5ead58d5c0011884226d961df8360a34618c38c7515"}, - {file = "pycares-4.3.0-cp310-cp310-win32.whl", hash = "sha256:da7c7089ae617317d2cbe38baefd3821387b3bfef7b3ee5b797b871cb1257974"}, - {file = "pycares-4.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:7106dc683db30e1d851283b7b9df7a5ea4964d6bdd000d918d91d4b1f9bed329"}, - {file = "pycares-4.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4e7a24ecef0b1933f2a3fdbf328d1b529a76cda113f8364fa0742e5b3bd76566"}, - {file = "pycares-4.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7abccc2aa4771c06994e4d9ed596453061e2b8846f887d9c98a64ccdaf4790a"}, - {file = "pycares-4.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:531fed46c5ed798a914c3207be4ae7b297c4d09e4183d3cf8fd9ee59a55d5080"}, - {file = "pycares-4.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c9335175af0c64a1e0ba67bdd349eb62d4eea0ad02c235ccdf0d535fd20f323"}, - {file = "pycares-4.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5f0e95535027d2dcd51e780410632b0d3ed7e9e5ceb25dc0fe937f2c2960079"}, - {file = "pycares-4.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3692179ce5fb96908ba342e1e5303608d0c976f0d5d4619fa9d3d6d9d5a9a1b4"}, - {file = "pycares-4.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c4cb6cc7fe8e0606d30b60367f59fe26d1472e88555d61e202db70dea5c8edb"}, - {file = "pycares-4.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3215445396c74103e2054e6b349d9e85883ceda2006d0039fc2d58c9b11818a2"}, - {file = "pycares-4.3.0-cp311-cp311-win32.whl", hash = "sha256:6a0c0c3a0adf490bba9dbb37dbd07ec81e4a6584f095036ac34f06a633710ffe"}, - {file = "pycares-4.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:995cb37cc39bd40ca87bb16555a0f7724f3be30d9f9059a4caab2fde45b1b903"}, - {file = "pycares-4.3.0-cp36-cp36m-win32.whl", hash = "sha256:4c9187be72449c975c11daa1d94d7ddcc494f8a4c37a6c18f977cd7024a531d9"}, - {file = "pycares-4.3.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d7405ba10a2903a58b8b0faedcb54994c9ee002ad01963587fabf93e7e479783"}, - {file = "pycares-4.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:40aaa12081495f879f11f4cfc95edfec1ea14711188563102f9e33fe98728fac"}, - {file = "pycares-4.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4972cac24b66c5997f3a3e2cb608e408066d80103d443e36d626a88a287b9ae7"}, - {file = "pycares-4.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35886dba7aa5b73affca8729aeb5a1f5e94d3d9a764adb1b7e75bafca44eeca5"}, - {file = "pycares-4.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5cea6e1f3be016f155d60f27f16c1074d58b4d6e123228fdbc3326d076016af8"}, - {file = "pycares-4.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3a9fd2665b053afb39226ac6f8137a60910ca7729358456df2fb94866f4297de"}, - {file = "pycares-4.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e8e9195f869120e44e0aa0a6098bb5c19947f4753054365891f592e6f9eab3ef"}, - {file = "pycares-4.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:674486ecf2afb25ee219171b07cdaba481a1aaa2dabb155779c7be9ded03eaa9"}, - {file = "pycares-4.3.0-cp37-cp37m-win32.whl", hash = "sha256:1b6cd3161851499b6894d1e23bfd633e7b775472f5af35ae35409c4a47a2d45e"}, - {file = "pycares-4.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:710120c97b9afdba443564350c3f5f72fd9aae74d95b73dc062ca8ac3d7f36d7"}, - {file = "pycares-4.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9103649bd29d84bc6bcfaf09def9c0592bbc766018fad19d76d09989608b915d"}, - {file = "pycares-4.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c072dbaf73cb5434279578dc35322867d8d5df053e14fdcdcc589994ba4804ae"}, - {file = "pycares-4.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:008531733f9c7a976b59c7760a3672b191159fd69ae76c01ca051f20b5e44164"}, - {file = "pycares-4.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2aae02d97d77dcff840ab55f86cb8b99bf644acbca17e1edb7048408b9782088"}, - {file = "pycares-4.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:257953ae6d400a934fd9193aeb20990ac84a78648bdf5978e998bd007a4045cd"}, - {file = "pycares-4.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c28d481efae26936ec08cb6beea305f4b145503b152cf2c4dc68cc4ad9644f0e"}, - {file = "pycares-4.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:976249b39037dbfb709ccf7e1c40d2785905a0065536385d501b94570cfed96d"}, - {file = "pycares-4.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:98568c30cfab6b327d94ae1acdf85bbba4cffd415980804985d34ca07e6f4791"}, - {file = "pycares-4.3.0-cp38-cp38-win32.whl", hash = "sha256:a2f3c4f49f43162f7e684419d9834c2c8ec165e54cb8dc47aa9dc0c2132701c0"}, - {file = "pycares-4.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:1730ef93e33e4682fbbf0e7fb19df2ed9822779d17de8ea6e20d5b0d71c1d2be"}, - {file = "pycares-4.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5a26b3f1684557025da26ce65d076619890c82b95e38cc7284ce51c3539a1ce8"}, - {file = "pycares-4.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:86112cce01655b9f63c5e53b74722084e88e784a7a8ad138d373440337c591c9"}, - {file = "pycares-4.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c01465a191dc78e923884bb45cd63c7e012623e520cf7ed67e542413ee334804"}, - {file = "pycares-4.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9fd5d6012f3ee8c8038cbfe16e988bbd17b2f21eea86650874bf63757ee6161"}, - {file = "pycares-4.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa36b8ea91eae20b5c7205f3e6654423f066af24a1df02b274770a96cbcafaa7"}, - {file = "pycares-4.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:61019151130557c1788cae52e4f2f388a7520c9d92574f3a0d61c974c6740db0"}, - {file = "pycares-4.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:231962bb46274c52632469a1e686fab065dbd106dbef586de4f7fb101e297587"}, - {file = "pycares-4.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6c979512fa51c7ccef5204fe10ed4e5c44c2bce5f335fe98a3e423f1672bd7d4"}, - {file = "pycares-4.3.0-cp39-cp39-win32.whl", hash = "sha256:655cf0df862ce3847a60e1a106dafa2ba2c14e6636bac49e874347acdc7312dc"}, - {file = "pycares-4.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:36f2251ad0f99a5ce13df45c94c3161d9734c9e9fa2b9b4cc163b853ca170dc5"}, - {file = "pycares-4.3.0.tar.gz", hash = "sha256:c542696f6dac978e9d99192384745a65f80a7d9450501151e4a7563e06010d45"}, + {file = "pycares-4.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:24da119850841d16996713d9c3374ca28a21deee056d609fbbed29065d17e1f6"}, + {file = "pycares-4.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8f64cb58729689d4d0e78f0bfb4c25ce2f851d0274c0273ac751795c04b8798a"}, + {file = "pycares-4.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d33e2a1120887e89075f7f814ec144f66a6ce06a54f5722ccefc62fbeda83cff"}, + {file = "pycares-4.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c680fef1b502ee680f8f0b95a41af4ec2c234e50e16c0af5bbda31999d3584bd"}, + {file = "pycares-4.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fff16b09042ba077f7b8aa5868d1d22456f0002574d0ba43462b10a009331677"}, + {file = "pycares-4.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:229a1675eb33bc9afb1fc463e73ee334950ccc485bc83a43f6ae5839fb4d5fa3"}, + {file = "pycares-4.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3aebc73e5ad70464f998f77f2da2063aa617cbd8d3e8174dd7c5b4518f967153"}, + {file = "pycares-4.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6ef64649eba56448f65e26546d85c860709844d2fc22ef14d324fe0b27f761a9"}, + {file = "pycares-4.4.0-cp310-cp310-win32.whl", hash = "sha256:4afc2644423f4eef97857a9fd61be9758ce5e336b4b0bd3d591238bb4b8b03e0"}, + {file = "pycares-4.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:5ed4e04af4012f875b78219d34434a6d08a67175150ac1b79eb70ab585d4ba8c"}, + {file = "pycares-4.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bce8db2fc6f3174bd39b81405210b9b88d7b607d33e56a970c34a0c190da0490"}, + {file = "pycares-4.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9a0303428d013ccf5c51de59c83f9127aba6200adb7fd4be57eddb432a1edd2a"}, + {file = "pycares-4.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afb91792f1556f97be7f7acb57dc7756d89c5a87bd8b90363a77dbf9ea653817"}, + {file = "pycares-4.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b61579cecf1f4d616e5ea31a6e423a16680ab0d3a24a2ffe7bb1d4ee162477ff"}, + {file = "pycares-4.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7af06968cbf6851566e806bf3e72825b0e6671832a2cbe840be1d2d65350710"}, + {file = "pycares-4.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ceb12974367b0a68a05d52f4162b29f575d241bd53de155efe632bf2c943c7f6"}, + {file = "pycares-4.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2eeec144bcf6a7b6f2d74d6e70cbba7886a84dd373c886f06cb137a07de4954c"}, + {file = "pycares-4.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e3a6f7cfdfd11eb5493d6d632e582408c8f3b429f295f8799c584c108b28db6f"}, + {file = "pycares-4.4.0-cp311-cp311-win32.whl", hash = "sha256:34736a2ffaa9c08ca9c707011a2d7b69074bbf82d645d8138bba771479b2362f"}, + {file = "pycares-4.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:eb66c30eb11e877976b7ead13632082a8621df648c408b8e15cdb91a452dd502"}, + {file = "pycares-4.4.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:fd644505a8cfd7f6584d33a9066d4e3d47700f050ef1490230c962de5dfb28c6"}, + {file = "pycares-4.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52084961262232ec04bd75f5043aed7e5d8d9695e542ff691dfef0110209f2d4"}, + {file = "pycares-4.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0c5368206057884cde18602580083aeaad9b860e2eac14fd253543158ce1e93"}, + {file = "pycares-4.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:112a4979c695b1c86f6782163d7dec58d57a3b9510536dcf4826550f9053dd9a"}, + {file = "pycares-4.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8d186dafccdaa3409194c0f94db93c1a5d191145a275f19da6591f9499b8e7b8"}, + {file = "pycares-4.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:64965dc19c578a683ea73487a215a8897276224e004d50eeb21f0bc7a0b63c88"}, + {file = "pycares-4.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:ed2a38e34bec6f2586435f6ff0bc5fe11d14bebd7ed492cf739a424e81681540"}, + {file = "pycares-4.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:94d6962db81541eb0396d2f0dfcbb18cdb8c8b251d165efc2d974ae652c547d4"}, + {file = "pycares-4.4.0-cp312-cp312-win32.whl", hash = "sha256:1168a48a834813aa80f412be2df4abaf630528a58d15c704857448b20b1675c0"}, + {file = "pycares-4.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:db24c4e7fea4a052c6e869cbf387dd85d53b9736cfe1ef5d8d568d1ca925e977"}, + {file = "pycares-4.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:21a5a0468861ec7df7befa69050f952da13db5427ae41ffe4713bc96291d1d95"}, + {file = "pycares-4.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:22c00bf659a9fa44d7b405cf1cd69b68b9d37537899898d8cbe5dffa4016b273"}, + {file = "pycares-4.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23aa3993a352491a47fcf17867f61472f32f874df4adcbb486294bd9fbe8abee"}, + {file = "pycares-4.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:813d661cbe2e37d87da2d16b7110a6860e93ddb11735c6919c8a3545c7b9c8d8"}, + {file = "pycares-4.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:77cf5a2fd5583c670de41a7f4a7b46e5cbabe7180d8029f728571f4d2e864084"}, + {file = "pycares-4.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3eaa6681c0a3e3f3868c77aca14b7760fed35fdfda2fe587e15c701950e7bc69"}, + {file = "pycares-4.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ad58e284a658a8a6a84af2e0b62f2f961f303cedfe551854d7bd40c3cbb61912"}, + {file = "pycares-4.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bfb89ca9e3d0a9b5332deeb666b2ede9d3469107742158f4aeda5ce032d003f4"}, + {file = "pycares-4.4.0-cp38-cp38-win32.whl", hash = "sha256:f36bdc1562142e3695555d2f4ac0cb69af165eddcefa98efc1c79495b533481f"}, + {file = "pycares-4.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:902461a92b6a80fd5041a2ec5235680c7cc35e43615639ec2a40e63fca2dfb51"}, + {file = "pycares-4.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7bddc6adba8f699728f7fc1c9ce8cef359817ad78e2ed52b9502cb5f8dc7f741"}, + {file = "pycares-4.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cb49d5805cd347c404f928c5ae7c35e86ba0c58ffa701dbe905365e77ce7d641"}, + {file = "pycares-4.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56cf3349fa3a2e67ed387a7974c11d233734636fe19facfcda261b411af14d80"}, + {file = "pycares-4.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8bf2eaa83a5987e48fa63302f0fe7ce3275cfda87b34d40fef9ce703fb3ac002"}, + {file = "pycares-4.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82bba2ab77eb5addbf9758d514d9bdef3c1bfe7d1649a47bd9a0d55a23ef478b"}, + {file = "pycares-4.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c6a8bde63106f162fca736e842a916853cad3c8d9d137e11c9ffa37efa818b02"}, + {file = "pycares-4.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f5f646eec041db6ffdbcaf3e0756fb92018f7af3266138c756bb09d2b5baadec"}, + {file = "pycares-4.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9dc04c54c6ea615210c1b9e803d0e2d2255f87a3d5d119b6482c8f0dfa15b26b"}, + {file = "pycares-4.4.0-cp39-cp39-win32.whl", hash = "sha256:97892cced5794d721fb4ff8765764aa4ea48fe8b2c3820677505b96b83d4ef47"}, + {file = "pycares-4.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:917f08f0b5d9324e9a34211e68d27447c552b50ab967044776bbab7e42a553a2"}, + {file = "pycares-4.4.0.tar.gz", hash = "sha256:f47579d508f2f56eddd16ce72045782ad3b1b3b678098699e2b6a1b30733e1c2"}, ] [package.dependencies] @@ -6004,13 +6100,13 @@ idna = ["idna (>=2.1)"] [[package]] name = "pycodestyle" -version = "2.10.0" +version = "2.11.1" description = "Python style guide checker" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "pycodestyle-2.10.0-py2.py3-none-any.whl", hash = "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610"}, - {file = "pycodestyle-2.10.0.tar.gz", hash = "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053"}, + {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, + {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, ] [[package]] @@ -6029,140 +6125,140 @@ requests = "*" [[package]] name = "pycparser" -version = "2.21" +version = "2.22" description = "C parser in Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, ] [[package]] name = "pycryptodome" -version = "3.18.0" +version = "3.20.0" description = "Cryptographic library for Python" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ - {file = "pycryptodome-3.18.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:d1497a8cd4728db0e0da3c304856cb37c0c4e3d0b36fcbabcc1600f18504fc54"}, - {file = "pycryptodome-3.18.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:928078c530da78ff08e10eb6cada6e0dff386bf3d9fa9871b4bbc9fbc1efe024"}, - {file = "pycryptodome-3.18.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:157c9b5ba5e21b375f052ca78152dd309a09ed04703fd3721dce3ff8ecced148"}, - {file = "pycryptodome-3.18.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:d20082bdac9218649f6abe0b885927be25a917e29ae0502eaf2b53f1233ce0c2"}, - {file = "pycryptodome-3.18.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:e8ad74044e5f5d2456c11ed4cfd3e34b8d4898c0cb201c4038fe41458a82ea27"}, - {file = "pycryptodome-3.18.0-cp27-cp27m-win32.whl", hash = "sha256:62a1e8847fabb5213ccde38915563140a5b338f0d0a0d363f996b51e4a6165cf"}, - {file = "pycryptodome-3.18.0-cp27-cp27m-win_amd64.whl", hash = "sha256:16bfd98dbe472c263ed2821284118d899c76968db1a6665ade0c46805e6b29a4"}, - {file = "pycryptodome-3.18.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:7a3d22c8ee63de22336679e021c7f2386f7fc465477d59675caa0e5706387944"}, - {file = "pycryptodome-3.18.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:78d863476e6bad2a592645072cc489bb90320972115d8995bcfbee2f8b209918"}, - {file = "pycryptodome-3.18.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:b6a610f8bfe67eab980d6236fdc73bfcdae23c9ed5548192bb2d530e8a92780e"}, - {file = "pycryptodome-3.18.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:422c89fd8df8a3bee09fb8d52aaa1e996120eafa565437392b781abec2a56e14"}, - {file = "pycryptodome-3.18.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:9ad6f09f670c466aac94a40798e0e8d1ef2aa04589c29faa5b9b97566611d1d1"}, - {file = "pycryptodome-3.18.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:53aee6be8b9b6da25ccd9028caf17dcdce3604f2c7862f5167777b707fbfb6cb"}, - {file = "pycryptodome-3.18.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:10da29526a2a927c7d64b8f34592f461d92ae55fc97981aab5bbcde8cb465bb6"}, - {file = "pycryptodome-3.18.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f21efb8438971aa16924790e1c3dba3a33164eb4000106a55baaed522c261acf"}, - {file = "pycryptodome-3.18.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4944defabe2ace4803f99543445c27dd1edbe86d7d4edb87b256476a91e9ffa4"}, - {file = "pycryptodome-3.18.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:51eae079ddb9c5f10376b4131be9589a6554f6fd84f7f655180937f611cd99a2"}, - {file = "pycryptodome-3.18.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:83c75952dcf4a4cebaa850fa257d7a860644c70a7cd54262c237c9f2be26f76e"}, - {file = "pycryptodome-3.18.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:957b221d062d5752716923d14e0926f47670e95fead9d240fa4d4862214b9b2f"}, - {file = "pycryptodome-3.18.0-cp35-abi3-win32.whl", hash = "sha256:795bd1e4258a2c689c0b1f13ce9684fa0dd4c0e08680dcf597cf9516ed6bc0f3"}, - {file = "pycryptodome-3.18.0-cp35-abi3-win_amd64.whl", hash = "sha256:b1d9701d10303eec8d0bd33fa54d44e67b8be74ab449052a8372f12a66f93fb9"}, - {file = "pycryptodome-3.18.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:cb1be4d5af7f355e7d41d36d8eec156ef1382a88638e8032215c215b82a4b8ec"}, - {file = "pycryptodome-3.18.0-pp27-pypy_73-win32.whl", hash = "sha256:fc0a73f4db1e31d4a6d71b672a48f3af458f548059aa05e83022d5f61aac9c08"}, - {file = "pycryptodome-3.18.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f022a4fd2a5263a5c483a2bb165f9cb27f2be06f2f477113783efe3fe2ad887b"}, - {file = "pycryptodome-3.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:363dd6f21f848301c2dcdeb3c8ae5f0dee2286a5e952a0f04954b82076f23825"}, - {file = "pycryptodome-3.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12600268763e6fec3cefe4c2dcdf79bde08d0b6dc1813887e789e495cb9f3403"}, - {file = "pycryptodome-3.18.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4604816adebd4faf8810782f137f8426bf45fee97d8427fa8e1e49ea78a52e2c"}, - {file = "pycryptodome-3.18.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:01489bbdf709d993f3058e2996f8f40fee3f0ea4d995002e5968965fa2fe89fb"}, - {file = "pycryptodome-3.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3811e31e1ac3069988f7a1c9ee7331b942e605dfc0f27330a9ea5997e965efb2"}, - {file = "pycryptodome-3.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6f4b967bb11baea9128ec88c3d02f55a3e338361f5e4934f5240afcb667fdaec"}, - {file = "pycryptodome-3.18.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:9c8eda4f260072f7dbe42f473906c659dcbadd5ae6159dfb49af4da1293ae380"}, - {file = "pycryptodome-3.18.0.tar.gz", hash = "sha256:c9adee653fc882d98956e33ca2c1fb582e23a8af7ac82fee75bd6113c55a0413"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:f0e6d631bae3f231d3634f91ae4da7a960f7ff87f2865b2d2b831af1dfb04e9a"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:baee115a9ba6c5d2709a1e88ffe62b73ecc044852a925dcb67713a288c4ec70f"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:417a276aaa9cb3be91f9014e9d18d10e840a7a9b9a9be64a42f553c5b50b4d1d"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a1250b7ea809f752b68e3e6f3fd946b5939a52eaeea18c73bdab53e9ba3c2dd"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:d5954acfe9e00bc83ed9f5cb082ed22c592fbbef86dc48b907238be64ead5c33"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-win32.whl", hash = "sha256:06d6de87c19f967f03b4cf9b34e538ef46e99a337e9a61a77dbe44b2cbcf0690"}, + {file = "pycryptodome-3.20.0-cp27-cp27m-win_amd64.whl", hash = "sha256:ec0bb1188c1d13426039af8ffcb4dbe3aad1d7680c35a62d8eaf2a529b5d3d4f"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5601c934c498cd267640b57569e73793cb9a83506f7c73a8ec57a516f5b0b091"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:d29daa681517f4bc318cd8a23af87e1f2a7bad2fe361e8aa29c77d652a065de4"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3427d9e5310af6680678f4cce149f54e0bb4af60101c7f2c16fdf878b39ccccc"}, + {file = "pycryptodome-3.20.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:3cd3ef3aee1079ae44afaeee13393cf68b1058f70576b11439483e34f93cf818"}, + {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac1c7c0624a862f2e53438a15c9259d1655325fc2ec4392e66dc46cdae24d044"}, + {file = "pycryptodome-3.20.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:76658f0d942051d12a9bd08ca1b6b34fd762a8ee4240984f7c06ddfb55eaf15a"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f35d6cee81fa145333137009d9c8ba90951d7d77b67c79cbe5f03c7eb74d8fe2"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76cb39afede7055127e35a444c1c041d2e8d2f1f9c121ecef573757ba4cd2c3c"}, + {file = "pycryptodome-3.20.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49a4c4dc60b78ec41d2afa392491d788c2e06edf48580fbfb0dd0f828af49d25"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fb3b87461fa35afa19c971b0a2b7456a7b1db7b4eba9a8424666104925b78128"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:acc2614e2e5346a4a4eab6e199203034924313626f9620b7b4b38e9ad74b7e0c"}, + {file = "pycryptodome-3.20.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:210ba1b647837bfc42dd5a813cdecb5b86193ae11a3f5d972b9a0ae2c7e9e4b4"}, + {file = "pycryptodome-3.20.0-cp35-abi3-win32.whl", hash = "sha256:8d6b98d0d83d21fb757a182d52940d028564efe8147baa9ce0f38d057104ae72"}, + {file = "pycryptodome-3.20.0-cp35-abi3-win_amd64.whl", hash = "sha256:9b3ae153c89a480a0ec402e23db8d8d84a3833b65fa4b15b81b83be9d637aab9"}, + {file = "pycryptodome-3.20.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:4401564ebf37dfde45d096974c7a159b52eeabd9969135f0426907db367a652a"}, + {file = "pycryptodome-3.20.0-pp27-pypy_73-win32.whl", hash = "sha256:ec1f93feb3bb93380ab0ebf8b859e8e5678c0f010d2d78367cf6bc30bfeb148e"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:acae12b9ede49f38eb0ef76fdec2df2e94aad85ae46ec85be3648a57f0a7db04"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f47888542a0633baff535a04726948e876bf1ed880fddb7c10a736fa99146ab3"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e0e4a987d38cfc2e71b4a1b591bae4891eeabe5fa0f56154f576e26287bfdea"}, + {file = "pycryptodome-3.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c18b381553638414b38705f07d1ef0a7cf301bc78a5f9bc17a957eb19446834b"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a60fedd2b37b4cb11ccb5d0399efe26db9e0dd149016c1cc6c8161974ceac2d6"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:405002eafad114a2f9a930f5db65feef7b53c4784495dd8758069b89baf68eab"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ab6ab0cb755154ad14e507d1df72de9897e99fd2d4922851a276ccc14f4f1a5"}, + {file = "pycryptodome-3.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:acf6e43fa75aca2d33e93409f2dafe386fe051818ee79ee8a3e21de9caa2ac9e"}, + {file = "pycryptodome-3.20.0.tar.gz", hash = "sha256:09609209ed7de61c2b560cc5c8c4fbf892f8b15b1faf7e4cbffac97db1fffda7"}, ] [[package]] name = "pycryptodomex" -version = "3.18.0" +version = "3.20.0" description = "Cryptographic library for Python" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ - {file = "pycryptodomex-3.18.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:160a39a708c36fa0b168ab79386dede588e62aec06eb505add870739329aecc6"}, - {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:c2953afebf282a444c51bf4effe751706b4d0d63d7ca2cc51db21f902aa5b84e"}, - {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:ba95abd563b0d1b88401658665a260852a8e6c647026ee6a0a65589287681df8"}, - {file = "pycryptodomex-3.18.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:192306cf881fe3467dda0e174a4f47bb3a8bb24b90c9cdfbdc248eec5fc0578c"}, - {file = "pycryptodomex-3.18.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:f9ab5ef0718f6a8716695dea16d83b671b22c45e9c0c78fd807c32c0192e54b5"}, - {file = "pycryptodomex-3.18.0-cp27-cp27m-win32.whl", hash = "sha256:50308fcdbf8345e5ec224a5502b4215178bdb5e95456ead8ab1a69ffd94779cb"}, - {file = "pycryptodomex-3.18.0-cp27-cp27m-win_amd64.whl", hash = "sha256:4d9379c684efea80fdab02a3eb0169372bca7db13f9332cb67483b8dc8b67c37"}, - {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:5594a125dae30d60e94f37797fc67ce3c744522de7992c7c360d02fdb34918f8"}, - {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:8ff129a5a0eb5ff16e45ca4fa70a6051da7f3de303c33b259063c19be0c43d35"}, - {file = "pycryptodomex-3.18.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:3d9314ac785a5b75d5aaf924c5f21d6ca7e8df442e5cf4f0fefad4f6e284d422"}, - {file = "pycryptodomex-3.18.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:f237278836dda412a325e9340ba2e6a84cb0f56b9244781e5b61f10b3905de88"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:ac614363a86cc53d8ba44b6c469831d1555947e69ab3276ae8d6edc219f570f7"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:302a8f37c224e7b5d72017d462a2be058e28f7be627bdd854066e16722d0fc0c"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:6421d23d6a648e83ba2670a352bcd978542dad86829209f59d17a3f087f4afef"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d84e105787f5e5d36ec6a581ff37a1048d12e638688074b2a00bcf402f9aa1c2"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6875eb8666f68ddbd39097867325bd22771f595b4e2b0149739b5623c8bf899b"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:27072a494ce621cc7a9096bbf60ed66826bb94db24b49b7359509e7951033e74"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:1949e09ea49b09c36d11a951b16ff2a05a0ffe969dda1846e4686ee342fe8646"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6ed3606832987018615f68e8ed716a7065c09a0fe94afd7c9ca1b6777f0ac6eb"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-win32.whl", hash = "sha256:d56c9ec41258fd3734db9f5e4d2faeabe48644ba9ca23b18e1839b3bdf093222"}, - {file = "pycryptodomex-3.18.0-cp35-abi3-win_amd64.whl", hash = "sha256:e00a4bacb83a2627e8210cb353a2e31f04befc1155db2976e5e239dd66482278"}, - {file = "pycryptodomex-3.18.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:2dc4eab20f4f04a2d00220fdc9258717b82d31913552e766d5f00282c031b70a"}, - {file = "pycryptodomex-3.18.0-pp27-pypy_73-win32.whl", hash = "sha256:75672205148bdea34669173366df005dbd52be05115e919551ee97171083423d"}, - {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bec6c80994d4e7a38312072f89458903b65ec99bed2d65aa4de96d997a53ea7a"}, - {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d35a8ffdc8b05e4b353ba281217c8437f02c57d7233363824e9d794cf753c419"}, - {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f0a46bee539dae4b3dfe37216f678769349576b0080fdbe431d19a02da42ff"}, - {file = "pycryptodomex-3.18.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:71687eed47df7e965f6e0bf3cadef98f368d5221f0fb89d2132effe1a3e6a194"}, - {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:73d64b32d84cf48d9ec62106aa277dbe99ab5fbfd38c5100bc7bddd3beb569f7"}, - {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbdcce0a226d9205560a5936b05208c709b01d493ed8307792075dedfaaffa5f"}, - {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58fc0aceb9c961b9897facec9da24c6a94c5db04597ec832060f53d4d6a07196"}, - {file = "pycryptodomex-3.18.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:215be2980a6b70704c10796dd7003eb4390e7be138ac6fb8344bf47e71a8d470"}, - {file = "pycryptodomex-3.18.0.tar.gz", hash = "sha256:3e3ecb5fe979e7c1bb0027e518340acf7ee60415d79295e5251d13c68dde576e"}, + {file = "pycryptodomex-3.20.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:645bd4ca6f543685d643dadf6a856cc382b654cc923460e3a10a49c1b3832aeb"}, + {file = "pycryptodomex-3.20.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ff5c9a67f8a4fba4aed887216e32cbc48f2a6fb2673bb10a99e43be463e15913"}, + {file = "pycryptodomex-3.20.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:8ee606964553c1a0bc74057dd8782a37d1c2bc0f01b83193b6f8bb14523b877b"}, + {file = "pycryptodomex-3.20.0-cp27-cp27m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7805830e0c56d88f4d491fa5ac640dfc894c5ec570d1ece6ed1546e9df2e98d6"}, + {file = "pycryptodomex-3.20.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:bc3ee1b4d97081260d92ae813a83de4d2653206967c4a0a017580f8b9548ddbc"}, + {file = "pycryptodomex-3.20.0-cp27-cp27m-win32.whl", hash = "sha256:8af1a451ff9e123d0d8bd5d5e60f8e3315c3a64f3cdd6bc853e26090e195cdc8"}, + {file = "pycryptodomex-3.20.0-cp27-cp27m-win_amd64.whl", hash = "sha256:cbe71b6712429650e3883dc81286edb94c328ffcd24849accac0a4dbcc76958a"}, + {file = "pycryptodomex-3.20.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:76bd15bb65c14900d98835fcd10f59e5e0435077431d3a394b60b15864fddd64"}, + {file = "pycryptodomex-3.20.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:653b29b0819605fe0898829c8ad6400a6ccde096146730c2da54eede9b7b8baa"}, + {file = "pycryptodomex-3.20.0-cp27-cp27mu-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62a5ec91388984909bb5398ea49ee61b68ecb579123694bffa172c3b0a107079"}, + {file = "pycryptodomex-3.20.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:108e5f1c1cd70ffce0b68739c75734437c919d2eaec8e85bffc2c8b4d2794305"}, + {file = "pycryptodomex-3.20.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:59af01efb011b0e8b686ba7758d59cf4a8263f9ad35911bfe3f416cee4f5c08c"}, + {file = "pycryptodomex-3.20.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:82ee7696ed8eb9a82c7037f32ba9b7c59e51dda6f105b39f043b6ef293989cb3"}, + {file = "pycryptodomex-3.20.0-cp35-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:91852d4480a4537d169c29a9d104dda44094c78f1f5b67bca76c29a91042b623"}, + {file = "pycryptodomex-3.20.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bca649483d5ed251d06daf25957f802e44e6bb6df2e8f218ae71968ff8f8edc4"}, + {file = "pycryptodomex-3.20.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e186342cfcc3aafaad565cbd496060e5a614b441cacc3995ef0091115c1f6c5"}, + {file = "pycryptodomex-3.20.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:25cd61e846aaab76d5791d006497134602a9e451e954833018161befc3b5b9ed"}, + {file = "pycryptodomex-3.20.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:9c682436c359b5ada67e882fec34689726a09c461efd75b6ea77b2403d5665b7"}, + {file = "pycryptodomex-3.20.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:7a7a8f33a1f1fb762ede6cc9cbab8f2a9ba13b196bfaf7bc6f0b39d2ba315a43"}, + {file = "pycryptodomex-3.20.0-cp35-abi3-win32.whl", hash = "sha256:c39778fd0548d78917b61f03c1fa8bfda6cfcf98c767decf360945fe6f97461e"}, + {file = "pycryptodomex-3.20.0-cp35-abi3-win_amd64.whl", hash = "sha256:2a47bcc478741b71273b917232f521fd5704ab4b25d301669879e7273d3586cc"}, + {file = "pycryptodomex-3.20.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:1be97461c439a6af4fe1cf8bf6ca5936d3db252737d2f379cc6b2e394e12a458"}, + {file = "pycryptodomex-3.20.0-pp27-pypy_73-win32.whl", hash = "sha256:19764605feea0df966445d46533729b645033f134baeb3ea26ad518c9fdf212c"}, + {file = "pycryptodomex-3.20.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e497413560e03421484189a6b65e33fe800d3bd75590e6d78d4dfdb7accf3b"}, + {file = "pycryptodomex-3.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e48217c7901edd95f9f097feaa0388da215ed14ce2ece803d3f300b4e694abea"}, + {file = "pycryptodomex-3.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d00fe8596e1cc46b44bf3907354e9377aa030ec4cd04afbbf6e899fc1e2a7781"}, + {file = "pycryptodomex-3.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:88afd7a3af7ddddd42c2deda43d53d3dfc016c11327d0915f90ca34ebda91499"}, + {file = "pycryptodomex-3.20.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d3584623e68a5064a04748fb6d76117a21a7cb5eaba20608a41c7d0c61721794"}, + {file = "pycryptodomex-3.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0daad007b685db36d977f9de73f61f8da2a7104e20aca3effd30752fd56f73e1"}, + {file = "pycryptodomex-3.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5dcac11031a71348faaed1f403a0debd56bf5404232284cf8c761ff918886ebc"}, + {file = "pycryptodomex-3.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:69138068268127cd605e03438312d8f271135a33140e2742b417d027a0539427"}, + {file = "pycryptodomex-3.20.0.tar.gz", hash = "sha256:7a710b79baddd65b806402e14766c721aee8fb83381769c27920f26476276c1e"}, ] [[package]] name = "pydantic" -version = "1.10.11" +version = "1.10.15" description = "Data validation and settings management using python type hints" optional = false python-versions = ">=3.7" files = [ - {file = "pydantic-1.10.11-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ff44c5e89315b15ff1f7fdaf9853770b810936d6b01a7bcecaa227d2f8fe444f"}, - {file = "pydantic-1.10.11-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a6c098d4ab5e2d5b3984d3cb2527e2d6099d3de85630c8934efcfdc348a9760e"}, - {file = "pydantic-1.10.11-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16928fdc9cb273c6af00d9d5045434c39afba5f42325fb990add2c241402d151"}, - {file = "pydantic-1.10.11-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0588788a9a85f3e5e9ebca14211a496409cb3deca5b6971ff37c556d581854e7"}, - {file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e9baf78b31da2dc3d3f346ef18e58ec5f12f5aaa17ac517e2ffd026a92a87588"}, - {file = "pydantic-1.10.11-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:373c0840f5c2b5b1ccadd9286782852b901055998136287828731868027a724f"}, - {file = "pydantic-1.10.11-cp310-cp310-win_amd64.whl", hash = "sha256:c3339a46bbe6013ef7bdd2844679bfe500347ac5742cd4019a88312aa58a9847"}, - {file = "pydantic-1.10.11-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:08a6c32e1c3809fbc49debb96bf833164f3438b3696abf0fbeceb417d123e6eb"}, - {file = "pydantic-1.10.11-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a451ccab49971af043ec4e0d207cbc8cbe53dbf148ef9f19599024076fe9c25b"}, - {file = "pydantic-1.10.11-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b02d24f7b2b365fed586ed73582c20f353a4c50e4be9ba2c57ab96f8091ddae"}, - {file = "pydantic-1.10.11-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f34739a89260dfa420aa3cbd069fbcc794b25bbe5c0a214f8fb29e363484b66"}, - {file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e297897eb4bebde985f72a46a7552a7556a3dd11e7f76acda0c1093e3dbcf216"}, - {file = "pydantic-1.10.11-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d185819a7a059550ecb85d5134e7d40f2565f3dd94cfd870132c5f91a89cf58c"}, - {file = "pydantic-1.10.11-cp311-cp311-win_amd64.whl", hash = "sha256:4400015f15c9b464c9db2d5d951b6a780102cfa5870f2c036d37c23b56f7fc1b"}, - {file = "pydantic-1.10.11-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2417de68290434461a266271fc57274a138510dca19982336639484c73a07af6"}, - {file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:331c031ba1554b974c98679bd0780d89670d6fd6f53f5d70b10bdc9addee1713"}, - {file = "pydantic-1.10.11-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8268a735a14c308923e8958363e3a3404f6834bb98c11f5ab43251a4e410170c"}, - {file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:44e51ba599c3ef227e168424e220cd3e544288c57829520dc90ea9cb190c3248"}, - {file = "pydantic-1.10.11-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d7781f1d13b19700b7949c5a639c764a077cbbdd4322ed505b449d3ca8edcb36"}, - {file = "pydantic-1.10.11-cp37-cp37m-win_amd64.whl", hash = "sha256:7522a7666157aa22b812ce14c827574ddccc94f361237ca6ea8bb0d5c38f1629"}, - {file = "pydantic-1.10.11-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bc64eab9b19cd794a380179ac0e6752335e9555d214cfcb755820333c0784cb3"}, - {file = "pydantic-1.10.11-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8dc77064471780262b6a68fe67e013298d130414d5aaf9b562c33987dbd2cf4f"}, - {file = "pydantic-1.10.11-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe429898f2c9dd209bd0632a606bddc06f8bce081bbd03d1c775a45886e2c1cb"}, - {file = "pydantic-1.10.11-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:192c608ad002a748e4a0bed2ddbcd98f9b56df50a7c24d9a931a8c5dd053bd3d"}, - {file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ef55392ec4bb5721f4ded1096241e4b7151ba6d50a50a80a2526c854f42e6a2f"}, - {file = "pydantic-1.10.11-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:41e0bb6efe86281623abbeeb0be64eab740c865388ee934cd3e6a358784aca6e"}, - {file = "pydantic-1.10.11-cp38-cp38-win_amd64.whl", hash = "sha256:265a60da42f9f27e0b1014eab8acd3e53bd0bad5c5b4884e98a55f8f596b2c19"}, - {file = "pydantic-1.10.11-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:469adf96c8e2c2bbfa655fc7735a2a82f4c543d9fee97bd113a7fb509bf5e622"}, - {file = "pydantic-1.10.11-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e6cbfbd010b14c8a905a7b10f9fe090068d1744d46f9e0c021db28daeb8b6de1"}, - {file = "pydantic-1.10.11-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abade85268cc92dff86d6effcd917893130f0ff516f3d637f50dadc22ae93999"}, - {file = "pydantic-1.10.11-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e9738b0f2e6c70f44ee0de53f2089d6002b10c33264abee07bdb5c7f03038303"}, - {file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:787cf23e5a0cde753f2eabac1b2e73ae3844eb873fd1f5bdbff3048d8dbb7604"}, - {file = "pydantic-1.10.11-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:174899023337b9fc685ac8adaa7b047050616136ccd30e9070627c1aaab53a13"}, - {file = "pydantic-1.10.11-cp39-cp39-win_amd64.whl", hash = "sha256:1954f8778489a04b245a1e7b8b22a9d3ea8ef49337285693cf6959e4b757535e"}, - {file = "pydantic-1.10.11-py3-none-any.whl", hash = "sha256:008c5e266c8aada206d0627a011504e14268a62091450210eda7c07fabe6963e"}, - {file = "pydantic-1.10.11.tar.gz", hash = "sha256:f66d479cf7eb331372c470614be6511eae96f1f120344c25f3f9bb59fb1b5528"}, + {file = "pydantic-1.10.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:22ed12ee588b1df028a2aa5d66f07bf8f8b4c8579c2e96d5a9c1f96b77f3bb55"}, + {file = "pydantic-1.10.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:75279d3cac98186b6ebc2597b06bcbc7244744f6b0b44a23e4ef01e5683cc0d2"}, + {file = "pydantic-1.10.15-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50f1666a9940d3d68683c9d96e39640f709d7a72ff8702987dab1761036206bb"}, + {file = "pydantic-1.10.15-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:82790d4753ee5d00739d6cb5cf56bceb186d9d6ce134aca3ba7befb1eedbc2c8"}, + {file = "pydantic-1.10.15-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:d207d5b87f6cbefbdb1198154292faee8017d7495a54ae58db06762004500d00"}, + {file = "pydantic-1.10.15-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e49db944fad339b2ccb80128ffd3f8af076f9f287197a480bf1e4ca053a866f0"}, + {file = "pydantic-1.10.15-cp310-cp310-win_amd64.whl", hash = "sha256:d3b5c4cbd0c9cb61bbbb19ce335e1f8ab87a811f6d589ed52b0254cf585d709c"}, + {file = "pydantic-1.10.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c3d5731a120752248844676bf92f25a12f6e45425e63ce22e0849297a093b5b0"}, + {file = "pydantic-1.10.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c365ad9c394f9eeffcb30a82f4246c0006417f03a7c0f8315d6211f25f7cb654"}, + {file = "pydantic-1.10.15-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3287e1614393119c67bd4404f46e33ae3be3ed4cd10360b48d0a4459f420c6a3"}, + {file = "pydantic-1.10.15-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:be51dd2c8596b25fe43c0a4a59c2bee4f18d88efb8031188f9e7ddc6b469cf44"}, + {file = "pydantic-1.10.15-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6a51a1dd4aa7b3f1317f65493a182d3cff708385327c1c82c81e4a9d6d65b2e4"}, + {file = "pydantic-1.10.15-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4e316e54b5775d1eb59187f9290aeb38acf620e10f7fd2f776d97bb788199e53"}, + {file = "pydantic-1.10.15-cp311-cp311-win_amd64.whl", hash = "sha256:0d142fa1b8f2f0ae11ddd5e3e317dcac060b951d605fda26ca9b234b92214986"}, + {file = "pydantic-1.10.15-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7ea210336b891f5ea334f8fc9f8f862b87acd5d4a0cbc9e3e208e7aa1775dabf"}, + {file = "pydantic-1.10.15-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3453685ccd7140715e05f2193d64030101eaad26076fad4e246c1cc97e1bb30d"}, + {file = "pydantic-1.10.15-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bea1f03b8d4e8e86702c918ccfd5d947ac268f0f0cc6ed71782e4b09353b26f"}, + {file = "pydantic-1.10.15-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:005655cabc29081de8243126e036f2065bd7ea5b9dff95fde6d2c642d39755de"}, + {file = "pydantic-1.10.15-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:af9850d98fc21e5bc24ea9e35dd80a29faf6462c608728a110c0a30b595e58b7"}, + {file = "pydantic-1.10.15-cp37-cp37m-win_amd64.whl", hash = "sha256:d31ee5b14a82c9afe2bd26aaa405293d4237d0591527d9129ce36e58f19f95c1"}, + {file = "pydantic-1.10.15-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5e09c19df304b8123938dc3c53d3d3be6ec74b9d7d0d80f4f4b5432ae16c2022"}, + {file = "pydantic-1.10.15-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7ac9237cd62947db00a0d16acf2f3e00d1ae9d3bd602b9c415f93e7a9fc10528"}, + {file = "pydantic-1.10.15-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:584f2d4c98ffec420e02305cf675857bae03c9d617fcfdc34946b1160213a948"}, + {file = "pydantic-1.10.15-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bbc6989fad0c030bd70a0b6f626f98a862224bc2b1e36bfc531ea2facc0a340c"}, + {file = "pydantic-1.10.15-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d573082c6ef99336f2cb5b667b781d2f776d4af311574fb53d908517ba523c22"}, + {file = "pydantic-1.10.15-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6bd7030c9abc80134087d8b6e7aa957e43d35714daa116aced57269a445b8f7b"}, + {file = "pydantic-1.10.15-cp38-cp38-win_amd64.whl", hash = "sha256:3350f527bb04138f8aff932dc828f154847fbdc7a1a44c240fbfff1b57f49a12"}, + {file = "pydantic-1.10.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:51d405b42f1b86703555797270e4970a9f9bd7953f3990142e69d1037f9d9e51"}, + {file = "pydantic-1.10.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a980a77c52723b0dc56640ced396b73a024d4b74f02bcb2d21dbbac1debbe9d0"}, + {file = "pydantic-1.10.15-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67f1a1fb467d3f49e1708a3f632b11c69fccb4e748a325d5a491ddc7b5d22383"}, + {file = "pydantic-1.10.15-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:676ed48f2c5bbad835f1a8ed8a6d44c1cd5a21121116d2ac40bd1cd3619746ed"}, + {file = "pydantic-1.10.15-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:92229f73400b80c13afcd050687f4d7e88de9234d74b27e6728aa689abcf58cc"}, + {file = "pydantic-1.10.15-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2746189100c646682eff0bce95efa7d2e203420d8e1c613dc0c6b4c1d9c1fde4"}, + {file = "pydantic-1.10.15-cp39-cp39-win_amd64.whl", hash = "sha256:394f08750bd8eaad714718812e7fab615f873b3cdd0b9d84e76e51ef3b50b6b7"}, + {file = "pydantic-1.10.15-py3-none-any.whl", hash = "sha256:28e552a060ba2740d0d2aabe35162652c1459a0b9069fe0db7f4ee0e18e74d58"}, + {file = "pydantic-1.10.15.tar.gz", hash = "sha256:ca832e124eda231a60a041da4f013e3ff24949d94a01154b137fc2f2a43c3ffb"}, ] [package.dependencies] @@ -6277,59 +6373,57 @@ test = ["pytest", "pytest-doctestplus (>=0.7)"] [[package]] name = "pyflakes" -version = "3.0.1" +version = "3.2.0" description = "passive checker of Python programs" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "pyflakes-3.0.1-py2.py3-none-any.whl", hash = "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf"}, - {file = "pyflakes-3.0.1.tar.gz", hash = "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd"}, + {file = "pyflakes-3.2.0-py2.py3-none-any.whl", hash = "sha256:84b5be138a2dfbb40689ca07e2152deb896a65c3a3e24c251c5c62489568074a"}, + {file = "pyflakes-3.2.0.tar.gz", hash = "sha256:1c61603ff154621fb2a9172037d84dca3500def8c8b630657d1701f026f8af3f"}, ] [[package]] name = "pygls" -version = "1.0.2" -description = "a pythonic generic language server (pronounced like \"pie glass\")." +version = "1.3.1" +description = "A pythonic generic language server (pronounced like 'pie glass')" optional = true -python-versions = "<4,>=3.7" +python-versions = ">=3.8" files = [ - {file = "pygls-1.0.2-py3-none-any.whl", hash = "sha256:6d278d29fa6559b0f7a448263c85cb64ec6e9369548b02f1a7944060848b21f9"}, - {file = "pygls-1.0.2.tar.gz", hash = "sha256:888ed63d1f650b4fc64d603d73d37545386ec533c0caac921aed80f80ea946a4"}, + {file = "pygls-1.3.1-py3-none-any.whl", hash = "sha256:6e00f11efc56321bdeb6eac04f6d86131f654c7d49124344a9ebb968da3dd91e"}, + {file = "pygls-1.3.1.tar.gz", hash = "sha256:140edceefa0da0e9b3c533547c892a42a7d2fd9217ae848c330c53d266a55018"}, ] [package.dependencies] -lsprotocol = "*" -typeguard = ">=3,<4" +cattrs = ">=23.1.2" +lsprotocol = "2023.0.1" [package.extras] -dev = ["bandit (==1.7.4)", "flake8 (==4.0.1)", "mypy (==0.961)"] -docs = ["sphinx (==5.0.1)", "sphinx-rtd-theme (==1.0.0)"] -test = ["pytest (==7.1.2)", "pytest-asyncio (==0.18.3)"] -ws = ["websockets (==10.*)"] +ws = ["websockets (>=11.0.3)"] [[package]] name = "pygments" -version = "2.15.1" +version = "2.17.2" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.7" files = [ - {file = "Pygments-2.15.1-py3-none-any.whl", hash = "sha256:db2db3deb4b4179f399a09054b023b6a586b76499d36965813c71aa8ed7b5fd1"}, - {file = "Pygments-2.15.1.tar.gz", hash = "sha256:8ace4d3c1dd481894b2005f560ead0f9f19ee64fe983366be1a21e171d12775c"}, + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, ] [package.extras] plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pyhdfe" -version = "0.1.2" +version = "0.2.0" description = "High dimensional fixed effect absorption with Python 3" optional = false python-versions = ">=3.6" files = [ - {file = "pyhdfe-0.1.2-py3-none-any.whl", hash = "sha256:569709e31320d899776bd00e3c9b2594baf602f30361e232ab034851855a20fe"}, - {file = "pyhdfe-0.1.2.tar.gz", hash = "sha256:a906e5d0922a65503333028e944d993ce15f4ee44e2b3ace2f79049623888432"}, + {file = "pyhdfe-0.2.0-py3-none-any.whl", hash = "sha256:5be73689101b97ff9e6e563874747257cdf86cb683159de8e16a5457130fb532"}, + {file = "pyhdfe-0.2.0.tar.gz", hash = "sha256:8cddc5f5a09148d3281fca3c787146a85ecc5a7517be3ae5762bfe507907b7fb"}, ] [package.dependencies] @@ -6374,15 +6468,20 @@ hook-testing = ["execnet (>=1.5.0)", "psutil", "pytest (>=2.7.3)"] [[package]] name = "pyinstaller-hooks-contrib" -version = "2023.6" +version = "2024.4" description = "Community maintained hooks for PyInstaller" optional = true python-versions = ">=3.7" files = [ - {file = "pyinstaller-hooks-contrib-2023.6.tar.gz", hash = "sha256:596a72009d8692b043e0acbf5e1b476d93149900142ba01845dded91a0770cb5"}, - {file = "pyinstaller_hooks_contrib-2023.6-py2.py3-none-any.whl", hash = "sha256:aa6d7d038814df6aa7bec7bdbebc7cb4c693d3398df858f6062957f0797d397b"}, + {file = "pyinstaller_hooks_contrib-2024.4-py2.py3-none-any.whl", hash = "sha256:3c521e3c710de74a4d6eeebf5b7b76c3e5b332fea8fa0baafa42c94b73908c0e"}, + {file = "pyinstaller_hooks_contrib-2024.4.tar.gz", hash = "sha256:3aad23ec9298ce675432397cda539e11a8bf77341a314e48b4da4c787ed67e8a"}, ] +[package.dependencies] +importlib-metadata = {version = ">=4.6", markers = "python_version < \"3.10\""} +packaging = ">=22.0" +setuptools = ">=42.0.0" + [[package]] name = "pylint" version = "2.17.0" @@ -6434,62 +6533,49 @@ files = [ {file = "PyMeeus-0.5.12.tar.gz", hash = "sha256:548f7186bd8b96cbc069cf649a8e8e377dce49ac74486709849fe63a99cad684"}, ] -[[package]] -name = "pympler" -version = "1.0.1" -description = "A development tool to measure, monitor and analyze the memory behavior of Python objects." -optional = false -python-versions = ">=3.6" -files = [ - {file = "Pympler-1.0.1-py3-none-any.whl", hash = "sha256:d260dda9ae781e1eab6ea15bacb84015849833ba5555f141d2d9b7b7473b307d"}, - {file = "Pympler-1.0.1.tar.gz", hash = "sha256:993f1a3599ca3f4fcd7160c7545ad06310c9e12f70174ae7ae8d4e25f6c5d3fa"}, -] - [[package]] name = "pyobjc-core" -version = "9.2" +version = "10.2" description = "Python<->ObjC Interoperability Module" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pyobjc-core-9.2.tar.gz", hash = "sha256:d734b9291fec91ff4e3ae38b9c6839debf02b79c07314476e87da8e90b2c68c3"}, - {file = "pyobjc_core-9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fa674a39949f5cde8e5c7bbcd24496446bfc67592b028aedbec7f81dc5fc4daa"}, - {file = "pyobjc_core-9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bbc8de304ee322a1ee530b4d2daca135a49b4a49aa3cedc6b2c26c43885f4842"}, - {file = "pyobjc_core-9.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0fa950f092673883b8bd28bc18397415cabb457bf410920762109b411789ade9"}, - {file = "pyobjc_core-9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:586e4cae966282eaa61b21cae66ccdcee9d69c036979def26eebdc08ddebe20f"}, - {file = "pyobjc_core-9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:41189c2c680931c0395a55691763c481fc681f454f21bb4f1644f98c24a45954"}, - {file = "pyobjc_core-9.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:2d23ee539f2ba5e9f5653d75a13f575c7e36586fc0086792739e69e4c2617eda"}, - {file = "pyobjc_core-9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b9809cf96678797acb72a758f34932fe8e2602d5ab7abec15c5ac68ddb481720"}, + {file = "pyobjc-core-10.2.tar.gz", hash = "sha256:0153206e15d0e0d7abd53ee8a7fbaf5606602a032e177a028fc8589516a8771c"}, + {file = "pyobjc_core-10.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b8eab50ce7f17017a0f1d68c3b7e88bb1bb033415fdff62b8e0a9ee4ab72f242"}, + {file = "pyobjc_core-10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f2115971463073426ab926416e17e5c16de5b90d1a1f2a2d8724637eb1c21308"}, + {file = "pyobjc_core-10.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:a70546246177c23acb323c9324330e37638f1a0a3d13664abcba3bb75e43012c"}, + {file = "pyobjc_core-10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a9b5a215080d13bd7526031d21d5eb27a410780878d863f486053a0eba7ca9a5"}, + {file = "pyobjc_core-10.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:eb1ab700a44bcc4ceb125091dfaae0b998b767b49990df5fdc83eb58158d8e3f"}, + {file = "pyobjc_core-10.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9a7163aff9c47d654f835f80361c1b112886ec754800d34e75d1e02ff52c3d7"}, ] [[package]] name = "pyobjc-framework-cocoa" -version = "9.2" +version = "10.2" description = "Wrappers for the Cocoa frameworks on macOS" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pyobjc-framework-Cocoa-9.2.tar.gz", hash = "sha256:efd78080872d8c8de6c2b97e0e4eac99d6203a5d1637aa135d071d464eb2db53"}, - {file = "pyobjc_framework_Cocoa-9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9e02d8a7cc4eb7685377c50ba4f17345701acf4c05b1e7480d421bff9e2f62a4"}, - {file = "pyobjc_framework_Cocoa-9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3b1e6287b3149e4c6679cdbccd8e9ef6557a4e492a892e80a77df143f40026d2"}, - {file = "pyobjc_framework_Cocoa-9.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:312977ce2e3989073c6b324c69ba24283de206fe7acd6dbbbaf3e29238a22537"}, - {file = "pyobjc_framework_Cocoa-9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:aae7841cf40c26dd915f4dd828f91c6616e6b7998630b72e704750c09e00f334"}, - {file = "pyobjc_framework_Cocoa-9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:739a421e14382a46cbeb9a883f192dceff368ad28ec34d895c48c0ad34cf2c1d"}, - {file = "pyobjc_framework_Cocoa-9.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:32d9ac1033fac1b821ddee8c68f972a7074ad8c50bec0bea9a719034c1c2fb94"}, - {file = "pyobjc_framework_Cocoa-9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b236bb965e41aeb2e215d4e98a5a230d4b63252c6d26e00924ea2e69540a59d6"}, + {file = "pyobjc-framework-Cocoa-10.2.tar.gz", hash = "sha256:6383141379636b13855dca1b39c032752862b829f93a49d7ddb35046abfdc035"}, + {file = "pyobjc_framework_Cocoa-10.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f9227b4f271fda2250f5a88cbc686ff30ae02c0f923bb7854bb47972397496b2"}, + {file = "pyobjc_framework_Cocoa-10.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6a6042b7703bdc33b7491959c715c1e810a3f8c7a560c94b36e00ef321480797"}, + {file = "pyobjc_framework_Cocoa-10.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:18886d5013cd7dc7ecd6e0df5134c767569b5247fc10a5e293c72ee3937b217b"}, + {file = "pyobjc_framework_Cocoa-10.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1ecf01400ee698d2e0ff4c907bcf9608d9d710e97203fbb97b37d208507a9362"}, + {file = "pyobjc_framework_Cocoa-10.2-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:0def036a7b24e3ae37a244c77bec96b7c9c8384bf6bb4d33369f0a0c8807a70d"}, + {file = "pyobjc_framework_Cocoa-10.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5f47ecc393bc1019c4b47e8653207188df784ac006ad54d8c2eb528906ff7013"}, ] [package.dependencies] -pyobjc-core = ">=9.2" +pyobjc-core = ">=10.2" [[package]] name = "pyod" -version = "1.1.0" +version = "1.1.3" description = "A Comprehensive and Scalable Python Library for Outlier Detection (Anomaly Detection)" optional = true python-versions = "*" files = [ - {file = "pyod-1.1.0.tar.gz", hash = "sha256:e4d948989c198e0b7dd0c3096db9b8bf63fc14e1a2b9c60785d04a006641c52a"}, + {file = "pyod-1.1.3.tar.gz", hash = "sha256:ae39808c8da04ce47eee3757ef641feb67e610bddb134b3362fd6f5cb2c6c7cd"}, ] [package.dependencies] @@ -6497,19 +6583,19 @@ joblib = "*" matplotlib = "*" numba = ">=0.51" numpy = ">=1.19" -scikit_learn = ">=0.20.0" +scikit_learn = ">=0.22.0" scipy = ">=1.5.1" six = "*" [[package]] name = "pyparsing" -version = "3.0.9" +version = "3.1.2" description = "pyparsing module - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.6.8" files = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, + {file = "pyparsing-3.1.2-py3-none-any.whl", hash = "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742"}, + {file = "pyparsing-3.1.2.tar.gz", hash = "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad"}, ] [package.extras] @@ -6606,17 +6692,17 @@ testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtuale [[package]] name = "pytest-mock" -version = "3.11.1" +version = "3.14.0" description = "Thin-wrapper around the mock package for easier use with pytest" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pytest-mock-3.11.1.tar.gz", hash = "sha256:7f6b125602ac6d743e523ae0bfa71e1a697a2f5534064528c6ff84c2f7c2fc7f"}, - {file = "pytest_mock-3.11.1-py3-none-any.whl", hash = "sha256:21c279fff83d70763b05f8874cc9cfb3fcacd6d354247a976f9529d19f9acf39"}, + {file = "pytest-mock-3.14.0.tar.gz", hash = "sha256:2719255a1efeceadbc056d6bf3df3d1c5015530fb40cf347c0f9afac88410bd0"}, + {file = "pytest_mock-3.14.0-py3-none-any.whl", hash = "sha256:0b72c38033392a5f4621342fe11e9219ac11ec9d375f8e2a0c164539e0d70f6f"}, ] [package.dependencies] -pytest = ">=5.0" +pytest = ">=6.2.5" [package.extras] dev = ["pre-commit", "pytest-asyncio", "tox"] @@ -6654,13 +6740,13 @@ vcrpy = ">=2.0.1" [[package]] name = "pytest-timeout" -version = "2.1.0" +version = "2.2.0" description = "pytest plugin to abort hanging tests" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "pytest-timeout-2.1.0.tar.gz", hash = "sha256:c07ca07404c612f8abbe22294b23c368e2e5104b521c1790195561f37e1ac3d9"}, - {file = "pytest_timeout-2.1.0-py3-none-any.whl", hash = "sha256:f6f50101443ce70ad325ceb4473c4255e9d74e3c7cd0ef827309dfa4c0d975c6"}, + {file = "pytest-timeout-2.2.0.tar.gz", hash = "sha256:3b0b95dabf3cb50bac9ef5ca912fa0cfc286526af17afc806824df20c2f72c90"}, + {file = "pytest_timeout-2.2.0-py3-none-any.whl", hash = "sha256:bde531e096466f49398a59f2dde76fa78429a09a12411466f88a07213e220de2"}, ] [package.dependencies] @@ -6668,13 +6754,13 @@ pytest = ">=5.0.0" [[package]] name = "pytest-xdist" -version = "3.3.1" +version = "3.5.0" description = "pytest xdist plugin for distributed testing, most importantly across multiple CPUs" optional = false python-versions = ">=3.7" files = [ - {file = "pytest-xdist-3.3.1.tar.gz", hash = "sha256:d5ee0520eb1b7bcca50a60a518ab7a7707992812c578198f8b44fdfac78e8c93"}, - {file = "pytest_xdist-3.3.1-py3-none-any.whl", hash = "sha256:ff9daa7793569e6a68544850fd3927cd257cc03a7ef76c95e86915355e82b5f2"}, + {file = "pytest-xdist-3.5.0.tar.gz", hash = "sha256:cbb36f3d67e0c478baa57fa4edc8843887e0f6cfc42d677530a36d7472b32d8a"}, + {file = "pytest_xdist-3.5.0-py3-none-any.whl", hash = "sha256:d075629c7e00b611df89f490a5063944bee7a4362a5ff11c7cc7824a03dfce24"}, ] [package.dependencies] @@ -6713,13 +6799,13 @@ testing = ["aiodns", "aiohttp (>=3.7.4)", "backoff", "base58", "dnspython", "fla [[package]] name = "python-binance" -version = "1.0.17" +version = "1.0.19" description = "Binance REST API python implementation" optional = false python-versions = "*" files = [ - {file = "python-binance-1.0.17.tar.gz", hash = "sha256:364a0ff0d2892867d6851d90e8567c54a194fc62783f20da766a5c7655f57746"}, - {file = "python_binance-1.0.17-py2.py3-none-any.whl", hash = "sha256:c939ca15da1968df6290d14cd79c0f9521b1220c21fdfb75706aa47560a672ae"}, + {file = "python-binance-1.0.19.tar.gz", hash = "sha256:b58cb5313d4fafbcfab3afe6082fff8ba4ebf7261211e7a322c2137637825e82"}, + {file = "python_binance-1.0.19-py2.py3-none-any.whl", hash = "sha256:aabc86955e3f99d5e8b1d49796eb584127af4c44f3eaab64ef92b8ee8fa88bff"}, ] [package.dependencies] @@ -6745,13 +6831,13 @@ files = [ [[package]] name = "python-dateutil" -version = "2.8.2" +version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, ] [package.dependencies] @@ -6759,13 +6845,13 @@ six = ">=1.5" [[package]] name = "python-dotenv" -version = "1.0.0" +version = "1.0.1" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.8" files = [ - {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, - {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, + {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, + {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, ] [package.extras] @@ -6872,30 +6958,15 @@ requests = ">=2.0" [[package]] name = "pytz" -version = "2023.3" +version = "2024.1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" files = [ - {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, - {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, + {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, + {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, ] -[[package]] -name = "pytz-deprecation-shim" -version = "0.1.0.post0" -description = "Shims to make deprecation of pytz easier" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" -files = [ - {file = "pytz_deprecation_shim-0.1.0.post0-py2.py3-none-any.whl", hash = "sha256:8314c9692a636c8eb3bda879b9f119e350e93223ae83e70e80c31675a0fdc1a6"}, - {file = "pytz_deprecation_shim-0.1.0.post0.tar.gz", hash = "sha256:af097bae1b616dde5c5744441e2ddc69e74dfdcb0c263129610d85b87445a59d"}, -] - -[package.dependencies] -"backports.zoneinfo" = {version = "*", markers = "python_version >= \"3.6\" and python_version < \"3.9\""} -tzdata = {version = "*", markers = "python_version >= \"3.6\""} - [[package]] name = "pywin32" version = "306" @@ -6932,29 +7003,30 @@ files = [ [[package]] name = "pywinpty" -version = "2.0.11" +version = "2.0.13" description = "Pseudo terminal support for Windows from Python." optional = false python-versions = ">=3.8" files = [ - {file = "pywinpty-2.0.11-cp310-none-win_amd64.whl", hash = "sha256:452f10ac9ff8ab9151aa8cea9e491a9612a12250b1899278c6a56bc184afb47f"}, - {file = "pywinpty-2.0.11-cp311-none-win_amd64.whl", hash = "sha256:6701867d42aec1239bc0fedf49a336570eb60eb886e81763db77ea2b6c533cc3"}, - {file = "pywinpty-2.0.11-cp38-none-win_amd64.whl", hash = "sha256:0ffd287751ad871141dc9724de70ea21f7fc2ff1af50861e0d232cf70739d8c4"}, - {file = "pywinpty-2.0.11-cp39-none-win_amd64.whl", hash = "sha256:e4e7f023c28ca7aa8e1313e53ba80a4d10171fe27857b7e02f99882dfe3e8638"}, - {file = "pywinpty-2.0.11.tar.gz", hash = "sha256:e244cffe29a894876e2cd251306efd0d8d64abd5ada0a46150a4a71c0b9ad5c5"}, + {file = "pywinpty-2.0.13-cp310-none-win_amd64.whl", hash = "sha256:697bff211fb5a6508fee2dc6ff174ce03f34a9a233df9d8b5fe9c8ce4d5eaf56"}, + {file = "pywinpty-2.0.13-cp311-none-win_amd64.whl", hash = "sha256:b96fb14698db1284db84ca38c79f15b4cfdc3172065b5137383910567591fa99"}, + {file = "pywinpty-2.0.13-cp312-none-win_amd64.whl", hash = "sha256:2fd876b82ca750bb1333236ce98488c1be96b08f4f7647cfdf4129dfad83c2d4"}, + {file = "pywinpty-2.0.13-cp38-none-win_amd64.whl", hash = "sha256:61d420c2116c0212808d31625611b51caf621fe67f8a6377e2e8b617ea1c1f7d"}, + {file = "pywinpty-2.0.13-cp39-none-win_amd64.whl", hash = "sha256:71cb613a9ee24174730ac7ae439fd179ca34ccb8c5349e8d7b72ab5dea2c6f4b"}, + {file = "pywinpty-2.0.13.tar.gz", hash = "sha256:c34e32351a3313ddd0d7da23d27f835c860d32fe4ac814d372a3ea9594f41dde"}, ] [[package]] name = "pywry" -version = "0.6.1" +version = "0.6.2" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "pywry-0.6.1-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:ce0250bf88bd795bc2751daae162f03e9c3f64a2c0275edf4b376c180090154b"}, - {file = "pywry-0.6.1-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:8f7dba93babc10eb49682dc8811afe5a9f108772e6a09457173b9c2b30f00e41"}, - {file = "pywry-0.6.1-py3-none-win_amd64.whl", hash = "sha256:537381db5ec246a99e583260613f20a1a2b92829e53e2faa393537f1edc71476"}, - {file = "pywry-0.6.1.tar.gz", hash = "sha256:0ef6a303d1c90db15e9ac62c337fa0b050dd73d3ece5005a96a97576fdc524ed"}, + {file = "pywry-0.6.2-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:45d6bb827bf76b2532a9d70b539209d70f37dfb13e9862549b7bff8500ad2495"}, + {file = "pywry-0.6.2-py3-none-manylinux_2_28_x86_64.whl", hash = "sha256:1d9ffd826a3a08c132843340e6d896efb7b972b301d045e3239a7dc08d9cac2f"}, + {file = "pywry-0.6.2-py3-none-win_amd64.whl", hash = "sha256:4f0e5b502555ee8b8e799baeaebe63243a84b7ce51df01a1c439dbc4e8227b9e"}, + {file = "pywry-0.6.2.tar.gz", hash = "sha256:9bd88c36ab0860728d9e64360010f8abcede43645656030e4a63e69e81a98c95"}, ] [package.dependencies] @@ -6988,6 +7060,7 @@ files = [ {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"}, @@ -7024,119 +7097,120 @@ files = [ [[package]] name = "pyzmq" -version = "25.1.0" +version = "24.0.1" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.6" files = [ - {file = "pyzmq-25.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:1a6169e69034eaa06823da6a93a7739ff38716142b3596c180363dee729d713d"}, - {file = "pyzmq-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:19d0383b1f18411d137d891cab567de9afa609b214de68b86e20173dc624c101"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f1e931d9a92f628858a50f5bdffdfcf839aebe388b82f9d2ccd5d22a38a789dc"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:97d984b1b2f574bc1bb58296d3c0b64b10e95e7026f8716ed6c0b86d4679843f"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:154bddda2a351161474b36dba03bf1463377ec226a13458725183e508840df89"}, - {file = "pyzmq-25.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cb6d161ae94fb35bb518b74bb06b7293299c15ba3bc099dccd6a5b7ae589aee3"}, - {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:90146ab578931e0e2826ee39d0c948d0ea72734378f1898939d18bc9c823fcf9"}, - {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:831ba20b660b39e39e5ac8603e8193f8fce1ee03a42c84ade89c36a251449d80"}, - {file = "pyzmq-25.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3a522510e3434e12aff80187144c6df556bb06fe6b9d01b2ecfbd2b5bfa5c60c"}, - {file = "pyzmq-25.1.0-cp310-cp310-win32.whl", hash = "sha256:be24a5867b8e3b9dd5c241de359a9a5217698ff616ac2daa47713ba2ebe30ad1"}, - {file = "pyzmq-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:5693dcc4f163481cf79e98cf2d7995c60e43809e325b77a7748d8024b1b7bcba"}, - {file = "pyzmq-25.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:13bbe36da3f8aaf2b7ec12696253c0bf6ffe05f4507985a8844a1081db6ec22d"}, - {file = "pyzmq-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:69511d604368f3dc58d4be1b0bad99b61ee92b44afe1cd9b7bd8c5e34ea8248a"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a983c8694667fd76d793ada77fd36c8317e76aa66eec75be2653cef2ea72883"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:332616f95eb400492103ab9d542b69d5f0ff628b23129a4bc0a2fd48da6e4e0b"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58416db767787aedbfd57116714aad6c9ce57215ffa1c3758a52403f7c68cff5"}, - {file = "pyzmq-25.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:cad9545f5801a125f162d09ec9b724b7ad9b6440151b89645241d0120e119dcc"}, - {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d6128d431b8dfa888bf51c22a04d48bcb3d64431caf02b3cb943269f17fd2994"}, - {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2b15247c49d8cbea695b321ae5478d47cffd496a2ec5ef47131a9e79ddd7e46c"}, - {file = "pyzmq-25.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:442d3efc77ca4d35bee3547a8e08e8d4bb88dadb54a8377014938ba98d2e074a"}, - {file = "pyzmq-25.1.0-cp311-cp311-win32.whl", hash = "sha256:65346f507a815a731092421d0d7d60ed551a80d9b75e8b684307d435a5597425"}, - {file = "pyzmq-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:8b45d722046fea5a5694cba5d86f21f78f0052b40a4bbbbf60128ac55bfcc7b6"}, - {file = "pyzmq-25.1.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f45808eda8b1d71308c5416ef3abe958f033fdbb356984fabbfc7887bed76b3f"}, - {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8b697774ea8273e3c0460cf0bba16cd85ca6c46dfe8b303211816d68c492e132"}, - {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b324fa769577fc2c8f5efcd429cef5acbc17d63fe15ed16d6dcbac2c5eb00849"}, - {file = "pyzmq-25.1.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:5873d6a60b778848ce23b6c0ac26c39e48969823882f607516b91fb323ce80e5"}, - {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:f0d9e7ba6a815a12c8575ba7887da4b72483e4cfc57179af10c9b937f3f9308f"}, - {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:414b8beec76521358b49170db7b9967d6974bdfc3297f47f7d23edec37329b00"}, - {file = "pyzmq-25.1.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:01f06f33e12497dca86353c354461f75275a5ad9eaea181ac0dc1662da8074fa"}, - {file = "pyzmq-25.1.0-cp36-cp36m-win32.whl", hash = "sha256:b5a07c4f29bf7cb0164664ef87e4aa25435dcc1f818d29842118b0ac1eb8e2b5"}, - {file = "pyzmq-25.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:968b0c737797c1809ec602e082cb63e9824ff2329275336bb88bd71591e94a90"}, - {file = "pyzmq-25.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:47b915ba666c51391836d7ed9a745926b22c434efa76c119f77bcffa64d2c50c"}, - {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5af31493663cf76dd36b00dafbc839e83bbca8a0662931e11816d75f36155897"}, - {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5489738a692bc7ee9a0a7765979c8a572520d616d12d949eaffc6e061b82b4d1"}, - {file = "pyzmq-25.1.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1fc56a0221bdf67cfa94ef2d6ce5513a3d209c3dfd21fed4d4e87eca1822e3a3"}, - {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:75217e83faea9edbc29516fc90c817bc40c6b21a5771ecb53e868e45594826b0"}, - {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3830be8826639d801de9053cf86350ed6742c4321ba4236e4b5568528d7bfed7"}, - {file = "pyzmq-25.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3575699d7fd7c9b2108bc1c6128641a9a825a58577775ada26c02eb29e09c517"}, - {file = "pyzmq-25.1.0-cp37-cp37m-win32.whl", hash = "sha256:95bd3a998d8c68b76679f6b18f520904af5204f089beebb7b0301d97704634dd"}, - {file = "pyzmq-25.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:dbc466744a2db4b7ca05589f21ae1a35066afada2f803f92369f5877c100ef62"}, - {file = "pyzmq-25.1.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:3bed53f7218490c68f0e82a29c92335daa9606216e51c64f37b48eb78f1281f4"}, - {file = "pyzmq-25.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eb52e826d16c09ef87132c6e360e1879c984f19a4f62d8a935345deac43f3c12"}, - {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ddbef8b53cd16467fdbfa92a712eae46dd066aa19780681a2ce266e88fbc7165"}, - {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9301cf1d7fc1ddf668d0abbe3e227fc9ab15bc036a31c247276012abb921b5ff"}, - {file = "pyzmq-25.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e23a8c3b6c06de40bdb9e06288180d630b562db8ac199e8cc535af81f90e64b"}, - {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4a82faae00d1eed4809c2f18b37f15ce39a10a1c58fe48b60ad02875d6e13d80"}, - {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c8398a1b1951aaa330269c35335ae69744be166e67e0ebd9869bdc09426f3871"}, - {file = "pyzmq-25.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d40682ac60b2a613d36d8d3a0cd14fbdf8e7e0618fbb40aa9fa7b796c9081584"}, - {file = "pyzmq-25.1.0-cp38-cp38-win32.whl", hash = "sha256:33d5c8391a34d56224bccf74f458d82fc6e24b3213fc68165c98b708c7a69325"}, - {file = "pyzmq-25.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:c66b7ff2527e18554030319b1376d81560ca0742c6e0b17ff1ee96624a5f1afd"}, - {file = "pyzmq-25.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:af56229ea6527a849ac9fb154a059d7e32e77a8cba27e3e62a1e38d8808cb1a5"}, - {file = "pyzmq-25.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bdca18b94c404af6ae5533cd1bc310c4931f7ac97c148bbfd2cd4bdd62b96253"}, - {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0b6b42f7055bbc562f63f3df3b63e3dd1ebe9727ff0f124c3aa7bcea7b3a00f9"}, - {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c2fc7aad520a97d64ffc98190fce6b64152bde57a10c704b337082679e74f67"}, - {file = "pyzmq-25.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be86a26415a8b6af02cd8d782e3a9ae3872140a057f1cadf0133de685185c02b"}, - {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:851fb2fe14036cfc1960d806628b80276af5424db09fe5c91c726890c8e6d943"}, - {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2a21fec5c3cea45421a19ccbe6250c82f97af4175bc09de4d6dd78fb0cb4c200"}, - {file = "pyzmq-25.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bad172aba822444b32eae54c2d5ab18cd7dee9814fd5c7ed026603b8cae2d05f"}, - {file = "pyzmq-25.1.0-cp39-cp39-win32.whl", hash = "sha256:4d67609b37204acad3d566bb7391e0ecc25ef8bae22ff72ebe2ad7ffb7847158"}, - {file = "pyzmq-25.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:71c7b5896e40720d30cd77a81e62b433b981005bbff0cb2f739e0f8d059b5d99"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:4cb27ef9d3bdc0c195b2dc54fcb8720e18b741624686a81942e14c8b67cc61a6"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0c4fc2741e0513b5d5a12fe200d6785bbcc621f6f2278893a9ca7bed7f2efb7d"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fc34fdd458ff77a2a00e3c86f899911f6f269d393ca5675842a6e92eea565bae"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8751f9c1442624da391bbd92bd4b072def6d7702a9390e4479f45c182392ff78"}, - {file = "pyzmq-25.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:6581e886aec3135964a302a0f5eb68f964869b9efd1dbafdebceaaf2934f8a68"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5482f08d2c3c42b920e8771ae8932fbaa0a67dff925fc476996ddd8155a170f3"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5e7fbcafa3ea16d1de1f213c226005fea21ee16ed56134b75b2dede5a2129e62"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:adecf6d02b1beab8d7c04bc36f22bb0e4c65a35eb0b4750b91693631d4081c70"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6d39e42a0aa888122d1beb8ec0d4ddfb6c6b45aecb5ba4013c27e2f28657765"}, - {file = "pyzmq-25.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:7018289b402ebf2b2c06992813523de61d4ce17bd514c4339d8f27a6f6809492"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9e68ae9864d260b18f311b68d29134d8776d82e7f5d75ce898b40a88df9db30f"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e21cc00e4debe8f54c3ed7b9fcca540f46eee12762a9fa56feb8512fd9057161"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f666ae327a6899ff560d741681fdcdf4506f990595201ed39b44278c471ad98"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f5efcc29056dfe95e9c9db0dfbb12b62db9c4ad302f812931b6d21dd04a9119"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:48e5e59e77c1a83162ab3c163fc01cd2eebc5b34560341a67421b09be0891287"}, - {file = "pyzmq-25.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:108c96ebbd573d929740d66e4c3d1bdf31d5cde003b8dc7811a3c8c5b0fc173b"}, - {file = "pyzmq-25.1.0.tar.gz", hash = "sha256:80c41023465d36280e801564a69cbfce8ae85ff79b080e1913f6e90481fb8957"}, + {file = "pyzmq-24.0.1-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:28b119ba97129d3001673a697b7cce47fe6de1f7255d104c2f01108a5179a066"}, + {file = "pyzmq-24.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bcbebd369493d68162cddb74a9c1fcebd139dfbb7ddb23d8f8e43e6c87bac3a6"}, + {file = "pyzmq-24.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae61446166983c663cee42c852ed63899e43e484abf080089f771df4b9d272ef"}, + {file = "pyzmq-24.0.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:87f7ac99b15270db8d53f28c3c7b968612993a90a5cf359da354efe96f5372b4"}, + {file = "pyzmq-24.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9dca7c3956b03b7663fac4d150f5e6d4f6f38b2462c1e9afd83bcf7019f17913"}, + {file = "pyzmq-24.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8c78bfe20d4c890cb5580a3b9290f700c570e167d4cdcc55feec07030297a5e3"}, + {file = "pyzmq-24.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:48f721f070726cd2a6e44f3c33f8ee4b24188e4b816e6dd8ba542c8c3bb5b246"}, + {file = "pyzmq-24.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:afe1f3bc486d0ce40abb0a0c9adb39aed3bbac36ebdc596487b0cceba55c21c1"}, + {file = "pyzmq-24.0.1-cp310-cp310-win32.whl", hash = "sha256:3e6192dbcefaaa52ed81be88525a54a445f4b4fe2fffcae7fe40ebb58bd06bfd"}, + {file = "pyzmq-24.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:86de64468cad9c6d269f32a6390e210ca5ada568c7a55de8e681ca3b897bb340"}, + {file = "pyzmq-24.0.1-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:838812c65ed5f7c2bd11f7b098d2e5d01685a3f6d1f82849423b570bae698c00"}, + {file = "pyzmq-24.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:dfb992dbcd88d8254471760879d48fb20836d91baa90f181c957122f9592b3dc"}, + {file = "pyzmq-24.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7abddb2bd5489d30ffeb4b93a428130886c171b4d355ccd226e83254fcb6b9ef"}, + {file = "pyzmq-24.0.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:94010bd61bc168c103a5b3b0f56ed3b616688192db7cd5b1d626e49f28ff51b3"}, + {file = "pyzmq-24.0.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:8242543c522d84d033fe79be04cb559b80d7eb98ad81b137ff7e0a9020f00ace"}, + {file = "pyzmq-24.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ccb94342d13e3bf3ffa6e62f95b5e3f0bc6bfa94558cb37f4b3d09d6feb536ff"}, + {file = "pyzmq-24.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6640f83df0ae4ae1104d4c62b77e9ef39be85ebe53f636388707d532bee2b7b8"}, + {file = "pyzmq-24.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a180dbd5ea5d47c2d3b716d5c19cc3fb162d1c8db93b21a1295d69585bfddac1"}, + {file = "pyzmq-24.0.1-cp311-cp311-win32.whl", hash = "sha256:624321120f7e60336be8ec74a172ae7fba5c3ed5bf787cc85f7e9986c9e0ebc2"}, + {file = "pyzmq-24.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:1724117bae69e091309ffb8255412c4651d3f6355560d9af312d547f6c5bc8b8"}, + {file = "pyzmq-24.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:15975747462ec49fdc863af906bab87c43b2491403ab37a6d88410635786b0f4"}, + {file = "pyzmq-24.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b947e264f0e77d30dcbccbb00f49f900b204b922eb0c3a9f0afd61aaa1cedc3d"}, + {file = "pyzmq-24.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0ec91f1bad66f3ee8c6deb65fa1fe418e8ad803efedd69c35f3b5502f43bd1dc"}, + {file = "pyzmq-24.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:db03704b3506455d86ec72c3358a779e9b1d07b61220dfb43702b7b668edcd0d"}, + {file = "pyzmq-24.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:e7e66b4e403c2836ac74f26c4b65d8ac0ca1eef41dfcac2d013b7482befaad83"}, + {file = "pyzmq-24.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:7a23ccc1083c260fa9685c93e3b170baba45aeed4b524deb3f426b0c40c11639"}, + {file = "pyzmq-24.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fa0ae3275ef706c0309556061185dd0e4c4cd3b7d6f67ae617e4e677c7a41e2e"}, + {file = "pyzmq-24.0.1-cp36-cp36m-win32.whl", hash = "sha256:f01de4ec083daebf210531e2cca3bdb1608dbbbe00a9723e261d92087a1f6ebc"}, + {file = "pyzmq-24.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:de4217b9eb8b541cf2b7fde4401ce9d9a411cc0af85d410f9d6f4333f43640be"}, + {file = "pyzmq-24.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:78068e8678ca023594e4a0ab558905c1033b2d3e806a0ad9e3094e231e115a33"}, + {file = "pyzmq-24.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77c2713faf25a953c69cf0f723d1b7dd83827b0834e6c41e3fb3bbc6765914a1"}, + {file = "pyzmq-24.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8bb4af15f305056e95ca1bd086239b9ebc6ad55e9f49076d27d80027f72752f6"}, + {file = "pyzmq-24.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0f14cffd32e9c4c73da66db97853a6aeceaac34acdc0fae9e5bbc9370281864c"}, + {file = "pyzmq-24.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0108358dab8c6b27ff6b985c2af4b12665c1bc659648284153ee501000f5c107"}, + {file = "pyzmq-24.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d66689e840e75221b0b290b0befa86f059fb35e1ee6443bce51516d4d61b6b99"}, + {file = "pyzmq-24.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ae08ac90aa8fa14caafc7a6251bd218bf6dac518b7bff09caaa5e781119ba3f2"}, + {file = "pyzmq-24.0.1-cp37-cp37m-win32.whl", hash = "sha256:8421aa8c9b45ea608c205db9e1c0c855c7e54d0e9c2c2f337ce024f6843cab3b"}, + {file = "pyzmq-24.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:54d8b9c5e288362ec8595c1d98666d36f2070fd0c2f76e2b3c60fbad9bd76227"}, + {file = "pyzmq-24.0.1-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:acbd0a6d61cc954b9f535daaa9ec26b0a60a0d4353c5f7c1438ebc88a359a47e"}, + {file = "pyzmq-24.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:47b11a729d61a47df56346283a4a800fa379ae6a85870d5a2e1e4956c828eedc"}, + {file = "pyzmq-24.0.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:abe6eb10122f0d746a0d510c2039ae8edb27bc9af29f6d1b05a66cc2401353ff"}, + {file = "pyzmq-24.0.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:07bec1a1b22dacf718f2c0e71b49600bb6a31a88f06527dfd0b5aababe3fa3f7"}, + {file = "pyzmq-24.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0d945a85b70da97ae86113faf9f1b9294efe66bd4a5d6f82f2676d567338b66"}, + {file = "pyzmq-24.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1b7928bb7580736ffac5baf814097be342ba08d3cfdfb48e52773ec959572287"}, + {file = "pyzmq-24.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b946da90dc2799bcafa682692c1d2139b2a96ec3c24fa9fc6f5b0da782675330"}, + {file = "pyzmq-24.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:c8840f064b1fb377cffd3efeaad2b190c14d4c8da02316dae07571252d20b31f"}, + {file = "pyzmq-24.0.1-cp38-cp38-win32.whl", hash = "sha256:4854f9edc5208f63f0841c0c667260ae8d6846cfa233c479e29fdc85d42ebd58"}, + {file = "pyzmq-24.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:42d4f97b9795a7aafa152a36fe2ad44549b83a743fd3e77011136def512e6c2a"}, + {file = "pyzmq-24.0.1-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:52afb0ac962963fff30cf1be775bc51ae083ef4c1e354266ab20e5382057dd62"}, + {file = "pyzmq-24.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8bad8210ad4df68c44ff3685cca3cda448ee46e20d13edcff8909eba6ec01ca4"}, + {file = "pyzmq-24.0.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dabf1a05318d95b1537fd61d9330ef4313ea1216eea128a17615038859da3b3b"}, + {file = "pyzmq-24.0.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5bd3d7dfd9cd058eb68d9a905dec854f86649f64d4ddf21f3ec289341386c44b"}, + {file = "pyzmq-24.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8012bce6836d3f20a6c9599f81dfa945f433dab4dbd0c4917a6fb1f998ab33d"}, + {file = "pyzmq-24.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c31805d2c8ade9b11feca4674eee2b9cce1fec3e8ddb7bbdd961a09dc76a80ea"}, + {file = "pyzmq-24.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:3104f4b084ad5d9c0cb87445cc8cfd96bba710bef4a66c2674910127044df209"}, + {file = "pyzmq-24.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:df0841f94928f8af9c7a1f0aaaffba1fb74607af023a152f59379c01c53aee58"}, + {file = "pyzmq-24.0.1-cp39-cp39-win32.whl", hash = "sha256:a435ef8a3bd95c8a2d316d6e0ff70d0db524f6037411652803e118871d703333"}, + {file = "pyzmq-24.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:2032d9cb994ce3b4cba2b8dfae08c7e25bc14ba484c770d4d3be33c27de8c45b"}, + {file = "pyzmq-24.0.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bb5635c851eef3a7a54becde6da99485eecf7d068bd885ac8e6d173c4ecd68b0"}, + {file = "pyzmq-24.0.1-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:83ea1a398f192957cb986d9206ce229efe0ee75e3c6635baff53ddf39bd718d5"}, + {file = "pyzmq-24.0.1-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:941fab0073f0a54dc33d1a0460cb04e0d85893cb0c5e1476c785000f8b359409"}, + {file = "pyzmq-24.0.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e8f482c44ccb5884bf3f638f29bea0f8dc68c97e38b2061769c4cb697f6140d"}, + {file = "pyzmq-24.0.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:613010b5d17906c4367609e6f52e9a2595e35d5cc27d36ff3f1b6fa6e954d944"}, + {file = "pyzmq-24.0.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:65c94410b5a8355cfcf12fd600a313efee46ce96a09e911ea92cf2acf6708804"}, + {file = "pyzmq-24.0.1-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:20e7eeb1166087db636c06cae04a1ef59298627f56fb17da10528ab52a14c87f"}, + {file = "pyzmq-24.0.1-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a2712aee7b3834ace51738c15d9ee152cc5a98dc7d57dd93300461b792ab7b43"}, + {file = "pyzmq-24.0.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a7c280185c4da99e0cc06c63bdf91f5b0b71deb70d8717f0ab870a43e376db8"}, + {file = "pyzmq-24.0.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:858375573c9225cc8e5b49bfac846a77b696b8d5e815711b8d4ba3141e6e8879"}, + {file = "pyzmq-24.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:80093b595921eed1a2cead546a683b9e2ae7f4a4592bb2ab22f70d30174f003a"}, + {file = "pyzmq-24.0.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f3f3154fde2b1ff3aa7b4f9326347ebc89c8ef425ca1db8f665175e6d3bd42f"}, + {file = "pyzmq-24.0.1-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abb756147314430bee5d10919b8493c0ccb109ddb7f5dfd2fcd7441266a25b75"}, + {file = "pyzmq-24.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44e706bac34e9f50779cb8c39f10b53a4d15aebb97235643d3112ac20bd577b4"}, + {file = "pyzmq-24.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:687700f8371643916a1d2c61f3fdaa630407dd205c38afff936545d7b7466066"}, + {file = "pyzmq-24.0.1.tar.gz", hash = "sha256:216f5d7dbb67166759e59b0479bca82b8acf9bed6015b526b8eb10143fb08e77"}, ] [package.dependencies] cffi = {version = "*", markers = "implementation_name == \"pypy\""} +py = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] name = "qdldl" -version = "0.1.7.post0" +version = "0.1.7.post2" description = "QDLDL, a free LDL factorization routine." optional = true python-versions = "*" files = [ - {file = "qdldl-0.1.7.post0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8ab02e8b9ff86bd644a1935718387c82fbe04c31e3309cf9f7a121d02b1deda8"}, - {file = "qdldl-0.1.7.post0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e5d6753310377451ed4dc09b1ef28faf40108b713e7f55c8a8ae94d679a672"}, - {file = "qdldl-0.1.7.post0-cp310-cp310-win_amd64.whl", hash = "sha256:718d8e141832e96ba71ca1807a74813836c6403110faaa3d33a67de1af3b29c4"}, - {file = "qdldl-0.1.7.post0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0e3f06e8a49ddd834b24fc3d7afbba4fec0923101045aa2666e18d2a9980e329"}, - {file = "qdldl-0.1.7.post0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a81c46522dd6b3042e2348fa98128bb5c0e466f42bce214e80cfb766ff40930"}, - {file = "qdldl-0.1.7.post0-cp311-cp311-win_amd64.whl", hash = "sha256:4a86155f3de66c5db0e21544b7a2421c671028fa20da407686d2a8d0e9b57e51"}, - {file = "qdldl-0.1.7.post0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:717cb1892b033c01a0aae84ededcfa1f05bcb97013095d779c497e6c32f90dac"}, - {file = "qdldl-0.1.7.post0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8fc35432913085d94b2327242cf51388467ef7a37ac0d71eb31b594b575dd498"}, - {file = "qdldl-0.1.7.post0-cp36-cp36m-win_amd64.whl", hash = "sha256:fd5cfd8c50f33ddacb830594a63b8c1093a24aea45312b9d2ed826cea5ece08a"}, - {file = "qdldl-0.1.7.post0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:981ca8672e9506976c663552c1eb6f6daf9726d62650b3bf5900260946156166"}, - {file = "qdldl-0.1.7.post0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8ec670d97cf756f9159dc0a11de5cf054e88aefe84bea1c7282f00334642843"}, - {file = "qdldl-0.1.7.post0-cp37-cp37m-win_amd64.whl", hash = "sha256:aa208703b44337a7e77f6f2663f7a452144becb4421970d534ff8297b92e1e10"}, - {file = "qdldl-0.1.7.post0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b42649484f7c0d8ee659224ecaac0a3e97f12531018207f4d7323e4071320eb1"}, - {file = "qdldl-0.1.7.post0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26aa3d6f0da7779265d72e8f418094003e75fa53c515a53bc03fd8b9bcfbf7de"}, - {file = "qdldl-0.1.7.post0-cp38-cp38-win_amd64.whl", hash = "sha256:e55bcd6962178029faf543addd49db145302dd51e19855fefa71b5fd55840eea"}, - {file = "qdldl-0.1.7.post0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c1dd0e570e65aaf35e10b7fb345f7ac763fd05a2227b9c06ce65e07993fc4984"}, - {file = "qdldl-0.1.7.post0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae161342529852b6248ace4642bc4ee371a7c1e0707b7bc43a43ef7e73c06ca3"}, - {file = "qdldl-0.1.7.post0-cp39-cp39-win_amd64.whl", hash = "sha256:092f6606690a2b9bd3c939f3147887e02de13bb068fbed5ffdc7459034def623"}, - {file = "qdldl-0.1.7.post0.tar.gz", hash = "sha256:f346a114c8342ee6d4dbd6471eef314199fb268d3bf7b95885ca351fde2b023f"}, + {file = "qdldl-0.1.7.post2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2c8d39035a64fbe4dc8d73501a444374787c087b202e875f6f0cd7e7ca166e25"}, + {file = "qdldl-0.1.7.post2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f93cd0b3338ef53efa512168d32991bff00b292d6eaf5e35427ca84622158132"}, + {file = "qdldl-0.1.7.post2-cp310-cp310-win_amd64.whl", hash = "sha256:02d6b531fe669f8894f97f697da88fe3f1c3af0c7ef12f260bf1d20e8e70f0dc"}, + {file = "qdldl-0.1.7.post2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:25180228613c66a5af7d6a648920fb71122e1ed58daf09621ed6b939b7f9aa04"}, + {file = "qdldl-0.1.7.post2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa5cf2125dea734f8977df22859b3826fae8960b35caf75cf5b16306ff1d1dc3"}, + {file = "qdldl-0.1.7.post2-cp311-cp311-win_amd64.whl", hash = "sha256:f14cda7c484dbe78e333bb52849031081d37e7e3bf961ed7bb77ed11489f16f6"}, + {file = "qdldl-0.1.7.post2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:90982ca5069077cfb8ba9ea7422c6e2a80a3af89266252d1e7a51ea5e87c8188"}, + {file = "qdldl-0.1.7.post2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e5572de51c7c86b6f30cd1b5a88dd5459d48e1c3432b1a04c2f4ad669f6e827"}, + {file = "qdldl-0.1.7.post2-cp312-cp312-win_amd64.whl", hash = "sha256:a612a4dfd94f977c5c9a4389363d4c661f54a6df59c75d462adb93922d92b45f"}, + {file = "qdldl-0.1.7.post2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:97929fd925833306e3c625c92813ac0dea9a53e6b9f680e2c5da9f0c1c641b19"}, + {file = "qdldl-0.1.7.post2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b833a64ee32d1e14a3acd59c3e62ea1dae551e6bf3265e42cb4197c4353ea02"}, + {file = "qdldl-0.1.7.post2-cp36-cp36m-win_amd64.whl", hash = "sha256:f686923c983f62fc7ccc7ebda6fd6ed5f623d299c211933896c7d396c88bb012"}, + {file = "qdldl-0.1.7.post2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8206013ec1fb4c6a396aeb0ef0c68f07d85eb5c22fe7e31cb8307f05787878b9"}, + {file = "qdldl-0.1.7.post2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24e01593cd46c86f5812f1362987bc8ab1080c493f4c7e436e144d2c10481b81"}, + {file = "qdldl-0.1.7.post2-cp37-cp37m-win_amd64.whl", hash = "sha256:06c2157ea1c2f691c956d92895722777eaf8c9ebf9c2c1af4a0b947eccc8b31e"}, + {file = "qdldl-0.1.7.post2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:77547f9e58522b2445b846ab6f0fd09a689f9fb2c0e72d44d14f631054d7dd55"}, + {file = "qdldl-0.1.7.post2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19825b998202dcd2579182a0a46350bdd95421ec65fd7579326083dc9f1c4d37"}, + {file = "qdldl-0.1.7.post2-cp38-cp38-win_amd64.whl", hash = "sha256:4c08e68cf7c051c0ce9c3846cda60a9c10aa53eb6b240998362dd6fd9410779b"}, + {file = "qdldl-0.1.7.post2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:edf202648cb0377fd78dd1e59816ccd92fabdee676eb3a7b618c66b393634d10"}, + {file = "qdldl-0.1.7.post2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22bc364e665ea8a2f8f661dbd22321ff365663b33b9ceaf429b94c2661cd11ac"}, + {file = "qdldl-0.1.7.post2-cp39-cp39-win_amd64.whl", hash = "sha256:b7dec0fba6204e83aa4b5e71e84ea2e89cfebeef5b47b70443f8cf9fa12a9752"}, + {file = "qdldl-0.1.7.post2.tar.gz", hash = "sha256:4b1539a5ec10cc757afd7156d7deb4006007cad86d774c9f0fdc3e34415557d3"}, ] [package.dependencies] @@ -7186,13 +7260,13 @@ six = "*" [[package]] name = "rdflib" -version = "6.3.2" +version = "7.0.0" description = "RDFLib is a Python library for working with RDF, a simple yet powerful language for representing information." optional = false -python-versions = ">=3.7,<4.0" +python-versions = ">=3.8.1,<4.0.0" files = [ - {file = "rdflib-6.3.2-py3-none-any.whl", hash = "sha256:36b4e74a32aa1e4fa7b8719876fb192f19ecd45ff932ea5ebbd2e417a0247e63"}, - {file = "rdflib-6.3.2.tar.gz", hash = "sha256:72af591ff704f4caacea7ecc0c5a9056b8553e0489dd4f35a9bc52dbd41522e0"}, + {file = "rdflib-7.0.0-py3-none-any.whl", hash = "sha256:0438920912a642c866a513de6fe8a0001bd86ef975057d6962c79ce4771687cd"}, + {file = "rdflib-7.0.0.tar.gz", hash = "sha256:9995eb8569428059b8c1affd26b25eac510d64f5043d9ce8c84e0d0036e995ae"}, ] [package.dependencies] @@ -7207,99 +7281,104 @@ networkx = ["networkx (>=2.0.0,<3.0.0)"] [[package]] name = "regex" -version = "2023.6.3" +version = "2024.4.16" description = "Alternative regular expression module, to replace re." optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "regex-2023.6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:824bf3ac11001849aec3fa1d69abcb67aac3e150a933963fb12bda5151fe1bfd"}, - {file = "regex-2023.6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:05ed27acdf4465c95826962528f9e8d41dbf9b1aa8531a387dee6ed215a3e9ef"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b49c764f88a79160fa64f9a7b425620e87c9f46095ef9c9920542ab2495c8bc"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8e3f1316c2293e5469f8f09dc2d76efb6c3982d3da91ba95061a7e69489a14ef"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43e1dd9d12df9004246bacb79a0e5886b3b6071b32e41f83b0acbf293f820ee8"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4959e8bcbfda5146477d21c3a8ad81b185cd252f3d0d6e4724a5ef11c012fb06"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:af4dd387354dc83a3bff67127a124c21116feb0d2ef536805c454721c5d7993d"}, - {file = "regex-2023.6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2239d95d8e243658b8dbb36b12bd10c33ad6e6933a54d36ff053713f129aa536"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:890e5a11c97cf0d0c550eb661b937a1e45431ffa79803b942a057c4fb12a2da2"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a8105e9af3b029f243ab11ad47c19b566482c150c754e4c717900a798806b222"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:25be746a8ec7bc7b082783216de8e9473803706723b3f6bef34b3d0ed03d57e2"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:3676f1dd082be28b1266c93f618ee07741b704ab7b68501a173ce7d8d0d0ca18"}, - {file = "regex-2023.6.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:10cb847aeb1728412c666ab2e2000ba6f174f25b2bdc7292e7dd71b16db07568"}, - {file = "regex-2023.6.3-cp310-cp310-win32.whl", hash = "sha256:dbbbfce33cd98f97f6bffb17801b0576e653f4fdb1d399b2ea89638bc8d08ae1"}, - {file = "regex-2023.6.3-cp310-cp310-win_amd64.whl", hash = "sha256:c5f8037000eb21e4823aa485149f2299eb589f8d1fe4b448036d230c3f4e68e0"}, - {file = "regex-2023.6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c123f662be8ec5ab4ea72ea300359023a5d1df095b7ead76fedcd8babbedf969"}, - {file = "regex-2023.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9edcbad1f8a407e450fbac88d89e04e0b99a08473f666a3f3de0fd292badb6aa"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcba6dae7de533c876255317c11f3abe4907ba7d9aa15d13e3d9710d4315ec0e"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:29cdd471ebf9e0f2fb3cac165efedc3c58db841d83a518b082077e612d3ee5df"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:12b74fbbf6cbbf9dbce20eb9b5879469e97aeeaa874145517563cca4029db65c"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c29ca1bd61b16b67be247be87390ef1d1ef702800f91fbd1991f5c4421ebae8"}, - {file = "regex-2023.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77f09bc4b55d4bf7cc5eba785d87001d6757b7c9eec237fe2af57aba1a071d9"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ea353ecb6ab5f7e7d2f4372b1e779796ebd7b37352d290096978fea83c4dba0c"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:10590510780b7541969287512d1b43f19f965c2ece6c9b1c00fc367b29d8dce7"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e2fbd6236aae3b7f9d514312cdb58e6494ee1c76a9948adde6eba33eb1c4264f"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:6b2675068c8b56f6bfd5a2bda55b8accbb96c02fd563704732fd1c95e2083461"}, - {file = "regex-2023.6.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74419d2b50ecb98360cfaa2974da8689cb3b45b9deff0dcf489c0d333bcc1477"}, - {file = "regex-2023.6.3-cp311-cp311-win32.whl", hash = "sha256:fb5ec16523dc573a4b277663a2b5a364e2099902d3944c9419a40ebd56a118f9"}, - {file = "regex-2023.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:09e4a1a6acc39294a36b7338819b10baceb227f7f7dbbea0506d419b5a1dd8af"}, - {file = "regex-2023.6.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:0654bca0cdf28a5956c83839162692725159f4cda8d63e0911a2c0dc76166525"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:463b6a3ceb5ca952e66550a4532cef94c9a0c80dc156c4cc343041951aec1697"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:87b2a5bb5e78ee0ad1de71c664d6eb536dc3947a46a69182a90f4410f5e3f7dd"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6343c6928282c1f6a9db41f5fd551662310e8774c0e5ebccb767002fcf663ca9"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6192d5af2ccd2a38877bfef086d35e6659566a335b1492786ff254c168b1693"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74390d18c75054947e4194019077e243c06fbb62e541d8817a0fa822ea310c14"}, - {file = "regex-2023.6.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:742e19a90d9bb2f4a6cf2862b8b06dea5e09b96c9f2df1779e53432d7275331f"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:8abbc5d54ea0ee80e37fef009e3cec5dafd722ed3c829126253d3e22f3846f1e"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:c2b867c17a7a7ae44c43ebbeb1b5ff406b3e8d5b3e14662683e5e66e6cc868d3"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:d831c2f8ff278179705ca59f7e8524069c1a989e716a1874d6d1aab6119d91d1"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ee2d1a9a253b1729bb2de27d41f696ae893507c7db224436abe83ee25356f5c1"}, - {file = "regex-2023.6.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:61474f0b41fe1a80e8dfa70f70ea1e047387b7cd01c85ec88fa44f5d7561d787"}, - {file = "regex-2023.6.3-cp36-cp36m-win32.whl", hash = "sha256:0b71e63226e393b534105fcbdd8740410dc6b0854c2bfa39bbda6b0d40e59a54"}, - {file = "regex-2023.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bbb02fd4462f37060122e5acacec78e49c0fbb303c30dd49c7f493cf21fc5b27"}, - {file = "regex-2023.6.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b862c2b9d5ae38a68b92e215b93f98d4c5e9454fa36aae4450f61dd33ff48487"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:976d7a304b59ede34ca2921305b57356694f9e6879db323fd90a80f865d355a3"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:83320a09188e0e6c39088355d423aa9d056ad57a0b6c6381b300ec1a04ec3d16"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9427a399501818a7564f8c90eced1e9e20709ece36be701f394ada99890ea4b3"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178bbc1b2ec40eaca599d13c092079bf529679bf0371c602edaa555e10b41c3"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:837328d14cde912af625d5f303ec29f7e28cdab588674897baafaf505341f2fc"}, - {file = "regex-2023.6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2d44dc13229905ae96dd2ae2dd7cebf824ee92bc52e8cf03dcead37d926da019"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d54af539295392611e7efbe94e827311eb8b29668e2b3f4cadcfe6f46df9c777"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7117d10690c38a622e54c432dfbbd3cbd92f09401d622902c32f6d377e2300ee"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bb60b503ec8a6e4e3e03a681072fa3a5adcbfa5479fa2d898ae2b4a8e24c4591"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:65ba8603753cec91c71de423a943ba506363b0e5c3fdb913ef8f9caa14b2c7e0"}, - {file = "regex-2023.6.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:271f0bdba3c70b58e6f500b205d10a36fb4b58bd06ac61381b68de66442efddb"}, - {file = "regex-2023.6.3-cp37-cp37m-win32.whl", hash = "sha256:9beb322958aaca059f34975b0df135181f2e5d7a13b84d3e0e45434749cb20f7"}, - {file = "regex-2023.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fea75c3710d4f31389eed3c02f62d0b66a9da282521075061ce875eb5300cf23"}, - {file = "regex-2023.6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8f56fcb7ff7bf7404becdfc60b1e81a6d0561807051fd2f1860b0d0348156a07"}, - {file = "regex-2023.6.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d2da3abc88711bce7557412310dfa50327d5769a31d1c894b58eb256459dc289"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a99b50300df5add73d307cf66abea093304a07eb017bce94f01e795090dea87c"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5708089ed5b40a7b2dc561e0c8baa9535b77771b64a8330b684823cfd5116036"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:687ea9d78a4b1cf82f8479cab23678aff723108df3edeac098e5b2498879f4a7"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4d3850beab9f527f06ccc94b446c864059c57651b3f911fddb8d9d3ec1d1b25d"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8915cc96abeb8983cea1df3c939e3c6e1ac778340c17732eb63bb96247b91d2"}, - {file = "regex-2023.6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:841d6e0e5663d4c7b4c8099c9997be748677d46cbf43f9f471150e560791f7ff"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9edce5281f965cf135e19840f4d93d55b3835122aa76ccacfd389e880ba4cf82"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b956231ebdc45f5b7a2e1f90f66a12be9610ce775fe1b1d50414aac1e9206c06"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:36efeba71c6539d23c4643be88295ce8c82c88bbd7c65e8a24081d2ca123da3f"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:cf67ca618b4fd34aee78740bea954d7c69fdda419eb208c2c0c7060bb822d747"}, - {file = "regex-2023.6.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b4598b1897837067a57b08147a68ac026c1e73b31ef6e36deeeb1fa60b2933c9"}, - {file = "regex-2023.6.3-cp38-cp38-win32.whl", hash = "sha256:f415f802fbcafed5dcc694c13b1292f07fe0befdb94aa8a52905bd115ff41e88"}, - {file = "regex-2023.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:d4f03bb71d482f979bda92e1427f3ec9b220e62a7dd337af0aa6b47bf4498f72"}, - {file = "regex-2023.6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ccf91346b7bd20c790310c4147eee6ed495a54ddb6737162a36ce9dbef3e4751"}, - {file = "regex-2023.6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b28f5024a3a041009eb4c333863d7894d191215b39576535c6734cd88b0fcb68"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0bb18053dfcfed432cc3ac632b5e5e5c5b7e55fb3f8090e867bfd9b054dbcbf"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a5bfb3004f2144a084a16ce19ca56b8ac46e6fd0651f54269fc9e230edb5e4a"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c6b48d0fa50d8f4df3daf451be7f9689c2bde1a52b1225c5926e3f54b6a9ed1"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:051da80e6eeb6e239e394ae60704d2b566aa6a7aed6f2890a7967307267a5dc6"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a4c3b7fa4cdaa69268748665a1a6ff70c014d39bb69c50fda64b396c9116cf77"}, - {file = "regex-2023.6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:457b6cce21bee41ac292d6753d5e94dcbc5c9e3e3a834da285b0bde7aa4a11e9"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aad51907d74fc183033ad796dd4c2e080d1adcc4fd3c0fd4fd499f30c03011cd"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0385e73da22363778ef2324950e08b689abdf0b108a7d8decb403ad7f5191938"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c6a57b742133830eec44d9b2290daf5cbe0a2f1d6acee1b3c7b1c7b2f3606df7"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3e5219bf9e75993d73ab3d25985c857c77e614525fac9ae02b1bebd92f7cecac"}, - {file = "regex-2023.6.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e5087a3c59eef624a4591ef9eaa6e9a8d8a94c779dade95d27c0bc24650261cd"}, - {file = "regex-2023.6.3-cp39-cp39-win32.whl", hash = "sha256:20326216cc2afe69b6e98528160b225d72f85ab080cbdf0b11528cbbaba2248f"}, - {file = "regex-2023.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:bdff5eab10e59cf26bc479f565e25ed71a7d041d1ded04ccf9aee1d9f208487a"}, - {file = "regex-2023.6.3.tar.gz", hash = "sha256:72d1a25bf36d2050ceb35b517afe13864865268dfb45910e2e17a84be6cbfeb0"}, + {file = "regex-2024.4.16-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fb83cc090eac63c006871fd24db5e30a1f282faa46328572661c0a24a2323a08"}, + {file = "regex-2024.4.16-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c91e1763696c0eb66340c4df98623c2d4e77d0746b8f8f2bee2c6883fd1fe18"}, + {file = "regex-2024.4.16-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:10188fe732dec829c7acca7422cdd1bf57d853c7199d5a9e96bb4d40db239c73"}, + {file = "regex-2024.4.16-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:956b58d692f235cfbf5b4f3abd6d99bf102f161ccfe20d2fd0904f51c72c4c66"}, + {file = "regex-2024.4.16-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a70b51f55fd954d1f194271695821dd62054d949efd6368d8be64edd37f55c86"}, + {file = "regex-2024.4.16-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5c02fcd2bf45162280613d2e4a1ca3ac558ff921ae4e308ecb307650d3a6ee51"}, + {file = "regex-2024.4.16-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c4ed75ea6892a56896d78f11006161eea52c45a14994794bcfa1654430984b22"}, + {file = "regex-2024.4.16-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd727ad276bb91928879f3aa6396c9a1d34e5e180dce40578421a691eeb77f47"}, + {file = "regex-2024.4.16-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:7cbc5d9e8a1781e7be17da67b92580d6ce4dcef5819c1b1b89f49d9678cc278c"}, + {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:78fddb22b9ef810b63ef341c9fcf6455232d97cfe03938cbc29e2672c436670e"}, + {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:445ca8d3c5a01309633a0c9db57150312a181146315693273e35d936472df912"}, + {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:95399831a206211d6bc40224af1c635cb8790ddd5c7493e0bd03b85711076a53"}, + {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:7731728b6568fc286d86745f27f07266de49603a6fdc4d19c87e8c247be452af"}, + {file = "regex-2024.4.16-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4facc913e10bdba42ec0aee76d029aedda628161a7ce4116b16680a0413f658a"}, + {file = "regex-2024.4.16-cp310-cp310-win32.whl", hash = "sha256:911742856ce98d879acbea33fcc03c1d8dc1106234c5e7d068932c945db209c0"}, + {file = "regex-2024.4.16-cp310-cp310-win_amd64.whl", hash = "sha256:e0a2df336d1135a0b3a67f3bbf78a75f69562c1199ed9935372b82215cddd6e2"}, + {file = "regex-2024.4.16-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1210365faba7c2150451eb78ec5687871c796b0f1fa701bfd2a4a25420482d26"}, + {file = "regex-2024.4.16-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9ab40412f8cd6f615bfedea40c8bf0407d41bf83b96f6fc9ff34976d6b7037fd"}, + {file = "regex-2024.4.16-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fd80d1280d473500d8086d104962a82d77bfbf2b118053824b7be28cd5a79ea5"}, + {file = "regex-2024.4.16-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bb966fdd9217e53abf824f437a5a2d643a38d4fd5fd0ca711b9da683d452969"}, + {file = "regex-2024.4.16-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:20b7a68444f536365af42a75ccecb7ab41a896a04acf58432db9e206f4e525d6"}, + {file = "regex-2024.4.16-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b74586dd0b039c62416034f811d7ee62810174bb70dffcca6439f5236249eb09"}, + {file = "regex-2024.4.16-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c8290b44d8b0af4e77048646c10c6e3aa583c1ca67f3b5ffb6e06cf0c6f0f89"}, + {file = "regex-2024.4.16-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2d80a6749724b37853ece57988b39c4e79d2b5fe2869a86e8aeae3bbeef9eb0"}, + {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:3a1018e97aeb24e4f939afcd88211ace472ba566efc5bdf53fd8fd7f41fa7170"}, + {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:8d015604ee6204e76569d2f44e5a210728fa917115bef0d102f4107e622b08d5"}, + {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:3d5ac5234fb5053850d79dd8eb1015cb0d7d9ed951fa37aa9e6249a19aa4f336"}, + {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:0a38d151e2cdd66d16dab550c22f9521ba79761423b87c01dae0a6e9add79c0d"}, + {file = "regex-2024.4.16-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:159dc4e59a159cb8e4e8f8961eb1fa5d58f93cb1acd1701d8aff38d45e1a84a6"}, + {file = "regex-2024.4.16-cp311-cp311-win32.whl", hash = "sha256:ba2336d6548dee3117520545cfe44dc28a250aa091f8281d28804aa8d707d93d"}, + {file = "regex-2024.4.16-cp311-cp311-win_amd64.whl", hash = "sha256:8f83b6fd3dc3ba94d2b22717f9c8b8512354fd95221ac661784df2769ea9bba9"}, + {file = "regex-2024.4.16-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:80b696e8972b81edf0af2a259e1b2a4a661f818fae22e5fa4fa1a995fb4a40fd"}, + {file = "regex-2024.4.16-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d61ae114d2a2311f61d90c2ef1358518e8f05eafda76eaf9c772a077e0b465ec"}, + {file = "regex-2024.4.16-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ba6745440b9a27336443b0c285d705ce73adb9ec90e2f2004c64d95ab5a7598"}, + {file = "regex-2024.4.16-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6295004b2dd37b0835ea5c14a33e00e8cfa3c4add4d587b77287825f3418d310"}, + {file = "regex-2024.4.16-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4aba818dcc7263852aabb172ec27b71d2abca02a593b95fa79351b2774eb1d2b"}, + {file = "regex-2024.4.16-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d0800631e565c47520aaa04ae38b96abc5196fe8b4aa9bd864445bd2b5848a7a"}, + {file = "regex-2024.4.16-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08dea89f859c3df48a440dbdcd7b7155bc675f2fa2ec8c521d02dc69e877db70"}, + {file = "regex-2024.4.16-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eeaa0b5328b785abc344acc6241cffde50dc394a0644a968add75fcefe15b9d4"}, + {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4e819a806420bc010489f4e741b3036071aba209f2e0989d4750b08b12a9343f"}, + {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:c2d0e7cbb6341e830adcbfa2479fdeebbfbb328f11edd6b5675674e7a1e37730"}, + {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:91797b98f5e34b6a49f54be33f72e2fb658018ae532be2f79f7c63b4ae225145"}, + {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:d2da13568eff02b30fd54fccd1e042a70fe920d816616fda4bf54ec705668d81"}, + {file = "regex-2024.4.16-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:370c68dc5570b394cbaadff50e64d705f64debed30573e5c313c360689b6aadc"}, + {file = "regex-2024.4.16-cp312-cp312-win32.whl", hash = "sha256:904c883cf10a975b02ab3478bce652f0f5346a2c28d0a8521d97bb23c323cc8b"}, + {file = "regex-2024.4.16-cp312-cp312-win_amd64.whl", hash = "sha256:785c071c982dce54d44ea0b79cd6dfafddeccdd98cfa5f7b86ef69b381b457d9"}, + {file = "regex-2024.4.16-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e2f142b45c6fed48166faeb4303b4b58c9fcd827da63f4cf0a123c3480ae11fb"}, + {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e87ab229332ceb127a165612d839ab87795972102cb9830e5f12b8c9a5c1b508"}, + {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:81500ed5af2090b4a9157a59dbc89873a25c33db1bb9a8cf123837dcc9765047"}, + {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b340cccad138ecb363324aa26893963dcabb02bb25e440ebdf42e30963f1a4e0"}, + {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c72608e70f053643437bd2be0608f7f1c46d4022e4104d76826f0839199347a"}, + {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a01fe2305e6232ef3e8f40bfc0f0f3a04def9aab514910fa4203bafbc0bb4682"}, + {file = "regex-2024.4.16-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:03576e3a423d19dda13e55598f0fd507b5d660d42c51b02df4e0d97824fdcae3"}, + {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:549c3584993772e25f02d0656ac48abdda73169fe347263948cf2b1cead622f3"}, + {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:34422d5a69a60b7e9a07a690094e824b66f5ddc662a5fc600d65b7c174a05f04"}, + {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:5f580c651a72b75c39e311343fe6875d6f58cf51c471a97f15a938d9fe4e0d37"}, + {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3399dd8a7495bbb2bacd59b84840eef9057826c664472e86c91d675d007137f5"}, + {file = "regex-2024.4.16-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8d1f86f3f4e2388aa3310b50694ac44daefbd1681def26b4519bd050a398dc5a"}, + {file = "regex-2024.4.16-cp37-cp37m-win32.whl", hash = "sha256:dd5acc0a7d38fdc7a3a6fd3ad14c880819008ecb3379626e56b163165162cc46"}, + {file = "regex-2024.4.16-cp37-cp37m-win_amd64.whl", hash = "sha256:ba8122e3bb94ecda29a8de4cf889f600171424ea586847aa92c334772d200331"}, + {file = "regex-2024.4.16-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:743deffdf3b3481da32e8a96887e2aa945ec6685af1cfe2bcc292638c9ba2f48"}, + {file = "regex-2024.4.16-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7571f19f4a3fd00af9341c7801d1ad1967fc9c3f5e62402683047e7166b9f2b4"}, + {file = "regex-2024.4.16-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:df79012ebf6f4efb8d307b1328226aef24ca446b3ff8d0e30202d7ebcb977a8c"}, + {file = "regex-2024.4.16-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e757d475953269fbf4b441207bb7dbdd1c43180711b6208e129b637792ac0b93"}, + {file = "regex-2024.4.16-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4313ab9bf6a81206c8ac28fdfcddc0435299dc88cad12cc6305fd0e78b81f9e4"}, + {file = "regex-2024.4.16-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d83c2bc678453646f1a18f8db1e927a2d3f4935031b9ad8a76e56760461105dd"}, + {file = "regex-2024.4.16-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9df1bfef97db938469ef0a7354b2d591a2d438bc497b2c489471bec0e6baf7c4"}, + {file = "regex-2024.4.16-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62120ed0de69b3649cc68e2965376048793f466c5a6c4370fb27c16c1beac22d"}, + {file = "regex-2024.4.16-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c2ef6f7990b6e8758fe48ad08f7e2f66c8f11dc66e24093304b87cae9037bb4a"}, + {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8fc6976a3395fe4d1fbeb984adaa8ec652a1e12f36b56ec8c236e5117b585427"}, + {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:03e68f44340528111067cecf12721c3df4811c67268b897fbe695c95f860ac42"}, + {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ec7e0043b91115f427998febaa2beb82c82df708168b35ece3accb610b91fac1"}, + {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c21fc21a4c7480479d12fd8e679b699f744f76bb05f53a1d14182b31f55aac76"}, + {file = "regex-2024.4.16-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:12f6a3f2f58bb7344751919a1876ee1b976fe08b9ffccb4bbea66f26af6017b9"}, + {file = "regex-2024.4.16-cp38-cp38-win32.whl", hash = "sha256:479595a4fbe9ed8f8f72c59717e8cf222da2e4c07b6ae5b65411e6302af9708e"}, + {file = "regex-2024.4.16-cp38-cp38-win_amd64.whl", hash = "sha256:0534b034fba6101611968fae8e856c1698da97ce2efb5c2b895fc8b9e23a5834"}, + {file = "regex-2024.4.16-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a7ccdd1c4a3472a7533b0a7aa9ee34c9a2bef859ba86deec07aff2ad7e0c3b94"}, + {file = "regex-2024.4.16-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6f2f017c5be19984fbbf55f8af6caba25e62c71293213f044da3ada7091a4455"}, + {file = "regex-2024.4.16-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:803b8905b52de78b173d3c1e83df0efb929621e7b7c5766c0843704d5332682f"}, + {file = "regex-2024.4.16-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:684008ec44ad275832a5a152f6e764bbe1914bea10968017b6feaecdad5736e0"}, + {file = "regex-2024.4.16-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65436dce9fdc0aeeb0a0effe0839cb3d6a05f45aa45a4d9f9c60989beca78b9c"}, + {file = "regex-2024.4.16-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea355eb43b11764cf799dda62c658c4d2fdb16af41f59bb1ccfec517b60bcb07"}, + {file = "regex-2024.4.16-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98c1165f3809ce7774f05cb74e5408cd3aa93ee8573ae959a97a53db3ca3180d"}, + {file = "regex-2024.4.16-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cccc79a9be9b64c881f18305a7c715ba199e471a3973faeb7ba84172abb3f317"}, + {file = "regex-2024.4.16-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:00169caa125f35d1bca6045d65a662af0202704489fada95346cfa092ec23f39"}, + {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6cc38067209354e16c5609b66285af17a2863a47585bcf75285cab33d4c3b8df"}, + {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:23cff1b267038501b179ccbbd74a821ac4a7192a1852d1d558e562b507d46013"}, + {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:b9d320b3bf82a39f248769fc7f188e00f93526cc0fe739cfa197868633d44701"}, + {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:89ec7f2c08937421bbbb8b48c54096fa4f88347946d4747021ad85f1b3021b3c"}, + {file = "regex-2024.4.16-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4918fd5f8b43aa7ec031e0fef1ee02deb80b6afd49c85f0790be1dc4ce34cb50"}, + {file = "regex-2024.4.16-cp39-cp39-win32.whl", hash = "sha256:684e52023aec43bdf0250e843e1fdd6febbe831bd9d52da72333fa201aaa2335"}, + {file = "regex-2024.4.16-cp39-cp39-win_amd64.whl", hash = "sha256:e697e1c0238133589e00c244a8b676bc2cfc3ab4961318d902040d099fec7483"}, + {file = "regex-2024.4.16.tar.gz", hash = "sha256:fa454d26f2e87ad661c4f0c5a5fe4cf6aab1e307d1b94f16ffdfcb089ba685c0"}, ] [[package]] @@ -7403,13 +7482,13 @@ dev = ["black (>=22.3.0)", "build (>=0.7.0)", "isort (>=5.11.4)", "pyflakes (>=2 [[package]] name = "requests-oauthlib" -version = "1.3.1" +version = "2.0.0" description = "OAuthlib authentication support for Requests." optional = true -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.4" files = [ - {file = "requests-oauthlib-1.3.1.tar.gz", hash = "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a"}, - {file = "requests_oauthlib-1.3.1-py2.py3-none-any.whl", hash = "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5"}, + {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, + {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, ] [package.dependencies] @@ -7517,66 +7596,79 @@ pyasn1 = ">=0.1.3" [[package]] name = "ruamel-yaml" -version = "0.17.32" +version = "0.17.40" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" optional = false python-versions = ">=3" files = [ - {file = "ruamel.yaml-0.17.32-py3-none-any.whl", hash = "sha256:23cd2ed620231677564646b0c6a89d138b6822a0d78656df7abda5879ec4f447"}, - {file = "ruamel.yaml-0.17.32.tar.gz", hash = "sha256:ec939063761914e14542972a5cba6d33c23b0859ab6342f61cf070cfc600efc2"}, + {file = "ruamel.yaml-0.17.40-py3-none-any.whl", hash = "sha256:b16b6c3816dff0a93dca12acf5e70afd089fa5acb80604afd1ffa8b465b7722c"}, + {file = "ruamel.yaml-0.17.40.tar.gz", hash = "sha256:6024b986f06765d482b5b07e086cc4b4cd05dd22ddcbc758fa23d54873cf313d"}, ] [package.dependencies] -"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.12\""} +"ruamel.yaml.clib" = {version = ">=0.2.7", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.13\""} [package.extras] -docs = ["ryd"] +docs = ["mercurial (>5.7)", "ryd"] jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] [[package]] name = "ruamel-yaml-clib" -version = "0.2.7" +version = "0.2.8" description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" optional = false -python-versions = ">=3.5" +python-versions = ">=3.6" files = [ - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5859983f26d8cd7bb5c287ef452e8aacc86501487634573d260968f753e1d71"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:debc87a9516b237d0466a711b18b6ebeb17ba9f391eb7f91c649c5c4ec5006c7"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:df5828871e6648db72d1c19b4bd24819b80a755c4541d3409f0f7acd0f335c80"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:efa08d63ef03d079dcae1dfe334f6c8847ba8b645d08df286358b1f5293d24ab"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win32.whl", hash = "sha256:763d65baa3b952479c4e972669f679fe490eee058d5aa85da483ebae2009d231"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:d000f258cf42fec2b1bbf2863c61d7b8918d31ffee905da62dede869254d3b8a"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:045e0626baf1c52e5527bd5db361bc83180faaba2ff586e763d3d5982a876a9e"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:1a6391a7cabb7641c32517539ca42cf84b87b667bad38b78d4d42dd23e957c81"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:9c7617df90c1365638916b98cdd9be833d31d337dbcd722485597b43c4a215bf"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:41d0f1fa4c6830176eef5b276af04c89320ea616655d01327d5ce65e50575c94"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-win32.whl", hash = "sha256:f6d3d39611ac2e4f62c3128a9eed45f19a6608670c5a2f4f07f24e8de3441d38"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:da538167284de58a52109a9b89b8f6a53ff8437dd6dc26d33b57bf6699153122"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4b3a93bb9bc662fc1f99c5c3ea8e623d8b23ad22f861eb6fce9377ac07ad6072"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_12_0_arm64.whl", hash = "sha256:a234a20ae07e8469da311e182e70ef6b199d0fbeb6c6cc2901204dd87fb867e8"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:15910ef4f3e537eea7fe45f8a5d19997479940d9196f357152a09031c5be59f3"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:370445fd795706fd291ab00c9df38a0caed0f17a6fb46b0f607668ecb16ce763"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win32.whl", hash = "sha256:ecdf1a604009bd35c674b9225a8fa609e0282d9b896c03dd441a91e5f53b534e"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win_amd64.whl", hash = "sha256:f34019dced51047d6f70cb9383b2ae2853b7fc4dce65129a5acd49f4f9256646"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2aa261c29a5545adfef9296b7e33941f46aa5bbd21164228e833412af4c9c75f"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f01da5790e95815eb5a8a138508c01c758e5f5bc0ce4286c4f7028b8dd7ac3d0"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:40d030e2329ce5286d6b231b8726959ebbe0404c92f0a578c0e2482182e38282"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c3ca1fbba4ae962521e5eb66d72998b51f0f4d0f608d3c0347a48e1af262efa7"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win32.whl", hash = "sha256:7bdb4c06b063f6fd55e472e201317a3bb6cdeeee5d5a38512ea5c01e1acbdd93"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:be2a7ad8fd8f7442b24323d24ba0b56c51219513cfa45b9ada3b87b76c374d4b"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91a789b4aa0097b78c93e3dc4b40040ba55bef518f84a40d4442f713b4094acb"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:99e77daab5d13a48a4054803d052ff40780278240a902b880dd37a51ba01a307"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:3243f48ecd450eddadc2d11b5feb08aca941b5cd98c9b1db14b2fd128be8c697"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8831a2cedcd0f0927f788c5bdf6567d9dc9cc235646a434986a852af1cb54b4b"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win32.whl", hash = "sha256:3110a99e0f94a4a3470ff67fc20d3f96c25b13d24c6980ff841e82bafe827cac"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:92460ce908546ab69770b2e576e4f99fbb4ce6ab4b245345a3869a0a0410488f"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5bc0667c1eb8f83a3752b71b9c4ba55ef7c7058ae57022dd9b29065186a113d9"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:4a4d8d417868d68b979076a9be6a38c676eca060785abaa6709c7b31593c35d1"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf9a6bc4a0221538b1a7de3ed7bca4c93c02346853f44e1cd764be0023cd3640"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:a7b301ff08055d73223058b5c46c55638917f04d21577c95e00e0c4d79201a6b"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win32.whl", hash = "sha256:d5e51e2901ec2366b79f16c2299a03e74ba4531ddcfacc1416639c557aef0ad8"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:184faeaec61dbaa3cace407cffc5819f7b977e75360e8d5ca19461cd851a5fc5"}, - {file = "ruamel.yaml.clib-0.2.7.tar.gz", hash = "sha256:1f08fd5a2bea9c4180db71678e850b995d2a5f4537be0e94557668cf0f5f9497"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-macosx_13_0_arm64.whl", hash = "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-manylinux_2_24_aarch64.whl", hash = "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win32.whl", hash = "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d"}, + {file = "ruamel.yaml.clib-0.2.8-cp310-cp310-win_amd64.whl", hash = "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-manylinux_2_24_aarch64.whl", hash = "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win32.whl", hash = "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7"}, + {file = "ruamel.yaml.clib-0.2.8-cp311-cp311-win_amd64.whl", hash = "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-macosx_13_0_arm64.whl", hash = "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-manylinux_2_24_aarch64.whl", hash = "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win32.whl", hash = "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa"}, + {file = "ruamel.yaml.clib-0.2.8-cp312-cp312-win_amd64.whl", hash = "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b"}, + {file = "ruamel.yaml.clib-0.2.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_24_aarch64.whl", hash = "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win32.whl", hash = "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b"}, + {file = "ruamel.yaml.clib-0.2.8-cp37-cp37m-win_amd64.whl", hash = "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_24_aarch64.whl", hash = "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win32.whl", hash = "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe"}, + {file = "ruamel.yaml.clib-0.2.8-cp38-cp38-win_amd64.whl", hash = "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_24_aarch64.whl", hash = "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win32.whl", hash = "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5"}, + {file = "ruamel.yaml.clib-0.2.8-cp39-cp39-win_amd64.whl", hash = "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15"}, + {file = "ruamel.yaml.clib-0.2.8.tar.gz", hash = "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512"}, ] [[package]] @@ -7607,37 +7699,42 @@ files = [ [[package]] name = "scikit-learn" -version = "1.3.0" +version = "1.3.2" description = "A set of python modules for machine learning and data mining" optional = false python-versions = ">=3.8" files = [ - {file = "scikit-learn-1.3.0.tar.gz", hash = "sha256:8be549886f5eda46436b6e555b0e4873b4f10aa21c07df45c4bc1735afbccd7a"}, - {file = "scikit_learn-1.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:981287869e576d42c682cf7ca96af0c6ac544ed9316328fd0d9292795c742cf5"}, - {file = "scikit_learn-1.3.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:436aaaae2c916ad16631142488e4c82f4296af2404f480e031d866863425d2a2"}, - {file = "scikit_learn-1.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7e28d8fa47a0b30ae1bd7a079519dd852764e31708a7804da6cb6f8b36e3630"}, - {file = "scikit_learn-1.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae80c08834a473d08a204d966982a62e11c976228d306a2648c575e3ead12111"}, - {file = "scikit_learn-1.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:552fd1b6ee22900cf1780d7386a554bb96949e9a359999177cf30211e6b20df6"}, - {file = "scikit_learn-1.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79970a6d759eb00a62266a31e2637d07d2d28446fca8079cf9afa7c07b0427f8"}, - {file = "scikit_learn-1.3.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:850a00b559e636b23901aabbe79b73dc604b4e4248ba9e2d6e72f95063765603"}, - {file = "scikit_learn-1.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee04835fb016e8062ee9fe9074aef9b82e430504e420bff51e3e5fffe72750ca"}, - {file = "scikit_learn-1.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d953531f5d9f00c90c34fa3b7d7cfb43ecff4c605dac9e4255a20b114a27369"}, - {file = "scikit_learn-1.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:151ac2bf65ccf363664a689b8beafc9e6aae36263db114b4ca06fbbbf827444a"}, - {file = "scikit_learn-1.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6a885a9edc9c0a341cab27ec4f8a6c58b35f3d449c9d2503a6fd23e06bbd4f6a"}, - {file = "scikit_learn-1.3.0-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:9877af9c6d1b15486e18a94101b742e9d0d2f343d35a634e337411ddb57783f3"}, - {file = "scikit_learn-1.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c470f53cea065ff3d588050955c492793bb50c19a92923490d18fcb637f6383a"}, - {file = "scikit_learn-1.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd6e2d7389542eae01077a1ee0318c4fec20c66c957f45c7aac0c6eb0fe3c612"}, - {file = "scikit_learn-1.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:3a11936adbc379a6061ea32fa03338d4ca7248d86dd507c81e13af428a5bc1db"}, - {file = "scikit_learn-1.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:998d38fcec96584deee1e79cd127469b3ad6fefd1ea6c2dfc54e8db367eb396b"}, - {file = "scikit_learn-1.3.0-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:ded35e810438a527e17623ac6deae3b360134345b7c598175ab7741720d7ffa7"}, - {file = "scikit_learn-1.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e8102d5036e28d08ab47166b48c8d5e5810704daecf3a476a4282d562be9a28"}, - {file = "scikit_learn-1.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7617164951c422747e7c32be4afa15d75ad8044f42e7d70d3e2e0429a50e6718"}, - {file = "scikit_learn-1.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:1d54fb9e6038284548072df22fd34777e434153f7ffac72c8596f2d6987110dd"}, + {file = "scikit-learn-1.3.2.tar.gz", hash = "sha256:a2f54c76accc15a34bfb9066e6c7a56c1e7235dda5762b990792330b52ccfb05"}, + {file = "scikit_learn-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e326c0eb5cf4d6ba40f93776a20e9a7a69524c4db0757e7ce24ba222471ee8a1"}, + {file = "scikit_learn-1.3.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:535805c2a01ccb40ca4ab7d081d771aea67e535153e35a1fd99418fcedd1648a"}, + {file = "scikit_learn-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1215e5e58e9880b554b01187b8c9390bf4dc4692eedeaf542d3273f4785e342c"}, + {file = "scikit_learn-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ee107923a623b9f517754ea2f69ea3b62fc898a3641766cb7deb2f2ce450161"}, + {file = "scikit_learn-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:35a22e8015048c628ad099da9df5ab3004cdbf81edc75b396fd0cff8699ac58c"}, + {file = "scikit_learn-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6fb6bc98f234fda43163ddbe36df8bcde1d13ee176c6dc9b92bb7d3fc842eb66"}, + {file = "scikit_learn-1.3.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:18424efee518a1cde7b0b53a422cde2f6625197de6af36da0b57ec502f126157"}, + {file = "scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3271552a5eb16f208a6f7f617b8cc6d1f137b52c8a1ef8edf547db0259b2c9fb"}, + {file = "scikit_learn-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc4144a5004a676d5022b798d9e573b05139e77f271253a4703eed295bde0433"}, + {file = "scikit_learn-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:67f37d708f042a9b8d59551cf94d30431e01374e00dc2645fa186059c6c5d78b"}, + {file = "scikit_learn-1.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8db94cd8a2e038b37a80a04df8783e09caac77cbe052146432e67800e430c028"}, + {file = "scikit_learn-1.3.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:61a6efd384258789aa89415a410dcdb39a50e19d3d8410bd29be365bcdd512d5"}, + {file = "scikit_learn-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb06f8dce3f5ddc5dee1715a9b9f19f20d295bed8e3cd4fa51e1d050347de525"}, + {file = "scikit_learn-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b2de18d86f630d68fe1f87af690d451388bb186480afc719e5f770590c2ef6c"}, + {file = "scikit_learn-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:0402638c9a7c219ee52c94cbebc8fcb5eb9fe9c773717965c1f4185588ad3107"}, + {file = "scikit_learn-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a19f90f95ba93c1a7f7924906d0576a84da7f3b2282ac3bfb7a08a32801add93"}, + {file = "scikit_learn-1.3.2-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:b8692e395a03a60cd927125eef3a8e3424d86dde9b2370d544f0ea35f78a8073"}, + {file = "scikit_learn-1.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15e1e94cc23d04d39da797ee34236ce2375ddea158b10bee3c343647d615581d"}, + {file = "scikit_learn-1.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:785a2213086b7b1abf037aeadbbd6d67159feb3e30263434139c98425e3dcfcf"}, + {file = "scikit_learn-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:64381066f8aa63c2710e6b56edc9f0894cc7bf59bd71b8ce5613a4559b6145e0"}, + {file = "scikit_learn-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6c43290337f7a4b969d207e620658372ba3c1ffb611f8bc2b6f031dc5c6d1d03"}, + {file = "scikit_learn-1.3.2-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:dc9002fc200bed597d5d34e90c752b74df516d592db162f756cc52836b38fe0e"}, + {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d08ada33e955c54355d909b9c06a4789a729977f165b8bae6f225ff0a60ec4a"}, + {file = "scikit_learn-1.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763f0ae4b79b0ff9cca0bf3716bcc9915bdacff3cebea15ec79652d1cc4fa5c9"}, + {file = "scikit_learn-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:ed932ea780517b00dae7431e031faae6b49b20eb6950918eb83bd043237950e0"}, ] [package.dependencies] joblib = ">=1.1.1" -numpy = ">=1.17.3" +numpy = ">=1.17.3,<2.0" scipy = ">=1.5.0" threadpoolctl = ">=2.0.0" @@ -7701,32 +7798,36 @@ pyobjc-framework-Cocoa = {version = "*", markers = "sys_platform == \"darwin\""} [[package]] name = "scs" -version = "3.2.3" -description = "scs: splitting conic solver" +version = "3.2.4.post1" +description = "Splitting conic solver" optional = true -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "scs-3.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9d7f7fd2d2cd88938c159b15e8915d9536610e50a9c34ecf36ce0290807afe55"}, - {file = "scs-3.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:368194620918301bf5309a35a7cd0444f1b1992b182c0a29033c26eb97b3dcb2"}, - {file = "scs-3.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:2d835a74c283be73bff6e1978d3ae77a60d9e87db1fdd12916464fa2a1dda517"}, - {file = "scs-3.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:81511fda3254c0d29089443dcd2305e81d203509e4d77afd160e9174b15ad75a"}, - {file = "scs-3.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:715ca4532de39b462bd393f9e8b4bf57be4122e20f0780d00db3cab1450a585d"}, - {file = "scs-3.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:fcf4b985a787135b3e83682a4c5b9bce9c6290cfead1d7225c38f34f5ead7187"}, - {file = "scs-3.2.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:91f5194cfabe354c9b1f0ea1de82114028d81c5a4a633177b8da2fe36f301758"}, - {file = "scs-3.2.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0d15f21e9053c5df37dab0d700da55fcc71f2f454748f364b9de594988b2ab3"}, - {file = "scs-3.2.3-cp37-cp37m-win_amd64.whl", hash = "sha256:6a80727167ad73151ced202a1ac6c0c7644b00b2e2607edec8a8807fc0443ac8"}, - {file = "scs-3.2.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:79d7d6c42ee636821460d317b8250945ce04363a47a63aef6b1eae0bd7a418fc"}, - {file = "scs-3.2.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6f64d23247797cfa289095fb5ddea6eeff5adf98961e953da90233278827e0c"}, - {file = "scs-3.2.3-cp38-cp38-win_amd64.whl", hash = "sha256:9a14a7c80efb34b469eb4dbaf26a9104dd2ca93e477985f948d8f28cd4b1a2ba"}, - {file = "scs-3.2.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3eb601738b260e3dcad117f3e02aceaca5d1e8eac2be225be1c0f9cbf83e75cb"}, - {file = "scs-3.2.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1b24176de97ecedf698596086f85da6dad472fe38a4b21cf4b460f87cae2c37"}, - {file = "scs-3.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:ddaa5af34a0e1f636d312eb1901bd407383f0b04dda50fba7242d56e618c0966"}, - {file = "scs-3.2.3.tar.gz", hash = "sha256:e3bd779e7e977e3ae5a2f2035aa4c2a309e29082d59a722d5d6592edc4bdb4b3"}, + {file = "scs-3.2.4.post1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51fed30d2a4a1e6fbfc1e52b4cb3adeecbe89d7c47f3539b49afbb852415fe19"}, + {file = "scs-3.2.4.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb0524c0b9c3ed0d65dae161475accf3efa8e170938eb93251a60e9709b156ee"}, + {file = "scs-3.2.4.post1-cp310-cp310-win_amd64.whl", hash = "sha256:534519819eea96f18902a9fce15c4ec562b99d23b38dc843a48cb137b5641613"}, + {file = "scs-3.2.4.post1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8d04ee4d19ac6d0f5053663bc48fcd5c5faed534272f13b10a4e173c814eea69"}, + {file = "scs-3.2.4.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37c23b4299ab77ff5f654573d5667dc982292a8ef2b979053b38c40663919f13"}, + {file = "scs-3.2.4.post1-cp311-cp311-win_amd64.whl", hash = "sha256:ae4624938d3e3a8b7e508029275c6ad7a978fd48c158d0818f69f4ae764bf945"}, + {file = "scs-3.2.4.post1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:40294e22bfe509bdf7fd65a6b77c38cec22dcb3567ff5a75f3c41a1faf2ef1d5"}, + {file = "scs-3.2.4.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a2337acb0604770b6df1473254065a51c210ff9c82fc7c4490595510287a337"}, + {file = "scs-3.2.4.post1-cp312-cp312-win_amd64.whl", hash = "sha256:8689e75a57e59846e65d1c4b9d57e9964b00fcbb8e67fc77f98cf6e0a0530abd"}, + {file = "scs-3.2.4.post1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ad991b00d0a87c85db57bf2f1863c21bdc4e2f13837f6c35e809f5936bc6f165"}, + {file = "scs-3.2.4.post1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a28af160a44268e726a59d6cf340629b82940c1a643c4c87fe777e9cbe550d75"}, + {file = "scs-3.2.4.post1-cp37-cp37m-win_amd64.whl", hash = "sha256:f6283f725f3fee63d4631c2532d01a5b2ea65883b04d3da3be06084b1c60171b"}, + {file = "scs-3.2.4.post1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b3a622cf2120ae765f0f3ad5c6f4f86796d317e29132bab2ad4af3c14d9bf4d"}, + {file = "scs-3.2.4.post1-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:4b5259137c263304effa2b28d0125437ac23569e6e7753c115ae1206ec5033fd"}, + {file = "scs-3.2.4.post1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:424710bc19b0506feee7e05e6d2b7af98acf09af5bd5353126164cbd46ac923f"}, + {file = "scs-3.2.4.post1-cp38-cp38-win_amd64.whl", hash = "sha256:e21bdc8046648846e2c204a6c5cf24eaaedd2b8f5e0a2ab41a647b0247b8d592"}, + {file = "scs-3.2.4.post1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:cea0f7e9473f43f7edf1641d020ead7e39653a81c540fbdba8f3b7b8480038c9"}, + {file = "scs-3.2.4.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6126f1d7ed5ff368cb8c1836715b17a50074314579eefc6d511995a3ab93d70"}, + {file = "scs-3.2.4.post1-cp39-cp39-win_amd64.whl", hash = "sha256:18788befa5284bb1f49149bac7f813703de60ef5b6bf7698a9f1c3a5a49b78e4"}, + {file = "scs-3.2.4.post1.tar.gz", hash = "sha256:7015d7a56d1d5b53264fd277289ea169949309e26101677ff88cd0e5030d032f"}, ] [package.dependencies] -numpy = ">=1.7" -scipy = ">=0.13.2" +numpy = "*" +scipy = "*" [[package]] name = "seaborn" @@ -7762,13 +7863,13 @@ doc = ["Sphinx", "sphinx-rtd-theme"] [[package]] name = "send2trash" -version = "1.8.2" +version = "1.8.3" description = "Send file to trash natively under Mac OS X, Windows and Linux" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" files = [ - {file = "Send2Trash-1.8.2-py3-none-any.whl", hash = "sha256:a384719d99c07ce1eefd6905d2decb6f8b7ed054025bb0e618919f945de4f679"}, - {file = "Send2Trash-1.8.2.tar.gz", hash = "sha256:c132d59fa44b9ca2b1699af5c86f57ce9f4c5eb56629d5d55fbb7a35f84e2312"}, + {file = "Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9"}, + {file = "Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf"}, ] [package.extras] @@ -7778,83 +7879,99 @@ win32 = ["pywin32"] [[package]] name = "setproctitle" -version = "1.3.2" +version = "1.3.3" description = "A Python module to customize the process title" optional = false python-versions = ">=3.7" files = [ - {file = "setproctitle-1.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:288943dec88e178bb2fd868adf491197cc0fc8b6810416b1c6775e686bab87fe"}, - {file = "setproctitle-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:630f6fe5e24a619ccf970c78e084319ee8be5be253ecc9b5b216b0f474f5ef18"}, - {file = "setproctitle-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c877691b90026670e5a70adfbcc735460a9f4c274d35ec5e8a43ce3f8443005"}, - {file = "setproctitle-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7a55fe05f15c10e8c705038777656fe45e3bd676d49ad9ac8370b75c66dd7cd7"}, - {file = "setproctitle-1.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab45146c71ca6592c9cc8b354a2cc9cc4843c33efcbe1d245d7d37ce9696552d"}, - {file = "setproctitle-1.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e00c9d5c541a2713ba0e657e0303bf96ddddc412ef4761676adc35df35d7c246"}, - {file = "setproctitle-1.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:265ecbe2c6eafe82e104f994ddd7c811520acdd0647b73f65c24f51374cf9494"}, - {file = "setproctitle-1.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c2c46200656280a064073447ebd363937562debef329482fd7e570c8d498f806"}, - {file = "setproctitle-1.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:fa2f50678f04fda7a75d0fe5dd02bbdd3b13cbe6ed4cf626e4472a7ccf47ae94"}, - {file = "setproctitle-1.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7f2719a398e1a2c01c2a63bf30377a34d0b6ef61946ab9cf4d550733af8f1ef1"}, - {file = "setproctitle-1.3.2-cp310-cp310-win32.whl", hash = "sha256:e425be62524dc0c593985da794ee73eb8a17abb10fe692ee43bb39e201d7a099"}, - {file = "setproctitle-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:e85e50b9c67854f89635a86247412f3ad66b132a4d8534ac017547197c88f27d"}, - {file = "setproctitle-1.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2a97d51c17d438cf5be284775a322d57b7ca9505bb7e118c28b1824ecaf8aeaa"}, - {file = "setproctitle-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:587c7d6780109fbd8a627758063d08ab0421377c0853780e5c356873cdf0f077"}, - {file = "setproctitle-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d17c8bd073cbf8d141993db45145a70b307385b69171d6b54bcf23e5d644de"}, - {file = "setproctitle-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e932089c35a396dc31a5a1fc49889dd559548d14cb2237adae260382a090382e"}, - {file = "setproctitle-1.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8e4f8f12258a8739c565292a551c3db62cca4ed4f6b6126664e2381acb4931bf"}, - {file = "setproctitle-1.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:570d255fd99c7f14d8f91363c3ea96bd54f8742275796bca67e1414aeca7d8c3"}, - {file = "setproctitle-1.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a8e0881568c5e6beff91ef73c0ec8ac2a9d3ecc9edd6bd83c31ca34f770910c4"}, - {file = "setproctitle-1.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4bba3be4c1fabf170595b71f3af46c6d482fbe7d9e0563999b49999a31876f77"}, - {file = "setproctitle-1.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:37ece938110cab2bb3957e3910af8152ca15f2b6efdf4f2612e3f6b7e5459b80"}, - {file = "setproctitle-1.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:db684d6bbb735a80bcbc3737856385b55d53f8a44ce9b46e9a5682c5133a9bf7"}, - {file = "setproctitle-1.3.2-cp311-cp311-win32.whl", hash = "sha256:ca58cd260ea02759238d994cfae844fc8b1e206c684beb8f38877dcab8451dfc"}, - {file = "setproctitle-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:88486e6cce2a18a033013d17b30a594f1c5cb42520c49c19e6ade40b864bb7ff"}, - {file = "setproctitle-1.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:92c626edc66169a1b09e9541b9c0c9f10488447d8a2b1d87c8f0672e771bc927"}, - {file = "setproctitle-1.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:710e16fa3bade3b026907e4a5e841124983620046166f355bbb84be364bf2a02"}, - {file = "setproctitle-1.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f29b75e86260b0ab59adb12661ef9f113d2f93a59951373eb6d68a852b13e83"}, - {file = "setproctitle-1.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c8d9650154afaa86a44ff195b7b10d683c73509d085339d174e394a22cccbb9"}, - {file = "setproctitle-1.3.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0452282258dfcc01697026a8841258dd2057c4438b43914b611bccbcd048f10"}, - {file = "setproctitle-1.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e49ae693306d7624015f31cb3e82708916759d592c2e5f72a35c8f4cc8aef258"}, - {file = "setproctitle-1.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1ff863a20d1ff6ba2c24e22436a3daa3cd80be1dfb26891aae73f61b54b04aca"}, - {file = "setproctitle-1.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:55ce1e9925ce1765865442ede9dca0ba9bde10593fcd570b1f0fa25d3ec6b31c"}, - {file = "setproctitle-1.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7fe9df7aeb8c64db6c34fc3b13271a363475d77bc157d3f00275a53910cb1989"}, - {file = "setproctitle-1.3.2-cp37-cp37m-win32.whl", hash = "sha256:e5c50e164cd2459bc5137c15288a9ef57160fd5cbf293265ea3c45efe7870865"}, - {file = "setproctitle-1.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a499fff50387c1520c085a07578a000123f519e5f3eee61dd68e1d301659651f"}, - {file = "setproctitle-1.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5b932c3041aa924163f4aab970c2f0e6b4d9d773f4d50326e0ea1cd69240e5c5"}, - {file = "setproctitle-1.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f4bfc89bd33ebb8e4c0e9846a09b1f5a4a86f5cb7a317e75cc42fee1131b4f4f"}, - {file = "setproctitle-1.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fcd3cf4286a60fdc95451d8d14e0389a6b4f5cebe02c7f2609325eb016535963"}, - {file = "setproctitle-1.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5fb4f769c02f63fac90989711a3fee83919f47ae9afd4758ced5d86596318c65"}, - {file = "setproctitle-1.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5194b4969f82ea842a4f6af2f82cd16ebdc3f1771fb2771796e6add9835c1973"}, - {file = "setproctitle-1.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f0cde41857a644b7353a0060b5f94f7ba7cf593ebde5a1094da1be581ac9a31"}, - {file = "setproctitle-1.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9124bedd8006b0e04d4e8a71a0945da9b67e7a4ab88fdad7b1440dc5b6122c42"}, - {file = "setproctitle-1.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c8a09d570b39517de10ee5b718730e171251ce63bbb890c430c725c8c53d4484"}, - {file = "setproctitle-1.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:8ff3c8cb26afaed25e8bca7b9dd0c1e36de71f35a3a0706b5c0d5172587a3827"}, - {file = "setproctitle-1.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:589be87172b238f839e19f146b9ea47c71e413e951ef0dc6db4218ddacf3c202"}, - {file = "setproctitle-1.3.2-cp38-cp38-win32.whl", hash = "sha256:4749a2b0c9ac52f864d13cee94546606f92b981b50e46226f7f830a56a9dc8e1"}, - {file = "setproctitle-1.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:e43f315c68aa61cbdef522a2272c5a5b9b8fd03c301d3167b5e1343ef50c676c"}, - {file = "setproctitle-1.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:de3a540cd1817ede31f530d20e6a4935bbc1b145fd8f8cf393903b1e02f1ae76"}, - {file = "setproctitle-1.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4058564195b975ddc3f0462375c533cce310ccdd41b80ac9aed641c296c3eff4"}, - {file = "setproctitle-1.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c5d5dad7c28bdd1ec4187d818e43796f58a845aa892bb4481587010dc4d362b"}, - {file = "setproctitle-1.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ffc61a388a5834a97953d6444a2888c24a05f2e333f9ed49f977a87bb1ad4761"}, - {file = "setproctitle-1.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fa1a0fbee72b47dc339c87c890d3c03a72ea65c061ade3204f285582f2da30f"}, - {file = "setproctitle-1.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8a988c7220c002c45347430993830666e55bc350179d91fcee0feafe64e1d4"}, - {file = "setproctitle-1.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bae283e85fc084b18ffeb92e061ff7ac5af9e183c9d1345c93e178c3e5069cbe"}, - {file = "setproctitle-1.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fed18e44711c5af4b681c2b3b18f85e6f0f1b2370a28854c645d636d5305ccd8"}, - {file = "setproctitle-1.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:b34baef93bfb20a8ecb930e395ccd2ae3268050d8cf4fe187de5e2bd806fd796"}, - {file = "setproctitle-1.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7f0bed90a216ef28b9d227d8d73e28a8c9b88c0f48a082d13ab3fa83c581488f"}, - {file = "setproctitle-1.3.2-cp39-cp39-win32.whl", hash = "sha256:4d8938249a7cea45ab7e1e48b77685d0f2bab1ebfa9dde23e94ab97968996a7c"}, - {file = "setproctitle-1.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:a47d97a75fd2d10c37410b180f67a5835cb1d8fdea2648fd7f359d4277f180b9"}, - {file = "setproctitle-1.3.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:dad42e676c5261eb50fdb16bdf3e2771cf8f99a79ef69ba88729aeb3472d8575"}, - {file = "setproctitle-1.3.2-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c91b9bc8985d00239f7dc08a49927a7ca1ca8a6af2c3890feec3ed9665b6f91e"}, - {file = "setproctitle-1.3.2-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8579a43eafd246e285eb3a5b939e7158073d5087aacdd2308f23200eac2458b"}, - {file = "setproctitle-1.3.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:2fbd8187948284293f43533c150cd69a0e4192c83c377da837dbcd29f6b83084"}, - {file = "setproctitle-1.3.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:faec934cfe5fd6ac1151c02e67156c3f526e82f96b24d550b5d51efa4a5527c6"}, - {file = "setproctitle-1.3.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1aafc91cbdacc9e5fe712c52077369168e6b6c346f3a9d51bf600b53eae56bb"}, - {file = "setproctitle-1.3.2-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b617f12c9be61e8f4b2857be4a4319754756845dbbbd9c3718f468bbb1e17bcb"}, - {file = "setproctitle-1.3.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b2c9cb2705fc84cb8798f1ba74194f4c080aaef19d9dae843591c09b97678e98"}, - {file = "setproctitle-1.3.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a149a5f7f2c5a065d4e63cb0d7a4b6d3b66e6e80f12e3f8827c4f63974cbf122"}, - {file = "setproctitle-1.3.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e3ac25bfc4a0f29d2409650c7532d5ddfdbf29f16f8a256fc31c47d0dc05172"}, - {file = "setproctitle-1.3.2-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65d884e22037b23fa25b2baf1a3316602ed5c5971eb3e9d771a38c3a69ce6e13"}, - {file = "setproctitle-1.3.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7aa0aac1711fadffc1d51e9d00a3bea61f68443d6ac0241a224e4d622489d665"}, - {file = "setproctitle-1.3.2.tar.gz", hash = "sha256:b9fb97907c830d260fa0658ed58afd48a86b2b88aac521135c352ff7fd3477fd"}, + {file = "setproctitle-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:897a73208da48db41e687225f355ce993167079eda1260ba5e13c4e53be7f754"}, + {file = "setproctitle-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c331e91a14ba4076f88c29c777ad6b58639530ed5b24b5564b5ed2fd7a95452"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbbd6c7de0771c84b4aa30e70b409565eb1fc13627a723ca6be774ed6b9d9fa3"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c05ac48ef16ee013b8a326c63e4610e2430dbec037ec5c5b58fcced550382b74"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1342f4fdb37f89d3e3c1c0a59d6ddbedbde838fff5c51178a7982993d238fe4f"}, + {file = "setproctitle-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc74e84fdfa96821580fb5e9c0b0777c1c4779434ce16d3d62a9c4d8c710df39"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9617b676b95adb412bb69645d5b077d664b6882bb0d37bfdafbbb1b999568d85"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6a249415f5bb88b5e9e8c4db47f609e0bf0e20a75e8d744ea787f3092ba1f2d0"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:38da436a0aaace9add67b999eb6abe4b84397edf4a78ec28f264e5b4c9d53cd5"}, + {file = "setproctitle-1.3.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:da0d57edd4c95bf221b2ebbaa061e65b1788f1544977288bdf95831b6e44e44d"}, + {file = "setproctitle-1.3.3-cp310-cp310-win32.whl", hash = "sha256:a1fcac43918b836ace25f69b1dca8c9395253ad8152b625064415b1d2f9be4fb"}, + {file = "setproctitle-1.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:200620c3b15388d7f3f97e0ae26599c0c378fdf07ae9ac5a13616e933cbd2086"}, + {file = "setproctitle-1.3.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:334f7ed39895d692f753a443102dd5fed180c571eb6a48b2a5b7f5b3564908c8"}, + {file = "setproctitle-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:950f6476d56ff7817a8fed4ab207727fc5260af83481b2a4b125f32844df513a"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:195c961f54a09eb2acabbfc90c413955cf16c6e2f8caa2adbf2237d1019c7dd8"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f05e66746bf9fe6a3397ec246fe481096664a9c97eb3fea6004735a4daf867fd"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b5901a31012a40ec913265b64e48c2a4059278d9f4e6be628441482dd13fb8b5"}, + {file = "setproctitle-1.3.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64286f8a995f2cd934082b398fc63fca7d5ffe31f0e27e75b3ca6b4efda4e353"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:184239903bbc6b813b1a8fc86394dc6ca7d20e2ebe6f69f716bec301e4b0199d"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:664698ae0013f986118064b6676d7dcd28fefd0d7d5a5ae9497cbc10cba48fa5"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e5119a211c2e98ff18b9908ba62a3bd0e3fabb02a29277a7232a6fb4b2560aa0"}, + {file = "setproctitle-1.3.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:417de6b2e214e837827067048f61841f5d7fc27926f2e43954567094051aff18"}, + {file = "setproctitle-1.3.3-cp311-cp311-win32.whl", hash = "sha256:6a143b31d758296dc2f440175f6c8e0b5301ced3b0f477b84ca43cdcf7f2f476"}, + {file = "setproctitle-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:a680d62c399fa4b44899094027ec9a1bdaf6f31c650e44183b50d4c4d0ccc085"}, + {file = "setproctitle-1.3.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:d4460795a8a7a391e3567b902ec5bdf6c60a47d791c3b1d27080fc203d11c9dc"}, + {file = "setproctitle-1.3.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bdfd7254745bb737ca1384dee57e6523651892f0ea2a7344490e9caefcc35e64"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:477d3da48e216d7fc04bddab67b0dcde633e19f484a146fd2a34bb0e9dbb4a1e"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ab2900d111e93aff5df9fddc64cf51ca4ef2c9f98702ce26524f1acc5a786ae7"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:088b9efc62d5aa5d6edf6cba1cf0c81f4488b5ce1c0342a8b67ae39d64001120"}, + {file = "setproctitle-1.3.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a6d50252377db62d6a0bb82cc898089916457f2db2041e1d03ce7fadd4a07381"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:87e668f9561fd3a457ba189edfc9e37709261287b52293c115ae3487a24b92f6"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:287490eb90e7a0ddd22e74c89a92cc922389daa95babc833c08cf80c84c4df0a"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:4fe1c49486109f72d502f8be569972e27f385fe632bd8895f4730df3c87d5ac8"}, + {file = "setproctitle-1.3.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4a6ba2494a6449b1f477bd3e67935c2b7b0274f2f6dcd0f7c6aceae10c6c6ba3"}, + {file = "setproctitle-1.3.3-cp312-cp312-win32.whl", hash = "sha256:2df2b67e4b1d7498632e18c56722851ba4db5d6a0c91aaf0fd395111e51cdcf4"}, + {file = "setproctitle-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:f38d48abc121263f3b62943f84cbaede05749047e428409c2c199664feb6abc7"}, + {file = "setproctitle-1.3.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:816330675e3504ae4d9a2185c46b573105d2310c20b19ea2b4596a9460a4f674"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68f960bc22d8d8e4ac886d1e2e21ccbd283adcf3c43136161c1ba0fa509088e0"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:00e6e7adff74796ef12753ff399491b8827f84f6c77659d71bd0b35870a17d8f"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:53bc0d2358507596c22b02db079618451f3bd720755d88e3cccd840bafb4c41c"}, + {file = "setproctitle-1.3.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad6d20f9541f5f6ac63df553b6d7a04f313947f550eab6a61aa758b45f0d5657"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c1c84beab776b0becaa368254801e57692ed749d935469ac10e2b9b825dbdd8e"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:507e8dc2891021350eaea40a44ddd887c9f006e6b599af8d64a505c0f718f170"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b1067647ac7aba0b44b591936118a22847bda3c507b0a42d74272256a7a798e9"}, + {file = "setproctitle-1.3.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2e71f6365744bf53714e8bd2522b3c9c1d83f52ffa6324bd7cbb4da707312cd8"}, + {file = "setproctitle-1.3.3-cp37-cp37m-win32.whl", hash = "sha256:7f1d36a1e15a46e8ede4e953abb104fdbc0845a266ec0e99cc0492a4364f8c44"}, + {file = "setproctitle-1.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9a402881ec269d0cc9c354b149fc29f9ec1a1939a777f1c858cdb09c7a261df"}, + {file = "setproctitle-1.3.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ff814dea1e5c492a4980e3e7d094286077054e7ea116cbeda138819db194b2cd"}, + {file = "setproctitle-1.3.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:accb66d7b3ccb00d5cd11d8c6e07055a4568a24c95cf86109894dcc0c134cc89"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:554eae5a5b28f02705b83a230e9d163d645c9a08914c0ad921df363a07cf39b1"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a911b26264dbe9e8066c7531c0591cfab27b464459c74385b276fe487ca91c12"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2982efe7640c4835f7355fdb4da313ad37fb3b40f5c69069912f8048f77b28c8"}, + {file = "setproctitle-1.3.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df3f4274b80709d8bcab2f9a862973d453b308b97a0b423a501bcd93582852e3"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:af2c67ae4c795d1674a8d3ac1988676fa306bcfa1e23fddb5e0bd5f5635309ca"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:af4061f67fd7ec01624c5e3c21f6b7af2ef0e6bab7fbb43f209e6506c9ce0092"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:37a62cbe16d4c6294e84670b59cf7adcc73faafe6af07f8cb9adaf1f0e775b19"}, + {file = "setproctitle-1.3.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a83ca086fbb017f0d87f240a8f9bbcf0809f3b754ee01cec928fff926542c450"}, + {file = "setproctitle-1.3.3-cp38-cp38-win32.whl", hash = "sha256:059f4ce86f8cc92e5860abfc43a1dceb21137b26a02373618d88f6b4b86ba9b2"}, + {file = "setproctitle-1.3.3-cp38-cp38-win_amd64.whl", hash = "sha256:ab92e51cd4a218208efee4c6d37db7368fdf182f6e7ff148fb295ecddf264287"}, + {file = "setproctitle-1.3.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c7951820b77abe03d88b114b998867c0f99da03859e5ab2623d94690848d3e45"}, + {file = "setproctitle-1.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5bc94cf128676e8fac6503b37763adb378e2b6be1249d207630f83fc325d9b11"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f5d9027eeda64d353cf21a3ceb74bb1760bd534526c9214e19f052424b37e42"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e4a8104db15d3462e29d9946f26bed817a5b1d7a47eabca2d9dc2b995991503"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c32c41ace41f344d317399efff4cffb133e709cec2ef09c99e7a13e9f3b9483c"}, + {file = "setproctitle-1.3.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbf16381c7bf7f963b58fb4daaa65684e10966ee14d26f5cc90f07049bfd8c1e"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e18b7bd0898398cc97ce2dfc83bb192a13a087ef6b2d5a8a36460311cb09e775"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69d565d20efe527bd8a9b92e7f299ae5e73b6c0470f3719bd66f3cd821e0d5bd"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:ddedd300cd690a3b06e7eac90ed4452348b1348635777ce23d460d913b5b63c3"}, + {file = "setproctitle-1.3.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:415bfcfd01d1fbf5cbd75004599ef167a533395955305f42220a585f64036081"}, + {file = "setproctitle-1.3.3-cp39-cp39-win32.whl", hash = "sha256:21112fcd2195d48f25760f0eafa7a76510871bbb3b750219310cf88b04456ae3"}, + {file = "setproctitle-1.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:5a740f05d0968a5a17da3d676ce6afefebeeeb5ce137510901bf6306ba8ee002"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6b9e62ddb3db4b5205c0321dd69a406d8af9ee1693529d144e86bd43bcb4b6c0"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e3b99b338598de0bd6b2643bf8c343cf5ff70db3627af3ca427a5e1a1a90dd9"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ae9a02766dad331deb06855fb7a6ca15daea333b3967e214de12cfae8f0ef5"}, + {file = "setproctitle-1.3.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:200ede6fd11233085ba9b764eb055a2a191fb4ffb950c68675ac53c874c22e20"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0d3a953c50776751e80fe755a380a64cb14d61e8762bd43041ab3f8cc436092f"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5e08e232b78ba3ac6bc0d23ce9e2bee8fad2be391b7e2da834fc9a45129eb87"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f1da82c3e11284da4fcbf54957dafbf0655d2389cd3d54e4eaba636faf6d117a"}, + {file = "setproctitle-1.3.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:aeaa71fb9568ebe9b911ddb490c644fbd2006e8c940f21cb9a1e9425bd709574"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:59335d000c6250c35989394661eb6287187854e94ac79ea22315469ee4f4c244"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3ba57029c9c50ecaf0c92bb127224cc2ea9fda057b5d99d3f348c9ec2855ad3"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d876d355c53d975c2ef9c4f2487c8f83dad6aeaaee1b6571453cb0ee992f55f6"}, + {file = "setproctitle-1.3.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:224602f0939e6fb9d5dd881be1229d485f3257b540f8a900d4271a2c2aa4e5f4"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d7f27e0268af2d7503386e0e6be87fb9b6657afd96f5726b733837121146750d"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f5e7266498cd31a4572378c61920af9f6b4676a73c299fce8ba93afd694f8ae7"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33c5609ad51cd99d388e55651b19148ea99727516132fb44680e1f28dd0d1de9"}, + {file = "setproctitle-1.3.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:eae8988e78192fd1a3245a6f4f382390b61bce6cfcc93f3809726e4c885fa68d"}, + {file = "setproctitle-1.3.3.tar.gz", hash = "sha256:c913e151e7ea01567837ff037a23ca8740192880198b7fbb90b16d181607caae"}, ] [package.extras] @@ -7878,43 +7995,41 @@ testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs ( [[package]] name = "setuptools-rust" -version = "1.6.0" +version = "1.9.0" description = "Setuptools Rust extension plugin" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "setuptools-rust-1.6.0.tar.gz", hash = "sha256:c86e734deac330597998bfbc08da45187e6b27837e23bd91eadb320732392262"}, - {file = "setuptools_rust-1.6.0-py3-none-any.whl", hash = "sha256:e28ae09fb7167c44ab34434eb49279307d611547cb56cb9789955cdb54a1aed9"}, + {file = "setuptools-rust-1.9.0.tar.gz", hash = "sha256:704df0948f2e4cc60c2596ad6e840ea679f4f43e58ed4ad0c1857807240eab96"}, + {file = "setuptools_rust-1.9.0-py3-none-any.whl", hash = "sha256:409caf49dcf7ad9bd510b4bf4011fbad504e745fae98f57fe1c06f3a97719638"}, ] [package.dependencies] semantic-version = ">=2.8.2,<3" setuptools = ">=62.4" -typing-extensions = ">=3.7.4.3" +tomli = {version = ">=1.2.1", markers = "python_version < \"3.11\""} [[package]] name = "setuptools-scm" -version = "7.1.0" +version = "8.0.4" description = "the blessed package to manage your versions by scm tags" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "setuptools_scm-7.1.0-py3-none-any.whl", hash = "sha256:73988b6d848709e2af142aa48c986ea29592bbcfca5375678064708205253d8e"}, - {file = "setuptools_scm-7.1.0.tar.gz", hash = "sha256:6c508345a771aad7d56ebff0e70628bf2b0ec7573762be9960214730de278f27"}, + {file = "setuptools-scm-8.0.4.tar.gz", hash = "sha256:b5f43ff6800669595193fd09891564ee9d1d7dcb196cab4b2506d53a2e1c95c7"}, + {file = "setuptools_scm-8.0.4-py3-none-any.whl", hash = "sha256:b47844cd2a84b83b3187a5782c71128c28b4c94cad8bfb871da2784a5cb54c4f"}, ] [package.dependencies] -packaging = ">=20.0" -setuptools = [ - {version = "*"}, - {version = ">=42", optional = true, markers = "extra == \"toml\""}, -] -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} +packaging = ">=20" +setuptools = "*" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} typing-extensions = "*" [package.extras] -test = ["pytest (>=6.2)", "virtualenv (>20)"] -toml = ["setuptools (>=42)"] +docs = ["entangled-cli[rich]", "mkdocs", "mkdocs-entangled-plugin", "mkdocs-material", "mkdocstrings[python]", "pygments"] +rich = ["rich"] +test = ["build", "pytest", "rich", "wheel"] [[package]] name = "sgmllib3k" @@ -7928,36 +8043,35 @@ files = [ [[package]] name = "shap" -version = "0.42.1" +version = "0.44.1" description = "A unified approach to explain the output of any machine learning model." optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "shap-0.42.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c6106e59dbd446114bb5f7f0762ae0fa4ffa28bdf79a860d287e37ac5233d48"}, - {file = "shap-0.42.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:46cf52ce701eeee554d7b773b09ff907838f1210013c1cee5ddbee021a7f2c72"}, - {file = "shap-0.42.1-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5d4e6c8d63a1e3535c2f3fc64f47f09862d1cc437ad434e9cdc50225d360266"}, - {file = "shap-0.42.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:60d272e133f28cce322049dadec8909d2912c12c31ba38cb2eb861c01e3d16b8"}, - {file = "shap-0.42.1-cp310-cp310-win_amd64.whl", hash = "sha256:c6d1b381a365a4a8582ac0fe1800282a89479757e20fb5f8d8db2ec8e853461c"}, - {file = "shap-0.42.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b6bfe78edf8478c5f0bc2ae1f4150ab1ae3065b5655fcce580fd99ef30601db7"}, - {file = "shap-0.42.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:53f6b6ab79f67dabb6fbc6613b373ebd726c200f8136f1f7e43d8a8068edcad1"}, - {file = "shap-0.42.1-cp311-cp311-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce0fc9654ab62c6edeaf375c235a781bb280a40ffbbdbce35102d3b2d1a323a4"}, - {file = "shap-0.42.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c570de5b91e26d26c93e6c028d13636845ef86619a3559145de98b7ec1148f1"}, - {file = "shap-0.42.1-cp311-cp311-win_amd64.whl", hash = "sha256:b32b13a5a5fc089594b676f32565d5c5ea3abf5f0755b0fa0d25ffc9d53cb6ea"}, - {file = "shap-0.42.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:34bc359b7c60f873d589133a54640929f76ead7cbe036d5faa35ddb96d2a8168"}, - {file = "shap-0.42.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f14bcad9dcc3b48082c3b9a93ca3577610d110a768674b1ce209ada18619c133"}, - {file = "shap-0.42.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56b1d4aa0c9bba4050279a2bfcc3efcabb1af45cb1657e6c57d629810b4b360f"}, - {file = "shap-0.42.1-cp37-cp37m-win_amd64.whl", hash = "sha256:26a3c8321852f12c650f685973159fbdcef75aae47405c4ceb702e3dbf49dcac"}, - {file = "shap-0.42.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:93c97525068868bd84a13a68f853b6286fafc035bbc308291e3a6497677c5d89"}, - {file = "shap-0.42.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8d9b55b34e9027157f02f996bab71cc5e286ed246c031112a700461a1e2acb4f"}, - {file = "shap-0.42.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6acc29bd3e1bd8eebf94d22ec35421a791fce62d35260e34468e6e6cf008a7c5"}, - {file = "shap-0.42.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6bb4e3044240b300690d7e0282b512d4ffa4def49816e03fe0d6a06dcbde957"}, - {file = "shap-0.42.1-cp38-cp38-win_amd64.whl", hash = "sha256:00cf2878c4a5fa5a6fcb72520ace9d17a027d64dd49272bd2072c20f2f97121d"}, - {file = "shap-0.42.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:48511486c568a09d469381278bb40982cb0f74c1cf8a391dfb79d81e53843beb"}, - {file = "shap-0.42.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d43d31adeae9b1f628f49917179777580c7deceefa6156b5cf488a298287eabd"}, - {file = "shap-0.42.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d0b2e82bb3a5938b41fa640bb86894dc14b4935d419597d33b7d04392cd6ad0"}, - {file = "shap-0.42.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de4bf0035265cbc127b39ad8ecd1272acb5619e89cae666808d87d17cf6a0b28"}, - {file = "shap-0.42.1-cp39-cp39-win_amd64.whl", hash = "sha256:dfc77a2a4c37ac1c74c54af60d92732991386bd60da8763660846225384fe592"}, - {file = "shap-0.42.1.tar.gz", hash = "sha256:64403915e4a07d2951e7eee4af0e835b1b519367b11806fe1aa4bd6d81adb626"}, + {file = "shap-0.44.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:93a94961a355249855f13f1ed564466afa1c5fae84f868dd56e50e936f4f9b57"}, + {file = "shap-0.44.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d2919f2b255e31363182afb1627b374eb6c4724c90b0318719cbe90a316682f5"}, + {file = "shap-0.44.1-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ad3192026a0e4c3e399ef499da4f726ab01d62f388e03c804d8e10c4e61c8d1"}, + {file = "shap-0.44.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4ba4f3e84c3adf2c5a55e6d2becb7a4bb83e5784f7aa373316099a105ad593f"}, + {file = "shap-0.44.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1f19a3c531c6ceb0d7adea8262385580b52ef187981606342cd03288fc48cbfa"}, + {file = "shap-0.44.1-cp310-cp310-win_amd64.whl", hash = "sha256:d65a21a64f3c1e76e1fb5277a0cfbcce447c08a26eaef311b1cbae9a6efe0ea0"}, + {file = "shap-0.44.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:44ed7a80ae30ed3927f1bc7911f6f04bb32bb2d938a9e8a5794b2bb99e3b99cc"}, + {file = "shap-0.44.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e98bb13dc351317ad2420dfe2dbca5361237ab9bef511fbe28ce6c1dfb40ff8c"}, + {file = "shap-0.44.1-cp311-cp311-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fe63f1f4acf6bdfa3c85db85067d0fda2a29fe38be2d14a2811844f35290f43"}, + {file = "shap-0.44.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fa67a8810a042aa2366224afa612ded8a2a77b5a5a0d89ea60eba5eff3a0c1b"}, + {file = "shap-0.44.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dda26c39ac0ef17233deba09b0f313ceb4d5fa663dced2a1b77a494d48db96b8"}, + {file = "shap-0.44.1-cp311-cp311-win_amd64.whl", hash = "sha256:e1c3de8747fb451e59768dca11b054e395a2a1601c7482738897616a70679419"}, + {file = "shap-0.44.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c82efde41d2b2c65d707b678a0d057d77436faf72331a623545aa742ffe5b9f5"}, + {file = "shap-0.44.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:89f4492b406ec9908750560281c4616aff2a28c61f3ad2f6ac511270f44a0c5a"}, + {file = "shap-0.44.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:497bde2083b2a27e0a4b8ded09927c11c8803e80e76cb2e87e2136c49f1c93b2"}, + {file = "shap-0.44.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a466d8a9bb12e7e07f13e68ea2859e4deb1dc6d3953c3a88310bd77484943cd6"}, + {file = "shap-0.44.1-cp38-cp38-win_amd64.whl", hash = "sha256:6aede800f0ec9efa8acd35913d791304d46376d444e8c6e1be905606e626c5e2"}, + {file = "shap-0.44.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ab36e2aecd0c1ba3df58f2452aa4aa24832ec766cbb2a794e2411897eb728b30"}, + {file = "shap-0.44.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:668ebe97c60a12bdffe254dfb2c8598cf24416e202b4b662076846b12d10b4b7"}, + {file = "shap-0.44.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:947c7e25b96d37763948ef2edd1711c6b3098a161de8e97fa0d1fdad6e49848c"}, + {file = "shap-0.44.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62bb07b4748db004c78802494c29e5e70a2efff967a5c4d50209d2ee2ace16db"}, + {file = "shap-0.44.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:febd7f0ad6ac27f999ed857a897f0f9963d4a4d9eeb003ee2505cf6164590d9c"}, + {file = "shap-0.44.1-cp39-cp39-win_amd64.whl", hash = "sha256:3c873d26e4fdcdb9e6a83a1e05c1e9c8c8b48ac4365b0259d6e138afb3729c32"}, + {file = "shap-0.44.1.tar.gz", hash = "sha256:a21d5a622e12e7c3b4a58d6e93b70133b7e09b6342b19746071a0dc2d190b432"}, ] [package.dependencies] @@ -7972,11 +8086,12 @@ slicer = "0.0.7" tqdm = ">=4.27.0" [package.extras] -docs = ["ipython", "matplotlib", "nbsphinx", "numpydoc", "sphinx", "sphinx-rtd-theme"] +docs = ["ipython", "matplotlib", "myst-parser (==2.0.0)", "nbsphinx (==0.9.3)", "numpydoc", "requests", "sphinx (==7.2.6)", "sphinx-github-changelog (==1.2.1)", "sphinx-rtd-theme (==2.0.0)"] others = ["lime"] plots = ["ipython", "matplotlib"] -test = ["catboost", "lightgbm", "opencv-python", "protobuf (==3.20.3)", "pyod", "pyspark", "pytest", "pytest-cov", "pytest-mpl", "sentencepiece", "tensorflow", "torch", "torchvision", "transformers", "xgboost"] +test = ["catboost", "gpboost", "lightgbm", "ngboost", "opencv-python", "protobuf (==3.20.3)", "pyod", "pyspark", "pytest", "pytest-cov", "pytest-mpl", "sentencepiece", "tensorflow", "torch", "torchvision", "transformers", "xgboost"] test-core = ["pytest", "pytest-cov", "pytest-mpl"] +test-notebooks = ["datasets", "jupyter", "keras", "nbconvert", "nbformat", "nlp", "transformers"] [[package]] name = "six" @@ -8002,24 +8117,24 @@ files = [ [[package]] name = "smmap" -version = "5.0.0" +version = "5.0.1" description = "A pure Python implementation of a sliding window memory map manager" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "smmap-5.0.0-py3-none-any.whl", hash = "sha256:2aba19d6a040e78d8b09de5c57e96207b09ed71d8e55ce0959eeee6c8e190d94"}, - {file = "smmap-5.0.0.tar.gz", hash = "sha256:c840e62059cd3be204b0c9c9f74be2c09d5648eddd4580d9314c3ecde0b30936"}, + {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, + {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, ] [[package]] name = "sniffio" -version = "1.3.0" +version = "1.3.1" description = "Sniff out which async library your code is running under" optional = false python-versions = ">=3.7" files = [ - {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, - {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, ] [[package]] @@ -8035,13 +8150,13 @@ files = [ [[package]] name = "soupsieve" -version = "2.4.1" +version = "2.5" description = "A modern CSS selector implementation for Beautiful Soup." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "soupsieve-2.4.1-py3-none-any.whl", hash = "sha256:1c1bfee6819544a3447586c889157365a27e10d88cde3ad3da0cf0ddf646feb8"}, - {file = "soupsieve-2.4.1.tar.gz", hash = "sha256:89d12b2d5dfcd2c9e8c22326da9d9aa9cb3dfab0a83a024f05704076ee8d35ea"}, + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, ] [[package]] @@ -8190,17 +8305,18 @@ test = ["pytest"] [[package]] name = "sqlglot" -version = "17.6.0" +version = "23.10.0" description = "An easily customizable SQL parser and transpiler" optional = true -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "sqlglot-17.6.0-py3-none-any.whl", hash = "sha256:0d4a88c69576f53d8cb47bfc42b9e25bd935cb797308c3b40e41ee5bbd494dd8"}, - {file = "sqlglot-17.6.0.tar.gz", hash = "sha256:b03189744635013d4a8f673c7558edb6c480221cd1a47b8d7d00a10ed0c5713a"}, + {file = "sqlglot-23.10.0-py3-none-any.whl", hash = "sha256:519ea26007688bbc831939c0c6125762ad5c71339df1ac8184a64d762f75684c"}, + {file = "sqlglot-23.10.0.tar.gz", hash = "sha256:b80a35de7716464de89cc77678d0a7f972e4a8acaaa7cefcdc6db05ffeb6c951"}, ] [package.extras] -dev = ["autoflake", "black", "duckdb (>=0.6)", "isort", "mypy (>=0.990)", "pandas", "pdoc", "pre-commit", "pyspark", "python-dateutil"] +dev = ["duckdb (>=0.6)", "maturin (>=1.4,<2.0)", "mypy", "pandas", "pandas-stubs", "pdoc", "pre-commit", "pyspark", "python-dateutil", "ruff (==0.3.2)", "types-python-dateutil", "typing-extensions"] +rs = ["sqlglotrs (==0.2.0)"] [[package]] name = "squarify" @@ -8215,13 +8331,13 @@ files = [ [[package]] name = "stack-data" -version = "0.6.2" +version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" optional = false python-versions = "*" files = [ - {file = "stack_data-0.6.2-py3-none-any.whl", hash = "sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8"}, - {file = "stack_data-0.6.2.tar.gz", hash = "sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815"}, + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, ] [package.dependencies] @@ -8233,31 +8349,54 @@ pure-eval = "*" tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] [[package]] -name = "statsforecast" -version = "1.5.0" -description = "Time series forecasting suite using statistical models" +name = "stanio" +version = "0.5.0" +description = "Utilities for preparing Stan inputs and processing Stan outputs" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "statsforecast-1.5.0-py3-none-any.whl", hash = "sha256:fafe3c7170af59b51d720b67b6c8046ed95a474242d07bdd44070dfdde28e9c4"}, - {file = "statsforecast-1.5.0.tar.gz", hash = "sha256:3196e52908d8a2439d732dc49f4d3f0ae9c5993be23622ccedd152b1671be802"}, + {file = "stanio-0.5.0-py3-none-any.whl", hash = "sha256:412f8ede127968be51e074be6a6ca1e66d5a8ed50805e2fed89b76868e7332ae"}, + {file = "stanio-0.5.0.tar.gz", hash = "sha256:dee429314d965f390181afa8ff7ff8144446eeb58cc2547ccc108ba73e6744e2"}, ] [package.dependencies] +numpy = "*" + +[package.extras] +test = ["pandas", "pytest", "pytest-cov"] +ujson = ["ujson (>=5.5.0)"] + +[[package]] +name = "statsforecast" +version = "1.7.4" +description = "Time series forecasting suite using statistical models" +optional = true +python-versions = ">=3.8" +files = [ + {file = "statsforecast-1.7.4-py3-none-any.whl", hash = "sha256:0863d371e87fdfaf0e157bfee5d242e9899365a50c558a30331ec0d965c0cc64"}, + {file = "statsforecast-1.7.4.tar.gz", hash = "sha256:eaea757f0a8835bea5a710df02c3248c0bc0eff940ae8d83a46fc339abb52280"}, +] + +[package.dependencies] +cloudpickle = "*" +coreforecast = ">=0.0.7" fugue = ">=0.8.1" -matplotlib = "*" numba = ">=0.55.0" numpy = ">=1.21.6" pandas = ">=1.3.5" -plotly = "*" -plotly-resampler = "*" scipy = ">=1.7.3" statsmodels = ">=0.13.2" +threadpoolctl = "*" tqdm = "*" +utilsforecast = ">=0.0.24" [package.extras] -dev = ["black", "datasetsforecast", "flake8", "fugue (>=0.7.0)", "fugue[dask] (>=0.8.1)", "matplotlib", "mypy", "nbdev", "neuralforecast", "pmdarima", "prophet", "protobuf (>=3.15.3,<4.0.0)", "ray", "scikit-learn"] -ray = ["fugue[ray] (>=0.8.1)", "protobuf (>=3.15.3,<4.0.0)"] +dask = ["fugue[dask] (>=0.8.1)"] +dev = ["black", "datasetsforecast", "flake8", "fugue[dask] (>=0.8.1)", "fugue[ray] (>=0.8.1)", "fugue[spark] (>=0.8.1)", "mypy", "nbdev", "nbdev-plotly", "pandas[plot]", "plotly", "plotly-resampler", "pmdarima", "polars", "prophet", "protobuf (>=3.15.3,<4.0.0)", "pyarrow", "ray (<2.8)", "scikit-learn", "supersmoother"] +plotly = ["plotly", "plotly-resampler"] +polars = ["polars"] +ray = ["fugue[ray] (>=0.8.1)", "protobuf (>=3.15.3,<4.0.0)", "ray (<2.8)"] +spark = ["fugue[spark] (>=0.8.1)"] [[package]] name = "statsmodels" @@ -8354,13 +8493,13 @@ docs = ["ipykernel", "jupyter-client", "matplotlib", "nbconvert", "nbformat", "n [[package]] name = "stevedore" -version = "5.1.0" +version = "5.2.0" description = "Manage dynamic plugins for Python applications" optional = false python-versions = ">=3.8" files = [ - {file = "stevedore-5.1.0-py3-none-any.whl", hash = "sha256:8cc040628f3cea5d7128f2e76cf486b2251a4e543c7b938f58d9a377f6694a2d"}, - {file = "stevedore-5.1.0.tar.gz", hash = "sha256:a54534acf9b89bc7ed264807013b505bf07f74dbe4bcfa37d32bd063870b087c"}, + {file = "stevedore-5.2.0-py3-none-any.whl", hash = "sha256:1c15d95766ca0569cad14cb6272d4d31dae66b011a929d7c18219c176ea1b5c9"}, + {file = "stevedore-5.2.0.tar.gz", hash = "sha256:46b93ca40e1114cea93d738a6c1e365396981bb6bb78c27045b7587c9473544d"}, ] [package.dependencies] @@ -8368,13 +8507,13 @@ pbr = ">=2.0.0,<2.1.0 || >2.1.0" [[package]] name = "streamlit" -version = "1.24.1" +version = "1.33.0" description = "A faster way to build and share data apps" optional = false -python-versions = ">=3.8, !=3.9.7" +python-versions = "!=3.9.7,>=3.8" files = [ - {file = "streamlit-1.24.1-py2.py3-none-any.whl", hash = "sha256:569211b426ca078c0c2959a6c9a1413c2e81eca23e769fbf12308ba5bffd1f49"}, - {file = "streamlit-1.24.1.tar.gz", hash = "sha256:fd5f0b64798e9706364408fb589b77595314a6315d13b2d750b963c7ae97f362"}, + {file = "streamlit-1.33.0-py2.py3-none-any.whl", hash = "sha256:bfacb5d1edefcf803c2040b051a21b4c81317a9865448e6767d0a0c6aae7edae"}, + {file = "streamlit-1.33.0.tar.gz", hash = "sha256:a8da8ff46f5b948c56d2dc7aca7a61cf8d995f4f21744cf82258ae75e63004ba"}, ] [package.dependencies] @@ -8382,29 +8521,24 @@ altair = ">=4.0,<6" blinker = ">=1.0.0,<2" cachetools = ">=4.0,<6" click = ">=7.0,<9" -gitpython = ">=3,<3.1.19 || >3.1.19,<4" -importlib-metadata = ">=1.4,<7" -numpy = ">=1,<2" -packaging = ">=14.1,<24" -pandas = ">=0.25,<3" -pillow = ">=6.2.0,<10" +gitpython = ">=3.0.7,<3.1.19 || >3.1.19,<4" +numpy = ">=1.19.3,<2" +packaging = ">=16.8,<25" +pandas = ">=1.3.0,<3" +pillow = ">=7.1.0,<11" protobuf = ">=3.20,<5" -pyarrow = ">=4.0" -pydeck = ">=0.1.dev5,<1" -pympler = ">=0.9,<2" -python-dateutil = ">=2,<3" -requests = ">=2.4,<3" -rich = ">=10.11.0,<14" -tenacity = ">=8.0.0,<9" -toml = "<2" +pyarrow = ">=7.0" +pydeck = ">=0.8.0b4,<1" +requests = ">=2.27,<3" +rich = ">=10.14.0,<14" +tenacity = ">=8.1.0,<9" +toml = ">=0.10.1,<2" tornado = ">=6.0.3,<7" -typing-extensions = ">=4.0.1,<5" -tzlocal = ">=1.1,<5" -validators = ">=0.2,<1" -watchdog = {version = "*", markers = "platform_system != \"Darwin\""} +typing-extensions = ">=4.3.0,<5" +watchdog = {version = ">=2.1.5", markers = "platform_system != \"Darwin\""} [package.extras] -snowflake = ["snowflake-snowpark-python"] +snowflake = ["snowflake-connector-python (>=2.8.0)", "snowflake-snowpark-python (>=0.9.0)"] [[package]] name = "svglib" @@ -8458,13 +8592,13 @@ dev = ["pip-tools", "pytest", "rpy2"] [[package]] name = "tenacity" -version = "8.2.2" +version = "8.2.3" description = "Retry code until it succeeds" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" files = [ - {file = "tenacity-8.2.2-py3-none-any.whl", hash = "sha256:2f277afb21b851637e8f52e6a613ff08734c347dc19ade928e519d7d2d8569b0"}, - {file = "tenacity-8.2.2.tar.gz", hash = "sha256:43af037822bd0029025877f3b2d97cc4d7bb0c2991000a3d59d71517c5c969e0"}, + {file = "tenacity-8.2.3-py3-none-any.whl", hash = "sha256:ce510e327a630c9e1beaf17d42e6ffacc88185044ad85cf74c0a8887c6a0f88c"}, + {file = "tenacity-8.2.3.tar.gz", hash = "sha256:5398ef0d78e63f40007c1fb4c0bff96e1911394d2fa8d194f77619c05ff6cc8a"}, ] [package.extras] @@ -8472,12 +8606,12 @@ doc = ["reno", "sphinx", "tornado (>=4.5)"] [[package]] name = "tensorboard" -version = "2.13.0" +version = "2.14.0" description = "TensorBoard lets you watch Tensors Flow" optional = true python-versions = ">=3.8" files = [ - {file = "tensorboard-2.13.0-py3-none-any.whl", hash = "sha256:ab69961ebddbddc83f5fa2ff9233572bdad5b883778c35e4fe94bf1798bd8481"}, + {file = "tensorboard-2.14.0-py3-none-any.whl", hash = "sha256:3667f9745d99280836ad673022362c840f60ed8fefd5a3e30bf071f5a8fd0017"}, ] [package.dependencies] @@ -8496,25 +8630,25 @@ wheel = ">=0.26" [[package]] name = "tensorboard-data-server" -version = "0.7.1" +version = "0.7.2" description = "Fast data loading for TensorBoard" optional = true python-versions = ">=3.7" files = [ - {file = "tensorboard_data_server-0.7.1-py3-none-any.whl", hash = "sha256:9938bd39f5041797b33921066fba0eab03a0dd10d1887a05e62ae58841ad4c3f"}, - {file = "tensorboard_data_server-0.7.1-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:be8d016a1aa394e6198280d4a3dc37898f56467310c5f5e617cac10a783e055a"}, - {file = "tensorboard_data_server-0.7.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:255c02b7f5b03dd5c0a88c928e563441ff39e1d4b4a234cdbe09f016e53d9594"}, + {file = "tensorboard_data_server-0.7.2-py3-none-any.whl", hash = "sha256:7e0610d205889588983836ec05dc098e80f97b7e7bbff7e994ebb78f578d0ddb"}, + {file = "tensorboard_data_server-0.7.2-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:9fe5d24221b29625dbc7328b0436ca7fc1c23de4acf4d272f1180856e32f9f60"}, + {file = "tensorboard_data_server-0.7.2-py3-none-manylinux_2_31_x86_64.whl", hash = "sha256:ef687163c24185ae9754ed5650eb5bc4d84ff257aabdc33f0cc6f74d8ba54530"}, ] [[package]] name = "terminado" -version = "0.17.1" +version = "0.18.1" description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "terminado-0.17.1-py3-none-any.whl", hash = "sha256:8650d44334eba354dd591129ca3124a6ba42c3d5b70df5051b6921d506fdaeae"}, - {file = "terminado-0.17.1.tar.gz", hash = "sha256:6ccbbcd3a4f8a25a5ec04991f39a0b8db52dfcd487ea0e578d977e6752380333"}, + {file = "terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0"}, + {file = "terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e"}, ] [package.dependencies] @@ -8525,6 +8659,7 @@ tornado = ">=6.1.0" [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] +typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] [[package]] name = "textwrap3" @@ -8539,67 +8674,78 @@ files = [ [[package]] name = "threadpoolctl" -version = "3.2.0" +version = "3.4.0" description = "threadpoolctl" optional = false python-versions = ">=3.8" files = [ - {file = "threadpoolctl-3.2.0-py3-none-any.whl", hash = "sha256:2b7818516e423bdaebb97c723f86a7c6b0a83d3f3b0970328d66f4d9104dc032"}, - {file = "threadpoolctl-3.2.0.tar.gz", hash = "sha256:c96a0ba3bdddeaca37dc4cc7344aafad41cdb8c313f74fdfe387a867bba93355"}, + {file = "threadpoolctl-3.4.0-py3-none-any.whl", hash = "sha256:8f4c689a65b23e5ed825c8436a92b818aac005e0f3715f6a1664d7c7ee29d262"}, + {file = "threadpoolctl-3.4.0.tar.gz", hash = "sha256:f11b491a03661d6dd7ef692dd422ab34185d982466c49c8f98c8f716b5c93196"}, ] [[package]] name = "time-machine" -version = "2.11.0" +version = "2.14.1" description = "Travel through time in your tests." optional = false python-versions = ">=3.8" files = [ - {file = "time_machine-2.11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a6c25f03b634ff9389d2ff78f2f0168421a1be692cb8ab135202a8fda3e7b30a"}, - {file = "time_machine-2.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4cbeac9003319a4e84540c794e9be9cc2fa69abe5d0005091419a16b8e199ded"}, - {file = "time_machine-2.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8cb21faf0192e9c7776921cec70dc36c54e69e3544effe2a3360700cc21b4ab"}, - {file = "time_machine-2.11.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a41e6be04a8290e353218827d288dd5070b02758eb69bb58b8c4a823115b4e9"}, - {file = "time_machine-2.11.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcccab530ff39935f62c325004f55958e3349d8dfc693bc6a96dffe692b6ef1b"}, - {file = "time_machine-2.11.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:13502936af3e58396327fcff6228f113c06d94dd9965070d8c8d1b6a8ef20167"}, - {file = "time_machine-2.11.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bdbf92b1a479356b97a277ed229d6b592f1fb14e71d3534b32346208eb7eff50"}, - {file = "time_machine-2.11.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:863c7e74539741737fedc5fff8b0db4de53db9c9a9e5428c2b977f34daa97bad"}, - {file = "time_machine-2.11.0-cp310-cp310-win32.whl", hash = "sha256:575342fbebceddf42a0d1cb3855db8d1bde26ac6fe969c6dc457ff227e63df2d"}, - {file = "time_machine-2.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:e26d26a318a609d3471ffb307c218ddb5c1514de65cb896bea0b230833340018"}, - {file = "time_machine-2.11.0-cp310-cp310-win_arm64.whl", hash = "sha256:c48c7705880608086dd9919173dd63985837e1b1db56ee048ff4797aed99018b"}, - {file = "time_machine-2.11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f1b1c0cd878b432d724cca59f9fe57acf29c3d4a9cb1e6c70278b77c55b23523"}, - {file = "time_machine-2.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:628c2eb2037eff591ac8abefce20488930d6227158c080b3d3256a0855436431"}, - {file = "time_machine-2.11.0-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:945bb190b1f1a1d1b642cbe77c4bc3598c8085840a539904aed2b28790cca5d2"}, - {file = "time_machine-2.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98dff4645fddc1c7cddd2d22d56c10f87d23fd5091fbf03d65aa523de4f5de08"}, - {file = "time_machine-2.11.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b773c16427714b9f70a96e75834d47e4105450a9dcd75025b11f22a4e6b16c65"}, - {file = "time_machine-2.11.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ddd6a83a4a86de62e125ed4431934602a1074a946b9243eae8cd76ebab78b73"}, - {file = "time_machine-2.11.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c29cb7f7358b34722c3f005aa3ca34cee22c057a642e648af82aada30a2281a9"}, - {file = "time_machine-2.11.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:86207d54f1b4f4eab78b55d120a686d8cb55da77131ba5c1fc5d593e74e58e62"}, - {file = "time_machine-2.11.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ee1d6ac1d292953dc90d1a39aef3f727ea02cce4426f025bc55d4c1553006044"}, - {file = "time_machine-2.11.0-cp311-cp311-win32.whl", hash = "sha256:c6395911dad8c5ed138f143941ae4d40fd5da383649ac0ffe4c2f2a1ee88911a"}, - {file = "time_machine-2.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:e883660a606e696085fcc25833ed31a5227e201314c4e238c8abdaf937cd472f"}, - {file = "time_machine-2.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:6a76908586b8d79cf4d38393f7b8164cedd9fad5e2100014351aff885d1ef5af"}, - {file = "time_machine-2.11.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:995de1e3d631be23c1ac340db75680cb04419205f652155fe5c40367a8810e6e"}, - {file = "time_machine-2.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1406a9487224d68e7e756093b8009a1946c8899d414676740d934b09f7e12f40"}, - {file = "time_machine-2.11.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72fa4edd05fbadd77ccb77e184414cff3137f7ff80c610146481c88080a2848c"}, - {file = "time_machine-2.11.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9fd4ab2f4a056c17e75e22cafd0461fcf94ae824d3140f7f0e9d513548ca6b6c"}, - {file = "time_machine-2.11.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8843a705cbd44971b39d25e24140c4922a836afb7a66311aa4fc437c0113a89"}, - {file = "time_machine-2.11.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d876570c26ffce923032d1d9544a14fb48d764581fa96baa44cd3a40a9eab8a7"}, - {file = "time_machine-2.11.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:60ad90d8a4437c961be3b3de616fe12852eab802b87b086ac621b6a96eca125e"}, - {file = "time_machine-2.11.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:01c9732d7f396210fa384ec43c86395a94cb22f4687e9fdb972ecc05bb1b1570"}, - {file = "time_machine-2.11.0-cp38-cp38-win32.whl", hash = "sha256:855b6911ca20f6d4f118593ab79c5b45ee2311739944f8d1ddfdcc755f131c8e"}, - {file = "time_machine-2.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:2c99bdd61d83fdd65ee61ad0b7d1e5cd8c85143ed6a4d0a4acb445a99e3646f9"}, - {file = "time_machine-2.11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cc801788d230a55927f8dededff534014c8023ccd4baf89558d234a9e8bed3c7"}, - {file = "time_machine-2.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e0cd973d829a09c1eb9292270141b319606bca16e427ff8fcf0df69982c987a6"}, - {file = "time_machine-2.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2714a00be7fcd2fd2c0cd430470693a7914f936f5218c5d1f1c7632ad6b003cf"}, - {file = "time_machine-2.11.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64940b7f70d808c766f893c8f62d5fc1b2ec9217eebfbd50ad9cc4000325867d"}, - {file = "time_machine-2.11.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2b53b29895addca43a065d66af6e632b165299e8b4b514b4f62870b71af9aff"}, - {file = "time_machine-2.11.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b140c434c81331df16c3ca1654c7892aecf2fdfd4dc7b7136ca757a9847c1bf3"}, - {file = "time_machine-2.11.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:be037615c9f0b81a9d101a44c8d88a34c6a202b5eb60a4dcacfba183d48ae0d2"}, - {file = "time_machine-2.11.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:49da9ad3eda905534de6188e4040c857b9393d225ef1ce93d8ad477ba15b4714"}, - {file = "time_machine-2.11.0-cp39-cp39-win32.whl", hash = "sha256:defaed86af4fc06cee02a5e4ef7ae26ec17131f5e43d7820c559c95f28173710"}, - {file = "time_machine-2.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:c518ea79f443f93f7e164b1ed8763c49685759b38b94bd436386cc216bf52103"}, - {file = "time_machine-2.11.0-cp39-cp39-win_arm64.whl", hash = "sha256:a80ae2c92735b01bd1cac7fa433a13a499c23748adb2399acab2b3c6f50d3742"}, - {file = "time_machine-2.11.0.tar.gz", hash = "sha256:6c08a0f9ef8b53ca8b69c0be3f9ddb85a587a784fc239b74c35e6c47bf359515"}, + {file = "time-machine-2.14.1.tar.gz", hash = "sha256:57dc7efc1dde4331902d1bdefd34e8ee890a5c28533157e3b14a429c86b39533"}, + {file = "time_machine-2.14.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:528d588d1e8ba83e45319a74acab4be0569eb141113fdf50368045d0a7d79cee"}, + {file = "time_machine-2.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06e913d570d7ee3e199e3316f10f10c8046287049141b0a101197712b4eac106"}, + {file = "time_machine-2.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ddbbba954e9a409e7d66d60df2b6b8daeb897f8338f909a92d9d20e431ec70d1"}, + {file = "time_machine-2.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72a153b085b4aee652d6b3bf9019ca897f1597ba9869b640b06f28736b267182"}, + {file = "time_machine-2.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b94274abe24b6a90d8a5c042167a9a7af2d3438b42ac8eb5ede50fbc73c08db"}, + {file = "time_machine-2.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:364353858708628655bf9fa4c2825febd679c729d9e1dd424ff86845828bac05"}, + {file = "time_machine-2.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b951b6f4b8a752ab8c441df422e21954a721a0a5276aa3814ce8cf7205aeb6da"}, + {file = "time_machine-2.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:be215eb63d74a3d580f7924bb4209c783fabcfb3253073f4dcb3424d57d0f518"}, + {file = "time_machine-2.14.1-cp310-cp310-win32.whl", hash = "sha256:0e120f95c17bf8e0c097fd8863a8eb24054f9b17d9b17c465694be50f8348a3a"}, + {file = "time_machine-2.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:fb467d6c9e9ab615c8cf22d751d34296dacf801be323a57adeb4ff345cf72473"}, + {file = "time_machine-2.14.1-cp310-cp310-win_arm64.whl", hash = "sha256:19db257117739b2dda1d57e149bb715a593313899b3902a7e6d752c5f1d22542"}, + {file = "time_machine-2.14.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:442d42f1b0ef006f03a5a34905829a1d3ac569a5bcda64d29706e6dc60832f94"}, + {file = "time_machine-2.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0312b47f220e46f1bbfaded7fc1469882d9c2a27c6daf44e119aea7006b595cc"}, + {file = "time_machine-2.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a39dba3033d9c28347d2db16bcb16041bbf4e9032e2b70023686b6f95deac9d"}, + {file = "time_machine-2.14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e030d2051bb515251d7f6edd9bbcf79b2b47811e2c402aba9c126af713843d26"}, + {file = "time_machine-2.14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:993ab140eb5678d1ee7f1197f08e4499dc8ea883ad6b8858737de70d509ec5b5"}, + {file = "time_machine-2.14.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:90725f936ad8b123149bc82a46394dd7057e63157ee11ba878164053fa5bd8ad"}, + {file = "time_machine-2.14.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:59a02c3d3b3b29e2dc3a708e775c5d6b951b0024c4013fed883f0d2205305c9e"}, + {file = "time_machine-2.14.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4f00f67d532da82538c4dfbbddc587e70c82664f168c11e1c2915d0c85ec2fc8"}, + {file = "time_machine-2.14.1-cp311-cp311-win32.whl", hash = "sha256:27f735cba4c6352ad7bc53ce2d86b715379261a634e690b79fac329081e26fb6"}, + {file = "time_machine-2.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:ee68597bd3fa5ab94633c8a9d3ebd4032091559610e078381818a732910002bc"}, + {file = "time_machine-2.14.1-cp311-cp311-win_arm64.whl", hash = "sha256:6ced9de5eff1fb37efb12984ab7b63f31f0aeadeedec4be6d0404ec4fa91f2e7"}, + {file = "time_machine-2.14.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:30a4a18357fa6cf089eeefcb37e9549b42523aebb5933894770a8919e6c398e1"}, + {file = "time_machine-2.14.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d45bd60bea85869615b117667f10a821e3b0d3603c47bfd105b45d1f67156fc8"}, + {file = "time_machine-2.14.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:39de6d37a14ff8882d4f1cbd50c53268b54e1cf4ef9be2bfe590d10a51ccd314"}, + {file = "time_machine-2.14.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fd7d188b4f9d358c6bd477daf93b460d9b244a4c296ddd065945f2b6193c2bd"}, + {file = "time_machine-2.14.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99e6f013e67c4f74a9d8f57e34173b2047f2ad48f764e44c38f3ee5344a38c01"}, + {file = "time_machine-2.14.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a927d87501da8b053a27e80f5d0e1e58fbde4b50d70df2d3853ed67e89a731cf"}, + {file = "time_machine-2.14.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c77a616561dd4c7c442e9eee8cbb915750496e9a5a7fca6bcb11a9860226d2d0"}, + {file = "time_machine-2.14.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e7fa70a6bdca40cc4a8386fd85bc1bae0a23ab11e49604ef853ab3ce92be127f"}, + {file = "time_machine-2.14.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:d63ef00d389fa6d2c76c863af580b3e4a8f0ccc6a9aea8e64590588e37f13c00"}, + {file = "time_machine-2.14.1-cp312-cp312-win32.whl", hash = "sha256:6706eb06487354a5e219cacea709fb3ec44dec3842c6218237d5069fa5f1ad64"}, + {file = "time_machine-2.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:36aa4f17adcd73a6064bf4991a29126cac93521f0690805edb91db837c4e1453"}, + {file = "time_machine-2.14.1-cp312-cp312-win_arm64.whl", hash = "sha256:edea570f3835a036e8860bb8d6eb8d08473c59313db86e36e3b207f796fd7b14"}, + {file = "time_machine-2.14.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:87e80408e6b6670e9ce33f94b1cc6b72b1a9b646f5e19f586908129871f74b40"}, + {file = "time_machine-2.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c69c0cb498c86ef843cd15964714e76465cc25d64464da57d5d1318f499de099"}, + {file = "time_machine-2.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dc48d3934109b0bdbbdc5e9ce577213f7148a92fed378420ee13453503fe4db9"}, + {file = "time_machine-2.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7161cea2ff3244cc6075e365fab89000df70ead63a3da9d473983d580558d2de"}, + {file = "time_machine-2.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39fceeb131e6c07b386de042ce1016be771576e9516124b78e75cbab94ae5041"}, + {file = "time_machine-2.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:fe508a6c43fb72fa4f66b50b14684cf58d3db95fed617177ec197a7a90427bae"}, + {file = "time_machine-2.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5f3d5c21884aee10e13b00ef45fab893a43db9d59ec27271573528bd359b0ef5"}, + {file = "time_machine-2.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a75e24e59f58059bbbc50e7f97aa6d126bbc2f603a8a5cd1e884beffcf130d8f"}, + {file = "time_machine-2.14.1-cp38-cp38-win32.whl", hash = "sha256:b0f8ba70fbb71d7fbc6d6adb90bed72a83db15b3318c7af0060467539b2f1b63"}, + {file = "time_machine-2.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:15cf3623a4ba2bb4fce4529295570acd5f6c6b44bcbfd1b8d0756ce56c38fe82"}, + {file = "time_machine-2.14.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bb3a2518c52aa944989b541e5297b833388eb3fe72d91eb875b21fe771597b04"}, + {file = "time_machine-2.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:416d94eab7723c7d8a37fe6b3b1882046fdbf3c31b9abec3cac87cf35dbb8230"}, + {file = "time_machine-2.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:adfbfa796dd96383400b44681eacc5ab06d3cbfad39c30878e5ead0bfdca808a"}, + {file = "time_machine-2.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:31e6e9bff89b7c6e4cbc169ba1d00d6c107b3abc43173b2799352b6995cf7cb2"}, + {file = "time_machine-2.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:107caed387438d689180b692e8d84aa1ebe8918790df83dc5e2146e60e5e0859"}, + {file = "time_machine-2.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:cab4abf4d1490a7da35db5a321ff8a4d4a2195f4832a792c75b626ffc4a5584c"}, + {file = "time_machine-2.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fd8645b820f7895fdafbc4412d1ce376956e36ad4fd05a43269aa06c3132afc3"}, + {file = "time_machine-2.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:dd26039a9ffea2d5ee1309f2ec9b656d4925371c65563822d52e4037a4186eca"}, + {file = "time_machine-2.14.1-cp39-cp39-win32.whl", hash = "sha256:5e19b19d20bfbff8c97949e06e150998cf9d0a676e1641fb90597e59a9d7d5e2"}, + {file = "time_machine-2.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:f5d371a5218318121a6b44c21438258b6408b8bfe7ccccb754cf8eb880505576"}, + {file = "time_machine-2.14.1-cp39-cp39-win_arm64.whl", hash = "sha256:2c774f4b603a36ca2611327c57aa8ce0d5042298da008238ee5234b31ce7b22c"}, ] [package.dependencies] @@ -8715,24 +8861,24 @@ files = [ [[package]] name = "tomlkit" -version = "0.11.8" +version = "0.12.4" description = "Style preserving TOML library" optional = false python-versions = ">=3.7" files = [ - {file = "tomlkit-0.11.8-py3-none-any.whl", hash = "sha256:8c726c4c202bdb148667835f68d68780b9a003a9ec34167b6c673b38eff2a171"}, - {file = "tomlkit-0.11.8.tar.gz", hash = "sha256:9330fc7faa1db67b541b28e62018c17d20be733177d290a13b24c62d1614e0c3"}, + {file = "tomlkit-0.12.4-py3-none-any.whl", hash = "sha256:5cd82d48a3dd89dee1f9d64420aa20ae65cfbd00668d6f094d7578a78efbb77b"}, + {file = "tomlkit-0.12.4.tar.gz", hash = "sha256:7ca1cfc12232806517a8515047ba66a19369e71edf2439d0f5824f91032b6cc3"}, ] [[package]] name = "toolz" -version = "0.12.0" +version = "0.12.1" description = "List processing tools and functional utilities" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" files = [ - {file = "toolz-0.12.0-py3-none-any.whl", hash = "sha256:2059bd4148deb1884bb0eb770a3cde70e7f954cfbbdc2285f1f2de01fd21eb6f"}, - {file = "toolz-0.12.0.tar.gz", hash = "sha256:88c570861c440ee3f2f6037c4654613228ff40c93a6c25e0eba70d17282c6194"}, + {file = "toolz-0.12.1-py3-none-any.whl", hash = "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85"}, + {file = "toolz-0.12.1.tar.gz", hash = "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d"}, ] [[package]] @@ -8768,84 +8914,73 @@ typing-extensions = "*" [[package]] name = "torchmetrics" -version = "1.0.1" +version = "1.3.2" description = "PyTorch native Metrics" optional = true python-versions = ">=3.8" files = [ - {file = "torchmetrics-1.0.1-py3-none-any.whl", hash = "sha256:5278ebdf4ecc168d88d87d3f02045ceee6a4a4ae24d8bf09d616ab67441dde0a"}, + {file = "torchmetrics-1.3.2-py3-none-any.whl", hash = "sha256:44ca3a9f86dc050cb3f554836ef291698ea797778457195b4f685fce8e2e64a3"}, + {file = "torchmetrics-1.3.2.tar.gz", hash = "sha256:0a67694a4c4265eeb54cda741eaf5cb1f3a71da74b7e7e6215ad156c9f2379f6"}, ] [package.dependencies] -lightning-utilities = ">=0.7.0" +lightning-utilities = ">=0.8.0" numpy = ">1.20.0" -packaging = "*" -torch = ">=1.8.1" +packaging = ">17.1" +torch = ">=1.10.0" typing-extensions = {version = "*", markers = "python_version < \"3.9\""} [package.extras] -all = ["SciencePlots (>=2.0.0)", "lpips (<=0.1.4)", "matplotlib (>=3.2.0)", "mypy (==1.4.1)", "nltk (>=3.6)", "pycocotools (>2.0.0)", "pystoi (>=0.3.0)", "regex (>=2021.9.24)", "scipy (>1.0.0)", "torch-fidelity (<=0.3.0)", "torchaudio (>=0.10.0)", "torchvision (>=0.8)", "tqdm (>=4.41.0)", "transformers (>=4.10.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +all = ["SciencePlots (>=2.0.0)", "ipadic (>=1.0.0)", "matplotlib (>=3.3.0)", "mecab-ko (>=1.0.0)", "mecab-ko-dic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "mypy (==1.8.0)", "nltk (>=3.6)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.3.0)", "regex (>=2021.9.24)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "torch (==2.2.1)", "torch-fidelity (<=0.4.0)", "torchaudio (>=0.10.0)", "torchvision (>=0.8)", "tqdm (>=4.41.0)", "transformers (>4.4.0)", "transformers (>=4.10.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] audio = ["pystoi (>=0.3.0)", "torchaudio (>=0.10.0)"] detection = ["pycocotools (>2.0.0)", "torchvision (>=0.8)"] -dev = ["SciencePlots (>=2.0.0)", "bert-score (==0.3.13)", "cloudpickle (>1.3)", "coverage (==7.2.7)", "dython (<=0.7.4)", "fairlearn", "fast-bss-eval (>=0.1.0)", "fire (<=0.5.0)", "huggingface-hub (<0.16)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "lpips (<=0.1.4)", "matplotlib (>=3.2.0)", "mir-eval (>=0.6)", "mypy (==1.4.1)", "netcal (>1.0.0)", "nltk (>=3.6)", "numpy (<1.25.0)", "pandas (>1.0.0)", "pandas (>=1.4.0)", "phmdoctest (==1.4.0)", "psutil (<=5.9.5)", "pycocotools (>2.0.0)", "pystoi (>=0.3.0)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-doctestplus (==0.13.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "requests (<=2.31.0)", "rouge-score (>0.1.0)", "sacrebleu (>=2.0.0)", "scikit-image (>=0.19.0)", "scikit-learn (>=1.1.1)", "scipy (>1.0.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "torch-complex (<=0.4.3)", "torch-fidelity (<=0.3.0)", "torchaudio (>=0.10.0)", "torchvision (>=0.8)", "tqdm (>=4.41.0)", "transformers (>4.4.0)", "transformers (>=4.10.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] -image = ["lpips (<=0.1.4)", "scipy (>1.0.0)", "torch-fidelity (<=0.3.0)", "torchvision (>=0.8)"] -multimodal = ["transformers (>=4.10.0)"] -test = ["bert-score (==0.3.13)", "cloudpickle (>1.3)", "coverage (==7.2.7)", "dython (<=0.7.4)", "fairlearn", "fast-bss-eval (>=0.1.0)", "fire (<=0.5.0)", "huggingface-hub (<0.16)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "mir-eval (>=0.6)", "netcal (>1.0.0)", "numpy (<1.25.0)", "pandas (>1.0.0)", "pandas (>=1.4.0)", "phmdoctest (==1.4.0)", "psutil (<=5.9.5)", "pytest (==7.4.0)", "pytest-cov (==4.1.0)", "pytest-doctestplus (==0.13.0)", "pytest-rerunfailures (==12.0)", "pytest-timeout (==2.1.0)", "pytorch-msssim (==1.0.0)", "requests (<=2.31.0)", "rouge-score (>0.1.0)", "sacrebleu (>=2.0.0)", "scikit-image (>=0.19.0)", "scikit-learn (>=1.1.1)", "scipy (>1.0.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "torch-complex (<=0.4.3)", "transformers (>4.4.0)"] -text = ["nltk (>=3.6)", "regex (>=2021.9.24)", "tqdm (>=4.41.0)"] -typing = ["mypy (==1.4.1)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] -visual = ["SciencePlots (>=2.0.0)", "matplotlib (>=3.2.0)"] +dev = ["SciencePlots (>=2.0.0)", "bert-score (==0.3.13)", "dython (<=0.7.5)", "fairlearn", "fast-bss-eval (>=0.1.0)", "faster-coco-eval (>=1.3.3)", "huggingface-hub (<0.22)", "ipadic (>=1.0.0)", "jiwer (>=2.3.0)", "kornia (>=0.6.7)", "lpips (<=0.1.4)", "matplotlib (>=3.3.0)", "mecab-ko (>=1.0.0)", "mecab-ko-dic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "mir-eval (>=0.6)", "monai (==1.3.0)", "mypy (==1.8.0)", "netcal (>1.0.0)", "nltk (>=3.6)", "numpy (<1.25.0)", "pandas (>1.0.0)", "pandas (>=1.4.0)", "piq (<=0.8.0)", "pycocotools (>2.0.0)", "pystoi (>=0.3.0)", "pytorch-msssim (==1.0.0)", "regex (>=2021.9.24)", "rouge-score (>0.1.0)", "sacrebleu (>=2.3.0)", "scikit-image (>=0.19.0)", "scipy (>1.0.0)", "sentencepiece (>=0.2.0)", "sewar (>=0.4.4)", "statsmodels (>0.13.5)", "torch (==2.2.1)", "torch-complex (<=0.4.3)", "torch-fidelity (<=0.4.0)", "torchaudio (>=0.10.0)", "torchvision (>=0.8)", "tqdm (>=4.41.0)", "transformers (>4.4.0)", "transformers (>=4.10.0)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +image = ["scipy (>1.0.0)", "torch-fidelity (<=0.4.0)", "torchvision (>=0.8)"] +multimodal = ["piq (<=0.8.0)", "transformers (>=4.10.0)"] +text = ["ipadic (>=1.0.0)", "mecab-ko (>=1.0.0)", "mecab-ko-dic (>=1.0.0)", "mecab-python3 (>=1.0.6)", "nltk (>=3.6)", "regex (>=2021.9.24)", "sentencepiece (>=0.2.0)", "tqdm (>=4.41.0)", "transformers (>4.4.0)"] +typing = ["mypy (==1.8.0)", "torch (==2.2.1)", "types-PyYAML", "types-emoji", "types-protobuf", "types-requests", "types-setuptools", "types-six", "types-tabulate"] +visual = ["SciencePlots (>=2.0.0)", "matplotlib (>=3.3.0)"] [[package]] name = "tornado" -version = "6.3.2" +version = "6.4" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false python-versions = ">= 3.8" files = [ - {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:c367ab6c0393d71171123ca5515c61ff62fe09024fa6bf299cd1339dc9456829"}, - {file = "tornado-6.3.2-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b46a6ab20f5c7c1cb949c72c1994a4585d2eaa0be4853f50a03b5031e964fc7c"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c2de14066c4a38b4ecbbcd55c5cc4b5340eb04f1c5e81da7451ef555859c833f"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05615096845cf50a895026f749195bf0b10b8909f9be672f50b0fe69cba368e4"}, - {file = "tornado-6.3.2-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b17b1cf5f8354efa3d37c6e28fdfd9c1c1e5122f2cb56dac121ac61baa47cbe"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:29e71c847a35f6e10ca3b5c2990a52ce38b233019d8e858b755ea6ce4dcdd19d"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:834ae7540ad3a83199a8da8f9f2d383e3c3d5130a328889e4cc991acc81e87a0"}, - {file = "tornado-6.3.2-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:6a0848f1aea0d196a7c4f6772197cbe2abc4266f836b0aac76947872cd29b411"}, - {file = "tornado-6.3.2-cp38-abi3-win32.whl", hash = "sha256:7efcbcc30b7c654eb6a8c9c9da787a851c18f8ccd4a5a3a95b05c7accfa068d2"}, - {file = "tornado-6.3.2-cp38-abi3-win_amd64.whl", hash = "sha256:0c325e66c8123c606eea33084976c832aa4e766b7dff8aedd7587ea44a604cdf"}, - {file = "tornado-6.3.2.tar.gz", hash = "sha256:4b927c4f19b71e627b13f3db2324e4ae660527143f9e1f2e2fb404f3a187e2ba"}, + {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, + {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, + {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, + {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, + {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, ] [[package]] name = "tqdm" -version = "4.65.0" +version = "4.66.2" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.65.0-py3-none-any.whl", hash = "sha256:c4f53a17fe37e132815abceec022631be8ffe1b9381c2e6e30aa70edc99e9671"}, - {file = "tqdm-4.65.0.tar.gz", hash = "sha256:1871fb68a86b8fb3b59ca4cdd3dcccbc7e6d613eeed31f4c332531977b89beb5"}, + {file = "tqdm-4.66.2-py3-none-any.whl", hash = "sha256:1ee4f8a893eb9bef51c6e35730cebf234d5d0b6bd112b0271e10ed7c24a02bd9"}, + {file = "tqdm-4.66.2.tar.gz", hash = "sha256:6cd52cdf0fef0e0f543299cfc96fec90d7b8a7e88745f411ec33eb44d5ed3531"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["py-make (>=0.1.0)", "twine", "wheel"] +dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] telegram = ["requests"] -[[package]] -name = "trace-updater" -version = "0.0.9.1" -description = "Dash component which allows to update a dcc.Graph its traces. This component is data efficient as it (1) only sends the to-be-updated traces (and not the whole) from the back-end to the client-side and (2) only updates the traces that have changed (and does not redraw the whole figure)." -optional = true -python-versions = "*" -files = [ - {file = "trace_updater-0.0.9.1-py3-none-any.whl", hash = "sha256:14e34b6d037e59a0f28d40e811833f892e788e075bc7cfeabda474d90e754e72"}, - {file = "trace_updater-0.0.9.1.tar.gz", hash = "sha256:04960a062addf58131da39df9f5755a1d8f5fff9b5fbabd0839801e2431d9a20"}, -] - [[package]] name = "tradingview-ta" version = "3.3.0" @@ -8862,18 +8997,18 @@ requests = "*" [[package]] name = "traitlets" -version = "5.9.0" +version = "5.14.3" description = "Traitlets Python configuration system" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "traitlets-5.9.0-py3-none-any.whl", hash = "sha256:9e6ec080259b9a5940c797d58b613b5e31441c2257b87c2e795c5228ae80d2d8"}, - {file = "traitlets-5.9.0.tar.gz", hash = "sha256:f6cde21a9c68cf756af02035f72d5a723bf607e862e7be33ece505abf4a3bad9"}, + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, ] [package.extras] docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] -test = ["argcomplete (>=2.0)", "pre-commit", "pytest", "pytest-mock"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "transformers" @@ -8944,54 +9079,35 @@ vision = ["Pillow"] [[package]] name = "triad" -version = "0.9.1" +version = "0.9.6" description = "A collection of python utils for Fugue projects" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "triad-0.9.1-py3-none-any.whl", hash = "sha256:29084e7e17bfb12c00ca4812af2c9d5876462c1fda326293a12eb0f638829dea"}, - {file = "triad-0.9.1.tar.gz", hash = "sha256:afc3fd9f225247974fd1170f97448d8111ef011d2d8cb17a3503c3fc795cf594"}, + {file = "triad-0.9.6-py3-none-any.whl", hash = "sha256:5c7391f2e5e14a705d75fe3794bf13640f44522f381b542c2c553f99f012da03"}, + {file = "triad-0.9.6.tar.gz", hash = "sha256:4a54f3ccb23b47eb7df940ab1aac209c0e056417a086029f4d2adb38502ac451"}, ] [package.dependencies] fs = "*" -fsspec = "*" +fsspec = ">=2022.5.0" numpy = "*" -pandas = ">=1.2.0" -pyarrow = "*" +pandas = ">=1.3.5" +pyarrow = ">=6.0.1" six = "*" [package.extras] ciso8601 = ["ciso8601"] -[[package]] -name = "typeguard" -version = "3.0.2" -description = "Run-time type checker for Python" -optional = true -python-versions = ">=3.7.4" -files = [ - {file = "typeguard-3.0.2-py3-none-any.whl", hash = "sha256:bbe993854385284ab42fd5bd3bee6f6556577ce8b50696d6cb956d704f286c8e"}, - {file = "typeguard-3.0.2.tar.gz", hash = "sha256:fee5297fdb28f8e9efcb8142b5ee219e02375509cd77ea9d270b5af826358d5a"}, -] - -[package.dependencies] -importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} -typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.11\""} - -[package.extras] -doc = ["packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] -test = ["mypy (>=0.991)", "pytest (>=7)"] - [[package]] name = "types-python-dateutil" -version = "2.8.19.14" +version = "2.9.0.20240316" description = "Typing stubs for python-dateutil" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "types-python-dateutil-2.8.19.14.tar.gz", hash = "sha256:1f4f10ac98bb8b16ade9dbee3518d9ace017821d94b057a425b069f834737f4b"}, - {file = "types_python_dateutil-2.8.19.14-py3-none-any.whl", hash = "sha256:f977b8de27787639986b4e28963263fd0e5158942b3ecef91b9335c130cb1ce9"}, + {file = "types-python-dateutil-2.9.0.20240316.tar.gz", hash = "sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202"}, + {file = "types_python_dateutil-2.9.0.20240316-py3-none-any.whl", hash = "sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b"}, ] [[package]] @@ -9007,28 +9123,28 @@ files = [ [[package]] name = "types-pyyaml" -version = "6.0.12.11" +version = "6.0.12.20240311" description = "Typing stubs for PyYAML" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "types-PyYAML-6.0.12.11.tar.gz", hash = "sha256:7d340b19ca28cddfdba438ee638cd4084bde213e501a3978738543e27094775b"}, - {file = "types_PyYAML-6.0.12.11-py3-none-any.whl", hash = "sha256:a461508f3096d1d5810ec5ab95d7eeecb651f3a15b71959999988942063bf01d"}, + {file = "types-PyYAML-6.0.12.20240311.tar.gz", hash = "sha256:a9e0f0f88dc835739b0c1ca51ee90d04ca2a897a71af79de9aec5f38cb0a5342"}, + {file = "types_PyYAML-6.0.12.20240311-py3-none-any.whl", hash = "sha256:b845b06a1c7e54b8e5b4c683043de0d9caf205e7434b3edc678ff2411979b8f6"}, ] [[package]] name = "types-requests" -version = "2.31.0.2" +version = "2.31.0.20240406" description = "Typing stubs for requests" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "types-requests-2.31.0.2.tar.gz", hash = "sha256:6aa3f7faf0ea52d728bb18c0a0d1522d9bfd8c72d26ff6f61bfc3d06a411cf40"}, - {file = "types_requests-2.31.0.2-py3-none-any.whl", hash = "sha256:56d181c85b5925cbc59f4489a57e72a8b2166f18273fd8ba7b6fe0c0b986f12a"}, + {file = "types-requests-2.31.0.20240406.tar.gz", hash = "sha256:4428df33c5503945c74b3f42e82b181e86ec7b724620419a2966e2de604ce1a1"}, + {file = "types_requests-2.31.0.20240406-py3-none-any.whl", hash = "sha256:6216cdac377c6b9a040ac1c0404f7284bd13199c0e1bb235f4324627e8898cf5"}, ] [package.dependencies] -types-urllib3 = "*" +urllib3 = ">=2" [[package]] name = "types-setuptools" @@ -9043,66 +9159,54 @@ files = [ [[package]] name = "types-six" -version = "1.16.21.9" +version = "1.16.21.20240311" description = "Typing stubs for six" optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "types-six-1.16.21.9.tar.gz", hash = "sha256:746e6c25b8c48b3c8ab9efe7f68022839111de423d35ba4b206b88b12d75f233"}, - {file = "types_six-1.16.21.9-py3-none-any.whl", hash = "sha256:1591a09430a3035326da5fdb71692d0b3cc36b25a440cc5929ca6241f3984705"}, -] - -[[package]] -name = "types-urllib3" -version = "1.26.25.14" -description = "Typing stubs for urllib3" -optional = false -python-versions = "*" -files = [ - {file = "types-urllib3-1.26.25.14.tar.gz", hash = "sha256:229b7f577c951b8c1b92c1bc2b2fdb0b49847bd2af6d1cc2a2e3dd340f3bda8f"}, - {file = "types_urllib3-1.26.25.14-py3-none-any.whl", hash = "sha256:9683bbb7fb72e32bfe9d2be6e04875fbe1b3eeec3cbb4ea231435aa7fd6b4f0e"}, + {file = "types-six-1.16.21.20240311.tar.gz", hash = "sha256:b5a117193ba0dc7a66507925e95e140b2af52731402cdd71ef9f2a4348e01f60"}, + {file = "types_six-1.16.21.20240311-py3-none-any.whl", hash = "sha256:abc0377990d38e9b37b3333dd115ec960ca9788d78f3d9c7eb3f778cfc6c925c"}, ] [[package]] name = "typing-extensions" -version = "4.7.1" -description = "Backported and Experimental Type Hints for Python 3.7+" +version = "4.11.0" +description = "Backported and Experimental Type Hints for Python 3.8+" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36"}, - {file = "typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2"}, + {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, + {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, ] [[package]] name = "tzdata" -version = "2023.3" +version = "2024.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" files = [ - {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, - {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, + {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, + {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, ] [[package]] name = "tzlocal" -version = "4.3.1" +version = "5.2" description = "tzinfo object for the local timezone" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "tzlocal-4.3.1-py3-none-any.whl", hash = "sha256:67d7e7f4ce0a98e9dfde2e02474c60fe846ed032d78b555c554c2e9cba472d84"}, - {file = "tzlocal-4.3.1.tar.gz", hash = "sha256:ee32ef8c20803c19a96ed366addd3d4a729ef6309cb5c7359a0cc2eeeb7fa46a"}, + {file = "tzlocal-5.2-py3-none-any.whl", hash = "sha256:49816ef2fe65ea8ac19d19aa7a1ae0551c834303d5014c6d5a62e4cbda8047b8"}, + {file = "tzlocal-5.2.tar.gz", hash = "sha256:8d399205578f1a9342816409cc1e46a93ebd5755e39ea2d85334bea911bf0e6e"}, ] [package.dependencies] "backports.zoneinfo" = {version = "*", markers = "python_version < \"3.9\""} -pytz-deprecation-shim = "*" tzdata = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -devenv = ["black", "check-manifest", "flake8", "pyroma", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] +devenv = ["check-manifest", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] [[package]] name = "u8darts" @@ -9146,72 +9250,76 @@ torch = ["pytorch-lightning (>=1.5.0)", "torch (>=1.8.0)"] [[package]] name = "ujson" -version = "5.8.0" +version = "5.9.0" description = "Ultra fast JSON encoder and decoder for Python" optional = false python-versions = ">=3.8" files = [ - {file = "ujson-5.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f4511560d75b15ecb367eef561554959b9d49b6ec3b8d5634212f9fed74a6df1"}, - {file = "ujson-5.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9399eaa5d1931a0ead49dce3ffacbea63f3177978588b956036bfe53cdf6af75"}, - {file = "ujson-5.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4e7bb7eba0e1963f8b768f9c458ecb193e5bf6977090182e2b4f4408f35ac76"}, - {file = "ujson-5.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40931d7c08c4ce99adc4b409ddb1bbb01635a950e81239c2382cfe24251b127a"}, - {file = "ujson-5.8.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d53039d39de65360e924b511c7ca1a67b0975c34c015dd468fca492b11caa8f7"}, - {file = "ujson-5.8.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:bdf04c6af3852161be9613e458a1fb67327910391de8ffedb8332e60800147a2"}, - {file = "ujson-5.8.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a70f776bda2e5072a086c02792c7863ba5833d565189e09fabbd04c8b4c3abba"}, - {file = "ujson-5.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f26629ac531d712f93192c233a74888bc8b8212558bd7d04c349125f10199fcf"}, - {file = "ujson-5.8.0-cp310-cp310-win32.whl", hash = "sha256:7ecc33b107ae88405aebdb8d82c13d6944be2331ebb04399134c03171509371a"}, - {file = "ujson-5.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:3b27a8da7a080add559a3b73ec9ebd52e82cc4419f7c6fb7266e62439a055ed0"}, - {file = "ujson-5.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:193349a998cd821483a25f5df30b44e8f495423840ee11b3b28df092ddfd0f7f"}, - {file = "ujson-5.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ddeabbc78b2aed531f167d1e70387b151900bc856d61e9325fcdfefb2a51ad8"}, - {file = "ujson-5.8.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ce24909a9c25062e60653073dd6d5e6ec9d6ad7ed6e0069450d5b673c854405"}, - {file = "ujson-5.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:27a2a3c7620ebe43641e926a1062bc04e92dbe90d3501687957d71b4bdddaec4"}, - {file = "ujson-5.8.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b852bdf920fe9f84e2a2c210cc45f1b64f763b4f7d01468b33f7791698e455e"}, - {file = "ujson-5.8.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:20768961a6a706170497129960762ded9c89fb1c10db2989c56956b162e2a8a3"}, - {file = "ujson-5.8.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e0147d41e9fb5cd174207c4a2895c5e24813204499fd0839951d4c8784a23bf5"}, - {file = "ujson-5.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e3673053b036fd161ae7a5a33358ccae6793ee89fd499000204676baafd7b3aa"}, - {file = "ujson-5.8.0-cp311-cp311-win32.whl", hash = "sha256:a89cf3cd8bf33a37600431b7024a7ccf499db25f9f0b332947fbc79043aad879"}, - {file = "ujson-5.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:3659deec9ab9eb19e8646932bfe6fe22730757c4addbe9d7d5544e879dc1b721"}, - {file = "ujson-5.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:102bf31c56f59538cccdfec45649780ae00657e86247c07edac434cb14d5388c"}, - {file = "ujson-5.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:299a312c3e85edee1178cb6453645217ba23b4e3186412677fa48e9a7f986de6"}, - {file = "ujson-5.8.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2e385a7679b9088d7bc43a64811a7713cc7c33d032d020f757c54e7d41931ae"}, - {file = "ujson-5.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad24ec130855d4430a682c7a60ca0bc158f8253ec81feed4073801f6b6cb681b"}, - {file = "ujson-5.8.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16fde596d5e45bdf0d7de615346a102510ac8c405098e5595625015b0d4b5296"}, - {file = "ujson-5.8.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:6d230d870d1ce03df915e694dcfa3f4e8714369cce2346686dbe0bc8e3f135e7"}, - {file = "ujson-5.8.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9571de0c53db5cbc265945e08f093f093af2c5a11e14772c72d8e37fceeedd08"}, - {file = "ujson-5.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:7cba16b26efe774c096a5e822e4f27097b7c81ed6fb5264a2b3f5fd8784bab30"}, - {file = "ujson-5.8.0-cp312-cp312-win32.whl", hash = "sha256:48c7d373ff22366eecfa36a52b9b55b0ee5bd44c2b50e16084aa88b9de038916"}, - {file = "ujson-5.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:5ac97b1e182d81cf395ded620528c59f4177eee024b4b39a50cdd7b720fdeec6"}, - {file = "ujson-5.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2a64cc32bb4a436e5813b83f5aab0889927e5ea1788bf99b930fad853c5625cb"}, - {file = "ujson-5.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e54578fa8838ddc722539a752adfce9372474114f8c127bb316db5392d942f8b"}, - {file = "ujson-5.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9721cd112b5e4687cb4ade12a7b8af8b048d4991227ae8066d9c4b3a6642a582"}, - {file = "ujson-5.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d9707e5aacf63fb919f6237d6490c4e0244c7f8d3dc2a0f84d7dec5db7cb54c"}, - {file = "ujson-5.8.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0be81bae295f65a6896b0c9030b55a106fb2dec69ef877253a87bc7c9c5308f7"}, - {file = "ujson-5.8.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ae7f4725c344bf437e9b881019c558416fe84ad9c6b67426416c131ad577df67"}, - {file = "ujson-5.8.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9ab282d67ef3097105552bf151438b551cc4bedb3f24d80fada830f2e132aeb9"}, - {file = "ujson-5.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:94c7bd9880fa33fcf7f6d7f4cc032e2371adee3c5dba2922b918987141d1bf07"}, - {file = "ujson-5.8.0-cp38-cp38-win32.whl", hash = "sha256:bf5737dbcfe0fa0ac8fa599eceafae86b376492c8f1e4b84e3adf765f03fb564"}, - {file = "ujson-5.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:11da6bed916f9bfacf13f4fc6a9594abd62b2bb115acfb17a77b0f03bee4cfd5"}, - {file = "ujson-5.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:69b3104a2603bab510497ceabc186ba40fef38ec731c0ccaa662e01ff94a985c"}, - {file = "ujson-5.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9249fdefeb021e00b46025e77feed89cd91ffe9b3a49415239103fc1d5d9c29a"}, - {file = "ujson-5.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2873d196725a8193f56dde527b322c4bc79ed97cd60f1d087826ac3290cf9207"}, - {file = "ujson-5.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a4dafa9010c366589f55afb0fd67084acd8added1a51251008f9ff2c3e44042"}, - {file = "ujson-5.8.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a42baa647a50fa8bed53d4e242be61023bd37b93577f27f90ffe521ac9dc7a3"}, - {file = "ujson-5.8.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f3554eaadffe416c6f543af442066afa6549edbc34fe6a7719818c3e72ebfe95"}, - {file = "ujson-5.8.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:fb87decf38cc82bcdea1d7511e73629e651bdec3a43ab40985167ab8449b769c"}, - {file = "ujson-5.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:407d60eb942c318482bbfb1e66be093308bb11617d41c613e33b4ce5be789adc"}, - {file = "ujson-5.8.0-cp39-cp39-win32.whl", hash = "sha256:0fe1b7edaf560ca6ab023f81cbeaf9946a240876a993b8c5a21a1c539171d903"}, - {file = "ujson-5.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:3f9b63530a5392eb687baff3989d0fb5f45194ae5b1ca8276282fb647f8dcdb3"}, - {file = "ujson-5.8.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:efeddf950fb15a832376c0c01d8d7713479fbeceaed1eaecb2665aa62c305aec"}, - {file = "ujson-5.8.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7d8283ac5d03e65f488530c43d6610134309085b71db4f675e9cf5dff96a8282"}, - {file = "ujson-5.8.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb0142f6f10f57598655340a3b2c70ed4646cbe674191da195eb0985a9813b83"}, - {file = "ujson-5.8.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07d459aca895eb17eb463b00441986b021b9312c6c8cc1d06880925c7f51009c"}, - {file = "ujson-5.8.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:d524a8c15cfc863705991d70bbec998456a42c405c291d0f84a74ad7f35c5109"}, - {file = "ujson-5.8.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d6f84a7a175c75beecde53a624881ff618e9433045a69fcfb5e154b73cdaa377"}, - {file = "ujson-5.8.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b748797131ac7b29826d1524db1cc366d2722ab7afacc2ce1287cdafccddbf1f"}, - {file = "ujson-5.8.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e72ba76313d48a1a3a42e7dc9d1db32ea93fac782ad8dde6f8b13e35c229130"}, - {file = "ujson-5.8.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f504117a39cb98abba4153bf0b46b4954cc5d62f6351a14660201500ba31fe7f"}, - {file = "ujson-5.8.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8c91b6f4bf23f274af9002b128d133b735141e867109487d17e344d38b87d94"}, - {file = "ujson-5.8.0.tar.gz", hash = "sha256:78e318def4ade898a461b3d92a79f9441e7e0e4d2ad5419abed4336d702c7425"}, + {file = "ujson-5.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ab71bf27b002eaf7d047c54a68e60230fbd5cd9da60de7ca0aa87d0bccead8fa"}, + {file = "ujson-5.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7a365eac66f5aa7a7fdf57e5066ada6226700884fc7dce2ba5483538bc16c8c5"}, + {file = "ujson-5.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e015122b337858dba5a3dc3533af2a8fc0410ee9e2374092f6a5b88b182e9fcc"}, + {file = "ujson-5.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:779a2a88c53039bebfbccca934430dabb5c62cc179e09a9c27a322023f363e0d"}, + {file = "ujson-5.9.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10ca3c41e80509fd9805f7c149068fa8dbee18872bbdc03d7cca928926a358d5"}, + {file = "ujson-5.9.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4a566e465cb2fcfdf040c2447b7dd9718799d0d90134b37a20dff1e27c0e9096"}, + {file = "ujson-5.9.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f833c529e922577226a05bc25b6a8b3eb6c4fb155b72dd88d33de99d53113124"}, + {file = "ujson-5.9.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b68a0caab33f359b4cbbc10065c88e3758c9f73a11a65a91f024b2e7a1257106"}, + {file = "ujson-5.9.0-cp310-cp310-win32.whl", hash = "sha256:7cc7e605d2aa6ae6b7321c3ae250d2e050f06082e71ab1a4200b4ae64d25863c"}, + {file = "ujson-5.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:a6d3f10eb8ccba4316a6b5465b705ed70a06011c6f82418b59278fbc919bef6f"}, + {file = "ujson-5.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b23bbb46334ce51ddb5dded60c662fbf7bb74a37b8f87221c5b0fec1ec6454b"}, + {file = "ujson-5.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6974b3a7c17bbf829e6c3bfdc5823c67922e44ff169851a755eab79a3dd31ec0"}, + {file = "ujson-5.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5964ea916edfe24af1f4cc68488448fbb1ec27a3ddcddc2b236da575c12c8ae"}, + {file = "ujson-5.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8ba7cac47dd65ff88571eceeff48bf30ed5eb9c67b34b88cb22869b7aa19600d"}, + {file = "ujson-5.9.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bbd91a151a8f3358c29355a491e915eb203f607267a25e6ab10531b3b157c5e"}, + {file = "ujson-5.9.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:829a69d451a49c0de14a9fecb2a2d544a9b2c884c2b542adb243b683a6f15908"}, + {file = "ujson-5.9.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:a807ae73c46ad5db161a7e883eec0fbe1bebc6a54890152ccc63072c4884823b"}, + {file = "ujson-5.9.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:8fc2aa18b13d97b3c8ccecdf1a3c405f411a6e96adeee94233058c44ff92617d"}, + {file = "ujson-5.9.0-cp311-cp311-win32.whl", hash = "sha256:70e06849dfeb2548be48fdd3ceb53300640bc8100c379d6e19d78045e9c26120"}, + {file = "ujson-5.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:7309d063cd392811acc49b5016728a5e1b46ab9907d321ebbe1c2156bc3c0b99"}, + {file = "ujson-5.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:20509a8c9f775b3a511e308bbe0b72897ba6b800767a7c90c5cca59d20d7c42c"}, + {file = "ujson-5.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b28407cfe315bd1b34f1ebe65d3bd735d6b36d409b334100be8cdffae2177b2f"}, + {file = "ujson-5.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d302bd17989b6bd90d49bade66943c78f9e3670407dbc53ebcf61271cadc399"}, + {file = "ujson-5.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f21315f51e0db8ee245e33a649dd2d9dce0594522de6f278d62f15f998e050e"}, + {file = "ujson-5.9.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5635b78b636a54a86fdbf6f027e461aa6c6b948363bdf8d4fbb56a42b7388320"}, + {file = "ujson-5.9.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:82b5a56609f1235d72835ee109163c7041b30920d70fe7dac9176c64df87c164"}, + {file = "ujson-5.9.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:5ca35f484622fd208f55041b042d9d94f3b2c9c5add4e9af5ee9946d2d30db01"}, + {file = "ujson-5.9.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:829b824953ebad76d46e4ae709e940bb229e8999e40881338b3cc94c771b876c"}, + {file = "ujson-5.9.0-cp312-cp312-win32.whl", hash = "sha256:25fa46e4ff0a2deecbcf7100af3a5d70090b461906f2299506485ff31d9ec437"}, + {file = "ujson-5.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:60718f1720a61560618eff3b56fd517d107518d3c0160ca7a5a66ac949c6cf1c"}, + {file = "ujson-5.9.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d581db9db9e41d8ea0b2705c90518ba623cbdc74f8d644d7eb0d107be0d85d9c"}, + {file = "ujson-5.9.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ff741a5b4be2d08fceaab681c9d4bc89abf3c9db600ab435e20b9b6d4dfef12e"}, + {file = "ujson-5.9.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdcb02cabcb1e44381221840a7af04433c1dc3297af76fde924a50c3054c708c"}, + {file = "ujson-5.9.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e208d3bf02c6963e6ef7324dadf1d73239fb7008491fdf523208f60be6437402"}, + {file = "ujson-5.9.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4b3917296630a075e04d3d07601ce2a176479c23af838b6cf90a2d6b39b0d95"}, + {file = "ujson-5.9.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0c4d6adb2c7bb9eb7c71ad6f6f612e13b264942e841f8cc3314a21a289a76c4e"}, + {file = "ujson-5.9.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0b159efece9ab5c01f70b9d10bbb77241ce111a45bc8d21a44c219a2aec8ddfd"}, + {file = "ujson-5.9.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0cb4a7814940ddd6619bdce6be637a4b37a8c4760de9373bac54bb7b229698b"}, + {file = "ujson-5.9.0-cp38-cp38-win32.whl", hash = "sha256:dc80f0f5abf33bd7099f7ac94ab1206730a3c0a2d17549911ed2cb6b7aa36d2d"}, + {file = "ujson-5.9.0-cp38-cp38-win_amd64.whl", hash = "sha256:506a45e5fcbb2d46f1a51fead991c39529fc3737c0f5d47c9b4a1d762578fc30"}, + {file = "ujson-5.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0fd2eba664a22447102062814bd13e63c6130540222c0aa620701dd01f4be81"}, + {file = "ujson-5.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bdf7fc21a03bafe4ba208dafa84ae38e04e5d36c0e1c746726edf5392e9f9f36"}, + {file = "ujson-5.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2f909bc08ce01f122fd9c24bc6f9876aa087188dfaf3c4116fe6e4daf7e194f"}, + {file = "ujson-5.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bd4ea86c2afd41429751d22a3ccd03311c067bd6aeee2d054f83f97e41e11d8f"}, + {file = "ujson-5.9.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:63fb2e6599d96fdffdb553af0ed3f76b85fda63281063f1cb5b1141a6fcd0617"}, + {file = "ujson-5.9.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:32bba5870c8fa2a97f4a68f6401038d3f1922e66c34280d710af00b14a3ca562"}, + {file = "ujson-5.9.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:37ef92e42535a81bf72179d0e252c9af42a4ed966dc6be6967ebfb929a87bc60"}, + {file = "ujson-5.9.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f69f16b8f1c69da00e38dc5f2d08a86b0e781d0ad3e4cc6a13ea033a439c4844"}, + {file = "ujson-5.9.0-cp39-cp39-win32.whl", hash = "sha256:3382a3ce0ccc0558b1c1668950008cece9bf463ebb17463ebf6a8bfc060dae34"}, + {file = "ujson-5.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:6adef377ed583477cf005b58c3025051b5faa6b8cc25876e594afbb772578f21"}, + {file = "ujson-5.9.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ffdfebd819f492e48e4f31c97cb593b9c1a8251933d8f8972e81697f00326ff1"}, + {file = "ujson-5.9.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4eec2ddc046360d087cf35659c7ba0cbd101f32035e19047013162274e71fcf"}, + {file = "ujson-5.9.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbb90aa5c23cb3d4b803c12aa220d26778c31b6e4b7a13a1f49971f6c7d088e"}, + {file = "ujson-5.9.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba0823cb70866f0d6a4ad48d998dd338dce7314598721bc1b7986d054d782dfd"}, + {file = "ujson-5.9.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:4e35d7885ed612feb6b3dd1b7de28e89baaba4011ecdf995e88be9ac614765e9"}, + {file = "ujson-5.9.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b048aa93eace8571eedbd67b3766623e7f0acbf08ee291bef7d8106210432427"}, + {file = "ujson-5.9.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:323279e68c195110ef85cbe5edce885219e3d4a48705448720ad925d88c9f851"}, + {file = "ujson-5.9.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9ac92d86ff34296f881e12aa955f7014d276895e0e4e868ba7fddebbde38e378"}, + {file = "ujson-5.9.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:6eecbd09b316cea1fd929b1e25f70382917542ab11b692cb46ec9b0a26c7427f"}, + {file = "ujson-5.9.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:473fb8dff1d58f49912323d7cb0859df5585cfc932e4b9c053bf8cf7f2d7c5c4"}, + {file = "ujson-5.9.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f91719c6abafe429c1a144cfe27883eace9fb1c09a9c5ef1bcb3ae80a3076a4e"}, + {file = "ujson-5.9.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b1c0991c4fe256f5fdb19758f7eac7f47caac29a6c57d0de16a19048eb86bad"}, + {file = "ujson-5.9.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a8ea0f55a1396708e564595aaa6696c0d8af532340f477162ff6927ecc46e21"}, + {file = "ujson-5.9.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:07e0cfdde5fd91f54cd2d7ffb3482c8ff1bf558abf32a8b953a5d169575ae1cd"}, + {file = "ujson-5.9.0.tar.gz", hash = "sha256:89cc92e73d5501b8a7f48575eeb14ad27156ad092c2e9fc7e3cf949f07e75532"}, ] [[package]] @@ -9249,19 +9357,20 @@ dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake [[package]] name = "urllib3" -version = "1.26.16" +version = "2.2.1" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.8" files = [ - {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, - {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, ] [package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "user-agent" @@ -9276,6 +9385,28 @@ files = [ [package.dependencies] six = "*" +[[package]] +name = "utilsforecast" +version = "0.1.4" +description = "Forecasting utilities" +optional = false +python-versions = ">=3.8" +files = [ + {file = "utilsforecast-0.1.4-py3-none-any.whl", hash = "sha256:0b7daf492f2e01020b4e65065bea18ee6fda4297ae3251266227d57696b865ec"}, + {file = "utilsforecast-0.1.4.tar.gz", hash = "sha256:692d838cc8937415134dd886169d5399fecd794b7bb154c7bf98b1104368958c"}, +] + +[package.dependencies] +numpy = "*" +packaging = "*" +pandas = ">=1.1.1" + +[package.extras] +dev = ["datasetsforecast (==0.0.8)", "nbdev", "numba", "pandas[plot]", "plotly", "plotly-resampler", "polars", "pyarrow", "scipy"] +plotting = ["pandas[plot]", "plotly", "plotly-resampler"] +polars = ["polars"] +scalers = ["numba", "scipy"] + [[package]] name = "vadersentiment" version = "3.3.2" @@ -9290,22 +9421,6 @@ files = [ [package.dependencies] requests = "*" -[[package]] -name = "validators" -version = "0.20.0" -description = "Python Data Validation for Humans™." -optional = false -python-versions = ">=3.4" -files = [ - {file = "validators-0.20.0.tar.gz", hash = "sha256:24148ce4e64100a2d5e267233e23e7afeb55316b47d30faae7eb6e7292bc226a"}, -] - -[package.dependencies] -decorator = ">=3.4.0" - -[package.extras] -test = ["flake8 (>=2.4.0)", "isort (>=4.2.2)", "pytest (>=2.2.3)"] - [[package]] name = "valinvest" version = "0.0.2" @@ -9319,41 +9434,40 @@ files = [ [[package]] name = "vcrpy" -version = "4.4.0" +version = "4.3.0" description = "Automatically mock your HTTP interactions to simplify and speed up testing" optional = false python-versions = ">=3.7" files = [ - {file = "vcrpy-4.4.0-py2.py3-none-any.whl", hash = "sha256:560c9d0d8436ced29223ceefb513c3ac3f2e2a60d51a9830f236a1e63167905a"}, - {file = "vcrpy-4.4.0.tar.gz", hash = "sha256:d1109ae93dbc2e7fcbc485849a7600d5dea510d3bef070eec4419c9a72ca2639"}, + {file = "vcrpy-4.3.0-py2.py3-none-any.whl", hash = "sha256:8fbd4be412e8a7f35f623dd61034e6380a1c8dbd0edf6e87277a3289f6e98093"}, + {file = "vcrpy-4.3.0.tar.gz", hash = "sha256:49c270ce67e826dba027d83e20d25b67a5885487697e97bca6dbdf53d750a0ac"}, ] [package.dependencies] PyYAML = "*" six = ">=1.5" -urllib3 = {version = "<2", markers = "python_version < \"3.10\""} wrapt = "*" yarl = "*" [[package]] name = "virtualenv" -version = "20.24.1" +version = "20.25.3" description = "Virtual Python Environment builder" optional = false python-versions = ">=3.7" files = [ - {file = "virtualenv-20.24.1-py3-none-any.whl", hash = "sha256:01aacf8decd346cf9a865ae85c0cdc7f64c8caa07ff0d8b1dfc1733d10677442"}, - {file = "virtualenv-20.24.1.tar.gz", hash = "sha256:2ef6a237c31629da6442b0bcaa3999748108c7166318d1f55cc9f8d7294e97bd"}, + {file = "virtualenv-20.25.3-py3-none-any.whl", hash = "sha256:8aac4332f2ea6ef519c648d0bc48a5b1d324994753519919bddbb1aff25a104e"}, + {file = "virtualenv-20.25.3.tar.gz", hash = "sha256:7bb554bbdfeaacc3349fa614ea5bff6ac300fc7c335e9facf3a3bcfc703f45be"}, ] [package.dependencies] -distlib = ">=0.3.6,<1" -filelock = ">=3.12,<4" -platformdirs = ">=3.5.1,<4" +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<5" [package.extras] -docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] -test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.3.1)", "pytest-env (>=0.8.1)", "pytest-freezer (>=0.4.6)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=67.8)", "time-machine (>=2.9)"] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2,!=7.3)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] [[package]] name = "watchdog" @@ -9397,13 +9511,13 @@ watchmedo = ["PyYAML (>=3.10)"] [[package]] name = "wcwidth" -version = "0.2.6" +version = "0.2.13" description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.2.6-py2.py3-none-any.whl", hash = "sha256:795b138f6875577cd91bba52baf9e445cd5118fd32723b460e30a0af30ea230e"}, - {file = "wcwidth-0.2.6.tar.gz", hash = "sha256:a5220780a404dbe3353789870978e472cfe477761f06ee55077256e509b156d0"}, + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] [[package]] @@ -9434,108 +9548,110 @@ files = [ [[package]] name = "websocket-client" -version = "1.6.1" +version = "1.7.0" description = "WebSocket client for Python with low level API options" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "websocket-client-1.6.1.tar.gz", hash = "sha256:c951af98631d24f8df89ab1019fc365f2227c0892f12fd150e935607c79dd0dd"}, - {file = "websocket_client-1.6.1-py3-none-any.whl", hash = "sha256:f1f9f2ad5291f0225a49efad77abf9e700b6fef553900623060dad6e26503b9d"}, + {file = "websocket-client-1.7.0.tar.gz", hash = "sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6"}, + {file = "websocket_client-1.7.0-py3-none-any.whl", hash = "sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588"}, ] [package.extras] -docs = ["Sphinx (>=3.4)", "sphinx-rtd-theme (>=0.5)"] +docs = ["Sphinx (>=6.0)", "sphinx-rtd-theme (>=1.1.0)"] optional = ["python-socks", "wsaccel"] test = ["websockets"] [[package]] name = "websockets" -version = "11.0.3" +version = "12.0" description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"}, - {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"}, - {file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"}, - {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"}, - {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"}, - {file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"}, - {file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"}, - {file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"}, - {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"}, - {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"}, - {file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"}, - {file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"}, - {file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"}, - {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"}, - {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"}, - {file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"}, - {file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"}, - {file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"}, - {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"}, - {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"}, - {file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"}, - {file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"}, - {file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"}, - {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"}, - {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"}, - {file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"}, - {file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"}, - {file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"}, - {file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"}, - {file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"}, - {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"}, - {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"}, + {file = "websockets-12.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d554236b2a2006e0ce16315c16eaa0d628dab009c33b63ea03f41c6107958374"}, + {file = "websockets-12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2d225bb6886591b1746b17c0573e29804619c8f755b5598d875bb4235ea639be"}, + {file = "websockets-12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eb809e816916a3b210bed3c82fb88eaf16e8afcf9c115ebb2bacede1797d2547"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c588f6abc13f78a67044c6b1273a99e1cf31038ad51815b3b016ce699f0d75c2"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5aa9348186d79a5f232115ed3fa9020eab66d6c3437d72f9d2c8ac0c6858c558"}, + {file = "websockets-12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6350b14a40c95ddd53e775dbdbbbc59b124a5c8ecd6fbb09c2e52029f7a9f480"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:70ec754cc2a769bcd218ed8d7209055667b30860ffecb8633a834dde27d6307c"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6e96f5ed1b83a8ddb07909b45bd94833b0710f738115751cdaa9da1fb0cb66e8"}, + {file = "websockets-12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4d87be612cbef86f994178d5186add3d94e9f31cc3cb499a0482b866ec477603"}, + {file = "websockets-12.0-cp310-cp310-win32.whl", hash = "sha256:befe90632d66caaf72e8b2ed4d7f02b348913813c8b0a32fae1cc5fe3730902f"}, + {file = "websockets-12.0-cp310-cp310-win_amd64.whl", hash = "sha256:363f57ca8bc8576195d0540c648aa58ac18cf85b76ad5202b9f976918f4219cf"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5d873c7de42dea355d73f170be0f23788cf3fa9f7bed718fd2830eefedce01b4"}, + {file = "websockets-12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3f61726cae9f65b872502ff3c1496abc93ffbe31b278455c418492016e2afc8f"}, + {file = "websockets-12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed2fcf7a07334c77fc8a230755c2209223a7cc44fc27597729b8ef5425aa61a3"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e332c210b14b57904869ca9f9bf4ca32f5427a03eeb625da9b616c85a3a506c"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5693ef74233122f8ebab026817b1b37fe25c411ecfca084b29bc7d6efc548f45"}, + {file = "websockets-12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e9e7db18b4539a29cc5ad8c8b252738a30e2b13f033c2d6e9d0549b45841c04"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6e2df67b8014767d0f785baa98393725739287684b9f8d8a1001eb2839031447"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bea88d71630c5900690fcb03161ab18f8f244805c59e2e0dc4ffadae0a7ee0ca"}, + {file = "websockets-12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dff6cdf35e31d1315790149fee351f9e52978130cef6c87c4b6c9b3baf78bc53"}, + {file = "websockets-12.0-cp311-cp311-win32.whl", hash = "sha256:3e3aa8c468af01d70332a382350ee95f6986db479ce7af14d5e81ec52aa2b402"}, + {file = "websockets-12.0-cp311-cp311-win_amd64.whl", hash = "sha256:25eb766c8ad27da0f79420b2af4b85d29914ba0edf69f547cc4f06ca6f1d403b"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0e6e2711d5a8e6e482cacb927a49a3d432345dfe7dea8ace7b5790df5932e4df"}, + {file = "websockets-12.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:dbcf72a37f0b3316e993e13ecf32f10c0e1259c28ffd0a85cee26e8549595fbc"}, + {file = "websockets-12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12743ab88ab2af1d17dd4acb4645677cb7063ef4db93abffbf164218a5d54c6b"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7b645f491f3c48d3f8a00d1fce07445fab7347fec54a3e65f0725d730d5b99cb"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9893d1aa45a7f8b3bc4510f6ccf8db8c3b62120917af15e3de247f0780294b92"}, + {file = "websockets-12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f38a7b376117ef7aff996e737583172bdf535932c9ca021746573bce40165ed"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f764ba54e33daf20e167915edc443b6f88956f37fb606449b4a5b10ba42235a5"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:1e4b3f8ea6a9cfa8be8484c9221ec0257508e3a1ec43c36acdefb2a9c3b00aa2"}, + {file = "websockets-12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9fdf06fd06c32205a07e47328ab49c40fc1407cdec801d698a7c41167ea45113"}, + {file = "websockets-12.0-cp312-cp312-win32.whl", hash = "sha256:baa386875b70cbd81798fa9f71be689c1bf484f65fd6fb08d051a0ee4e79924d"}, + {file = "websockets-12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ae0a5da8f35a5be197f328d4727dbcfafa53d1824fac3d96cdd3a642fe09394f"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5f6ffe2c6598f7f7207eef9a1228b6f5c818f9f4d53ee920aacd35cec8110438"}, + {file = "websockets-12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9edf3fc590cc2ec20dc9d7a45108b5bbaf21c0d89f9fd3fd1685e223771dc0b2"}, + {file = "websockets-12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8572132c7be52632201a35f5e08348137f658e5ffd21f51f94572ca6c05ea81d"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604428d1b87edbf02b233e2c207d7d528460fa978f9e391bd8aaf9c8311de137"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1a9d160fd080c6285e202327aba140fc9a0d910b09e423afff4ae5cbbf1c7205"}, + {file = "websockets-12.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87b4aafed34653e465eb77b7c93ef058516cb5acf3eb21e42f33928616172def"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b2ee7288b85959797970114deae81ab41b731f19ebcd3bd499ae9ca0e3f1d2c8"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7fa3d25e81bfe6a89718e9791128398a50dec6d57faf23770787ff441d851967"}, + {file = "websockets-12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:a571f035a47212288e3b3519944f6bf4ac7bc7553243e41eac50dd48552b6df7"}, + {file = "websockets-12.0-cp38-cp38-win32.whl", hash = "sha256:3c6cc1360c10c17463aadd29dd3af332d4a1adaa8796f6b0e9f9df1fdb0bad62"}, + {file = "websockets-12.0-cp38-cp38-win_amd64.whl", hash = "sha256:1bf386089178ea69d720f8db6199a0504a406209a0fc23e603b27b300fdd6892"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ab3d732ad50a4fbd04a4490ef08acd0517b6ae6b77eb967251f4c263011a990d"}, + {file = "websockets-12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1d9697f3337a89691e3bd8dc56dea45a6f6d975f92e7d5f773bc715c15dde28"}, + {file = "websockets-12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:1df2fbd2c8a98d38a66f5238484405b8d1d16f929bb7a33ed73e4801222a6f53"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:23509452b3bc38e3a057382c2e941d5ac2e01e251acce7adc74011d7d8de434c"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2e5fc14ec6ea568200ea4ef46545073da81900a2b67b3e666f04adf53ad452ec"}, + {file = "websockets-12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46e71dbbd12850224243f5d2aeec90f0aaa0f2dde5aeeb8fc8df21e04d99eff9"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b81f90dcc6c85a9b7f29873beb56c94c85d6f0dac2ea8b60d995bd18bf3e2aae"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a02413bc474feda2849c59ed2dfb2cddb4cd3d2f03a2fedec51d6e959d9b608b"}, + {file = "websockets-12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bbe6013f9f791944ed31ca08b077e26249309639313fff132bfbf3ba105673b9"}, + {file = "websockets-12.0-cp39-cp39-win32.whl", hash = "sha256:cbe83a6bbdf207ff0541de01e11904827540aa069293696dd528a6640bd6a5f6"}, + {file = "websockets-12.0-cp39-cp39-win_amd64.whl", hash = "sha256:fc4e7fa5414512b481a2483775a8e8be7803a35b30ca805afa4998a84f9fd9e8"}, + {file = "websockets-12.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:248d8e2446e13c1d4326e0a6a4e9629cb13a11195051a73acf414812700badbd"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f44069528d45a933997a6fef143030d8ca8042f0dfaad753e2906398290e2870"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c4e37d36f0d19f0a4413d3e18c0d03d0c268ada2061868c1e6f5ab1a6d575077"}, + {file = "websockets-12.0-pp310-pypy310_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d829f975fc2e527a3ef2f9c8f25e553eb7bc779c6665e8e1d52aa22800bb38b"}, + {file = "websockets-12.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2c71bd45a777433dd9113847af751aae36e448bc6b8c361a566cb043eda6ec30"}, + {file = "websockets-12.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0bee75f400895aef54157b36ed6d3b308fcab62e5260703add87f44cee9c82a6"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:423fc1ed29f7512fceb727e2d2aecb952c46aa34895e9ed96071821309951123"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:27a5e9964ef509016759f2ef3f2c1e13f403725a5e6a1775555994966a66e931"}, + {file = "websockets-12.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3181df4583c4d3994d31fb235dc681d2aaad744fbdbf94c4802485ececdecf2"}, + {file = "websockets-12.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:b067cb952ce8bf40115f6c19f478dc71c5e719b7fbaa511359795dfd9d1a6468"}, + {file = "websockets-12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:00700340c6c7ab788f176d118775202aadea7602c5cc6be6ae127761c16d6b0b"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e469d01137942849cff40517c97a30a93ae79917752b34029f0ec72df6b46399"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffefa1374cd508d633646d51a8e9277763a9b78ae71324183693959cf94635a7"}, + {file = "websockets-12.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0cab91b3956dfa9f512147860783a1829a8d905ee218a9837c18f683239611"}, + {file = "websockets-12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2cb388a5bfb56df4d9a406783b7f9dbefb888c09b71629351cc6b036e9259370"}, + {file = "websockets-12.0-py3-none-any.whl", hash = "sha256:dc284bbc8d7c78a6c69e0c7325ab46ee5e40bb4d50e494d8131a07ef47500e9e"}, + {file = "websockets-12.0.tar.gz", hash = "sha256:81df9cbcbb6c260de1e007e58c011bfebe2dafc8435107b0537f393dd38c8b1b"}, ] [[package]] name = "werkzeug" -version = "2.3.6" +version = "3.0.2" description = "The comprehensive WSGI web application library." optional = true python-versions = ">=3.8" files = [ - {file = "Werkzeug-2.3.6-py3-none-any.whl", hash = "sha256:935539fa1413afbb9195b24880778422ed620c0fc09670945185cce4d91a8890"}, - {file = "Werkzeug-2.3.6.tar.gz", hash = "sha256:98c774df2f91b05550078891dee5f0eb0cb797a522c757a2452b9cee5b202330"}, + {file = "werkzeug-3.0.2-py3-none-any.whl", hash = "sha256:3aac3f5da756f93030740bc235d3e09449efcf65f2f55e3602e1d851b8f48795"}, + {file = "werkzeug-3.0.2.tar.gz", hash = "sha256:e39b645a6ac92822588e7b39a692e7828724ceae0b0d702ef96701f90e70128d"}, ] [package.dependencies] @@ -9546,27 +9662,27 @@ watchdog = ["watchdog (>=2.3)"] [[package]] name = "wheel" -version = "0.40.0" +version = "0.43.0" description = "A built-package format for Python" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "wheel-0.40.0-py3-none-any.whl", hash = "sha256:d236b20e7cb522daf2390fa84c55eea81c5c30190f90f29ae2ca1ad8355bf247"}, - {file = "wheel-0.40.0.tar.gz", hash = "sha256:cd1196f3faee2b31968d626e1731c94f99cbdb67cf5a46e4f5656cbee7738873"}, + {file = "wheel-0.43.0-py3-none-any.whl", hash = "sha256:55c570405f142630c6b9f72fe09d9b67cf1477fcf543ae5b8dcb1f5b7377da81"}, + {file = "wheel-0.43.0.tar.gz", hash = "sha256:465ef92c69fa5c5da2d1cf8ac40559a8c940886afcef87dcf14b9470862f1d85"}, ] [package.extras] -test = ["pytest (>=6.0.0)"] +test = ["pytest (>=6.0.0)", "setuptools (>=65)"] [[package]] name = "widgetsnbextension" -version = "4.0.8" +version = "4.0.10" description = "Jupyter interactive widgets for Jupyter Notebook" optional = false python-versions = ">=3.7" files = [ - {file = "widgetsnbextension-4.0.8-py3-none-any.whl", hash = "sha256:2e37f0ce9da11651056280c7efe96f2db052fe8fc269508e3724f5cbd6c93018"}, - {file = "widgetsnbextension-4.0.8.tar.gz", hash = "sha256:9ec291ba87c2dfad42c3d5b6f68713fa18be1acd7476569516b2431682315c17"}, + {file = "widgetsnbextension-4.0.10-py3-none-any.whl", hash = "sha256:d37c3724ec32d8c48400a435ecfa7d3e259995201fbefa37163124a9fcb393cc"}, + {file = "widgetsnbextension-4.0.10.tar.gz", hash = "sha256:64196c5ff3b9a9183a8e699a4227fb0b7002f252c814098e66c4d1cd0644688f"}, ] [[package]] @@ -9585,86 +9701,81 @@ dev = ["black (>=19.3b0)", "pytest (>=4.6.2)"] [[package]] name = "wrapt" -version = "1.15.0" +version = "1.16.0" description = "Module for decorators, wrappers and monkey patching." optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.6" files = [ - {file = "wrapt-1.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ca1cccf838cd28d5a0883b342474c630ac48cac5df0ee6eacc9c7290f76b11c1"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e826aadda3cae59295b95343db8f3d965fb31059da7de01ee8d1c40a60398b29"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5fc8e02f5984a55d2c653f5fea93531e9836abbd84342c1d1e17abc4a15084c2"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:96e25c8603a155559231c19c0349245eeb4ac0096fe3c1d0be5c47e075bd4f46"}, - {file = "wrapt-1.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:40737a081d7497efea35ab9304b829b857f21558acfc7b3272f908d33b0d9d4c"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f87ec75864c37c4c6cb908d282e1969e79763e0d9becdfe9fe5473b7bb1e5f09"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1286eb30261894e4c70d124d44b7fd07825340869945c79d05bda53a40caa079"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:493d389a2b63c88ad56cdc35d0fa5752daac56ca755805b1b0c530f785767d5e"}, - {file = "wrapt-1.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:58d7a75d731e8c63614222bcb21dd992b4ab01a399f1f09dd82af17bbfc2368a"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21f6d9a0d5b3a207cdf7acf8e58d7d13d463e639f0c7e01d82cdb671e6cb7923"}, - {file = "wrapt-1.15.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce42618f67741d4697684e501ef02f29e758a123aa2d669e2d964ff734ee00ee"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41d07d029dd4157ae27beab04d22b8e261eddfc6ecd64ff7000b10dc8b3a5727"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54accd4b8bc202966bafafd16e69da9d5640ff92389d33d28555c5fd4f25ccb7"}, - {file = "wrapt-1.15.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbfbca668dd15b744418265a9607baa970c347eefd0db6a518aaf0cfbd153c0"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:76e9c727a874b4856d11a32fb0b389afc61ce8aaf281ada613713ddeadd1cfec"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e20076a211cd6f9b44a6be58f7eeafa7ab5720eb796975d0c03f05b47d89eb90"}, - {file = "wrapt-1.15.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a74d56552ddbde46c246b5b89199cb3fd182f9c346c784e1a93e4dc3f5ec9975"}, - {file = "wrapt-1.15.0-cp310-cp310-win32.whl", hash = "sha256:26458da5653aa5b3d8dc8b24192f574a58984c749401f98fff994d41d3f08da1"}, - {file = "wrapt-1.15.0-cp310-cp310-win_amd64.whl", hash = "sha256:75760a47c06b5974aa5e01949bf7e66d2af4d08cb8c1d6516af5e39595397f5e"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ba1711cda2d30634a7e452fc79eabcadaffedf241ff206db2ee93dd2c89a60e7"}, - {file = "wrapt-1.15.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56374914b132c702aa9aa9959c550004b8847148f95e1b824772d453ac204a72"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a89ce3fd220ff144bd9d54da333ec0de0399b52c9ac3d2ce34b569cf1a5748fb"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bbe623731d03b186b3d6b0d6f51865bf598587c38d6f7b0be2e27414f7f214e"}, - {file = "wrapt-1.15.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3abbe948c3cbde2689370a262a8d04e32ec2dd4f27103669a45c6929bcdbfe7c"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b67b819628e3b748fd3c2192c15fb951f549d0f47c0449af0764d7647302fda3"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:7eebcdbe3677e58dd4c0e03b4f2cfa346ed4049687d839adad68cc38bb559c92"}, - {file = "wrapt-1.15.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:74934ebd71950e3db69960a7da29204f89624dde411afbfb3b4858c1409b1e98"}, - {file = "wrapt-1.15.0-cp311-cp311-win32.whl", hash = "sha256:bd84395aab8e4d36263cd1b9308cd504f6cf713b7d6d3ce25ea55670baec5416"}, - {file = "wrapt-1.15.0-cp311-cp311-win_amd64.whl", hash = "sha256:a487f72a25904e2b4bbc0817ce7a8de94363bd7e79890510174da9d901c38705"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:4ff0d20f2e670800d3ed2b220d40984162089a6e2c9646fdb09b85e6f9a8fc29"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9ed6aa0726b9b60911f4aed8ec5b8dd7bf3491476015819f56473ffaef8959bd"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:896689fddba4f23ef7c718279e42f8834041a21342d95e56922e1c10c0cc7afb"}, - {file = "wrapt-1.15.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:75669d77bb2c071333417617a235324a1618dba66f82a750362eccbe5b61d248"}, - {file = "wrapt-1.15.0-cp35-cp35m-win32.whl", hash = "sha256:fbec11614dba0424ca72f4e8ba3c420dba07b4a7c206c8c8e4e73f2e98f4c559"}, - {file = "wrapt-1.15.0-cp35-cp35m-win_amd64.whl", hash = "sha256:fd69666217b62fa5d7c6aa88e507493a34dec4fa20c5bd925e4bc12fce586639"}, - {file = "wrapt-1.15.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b0724f05c396b0a4c36a3226c31648385deb6a65d8992644c12a4963c70326ba"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbeccb1aa40ab88cd29e6c7d8585582c99548f55f9b2581dfc5ba68c59a85752"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38adf7198f8f154502883242f9fe7333ab05a5b02de7d83aa2d88ea621f13364"}, - {file = "wrapt-1.15.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:578383d740457fa790fdf85e6d346fda1416a40549fe8db08e5e9bd281c6a475"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a4cbb9ff5795cd66f0066bdf5947f170f5d63a9274f99bdbca02fd973adcf2a8"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:af5bd9ccb188f6a5fdda9f1f09d9f4c86cc8a539bd48a0bfdc97723970348418"}, - {file = "wrapt-1.15.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b56d5519e470d3f2fe4aa7585f0632b060d532d0696c5bdfb5e8319e1d0f69a2"}, - {file = "wrapt-1.15.0-cp36-cp36m-win32.whl", hash = "sha256:77d4c1b881076c3ba173484dfa53d3582c1c8ff1f914c6461ab70c8428b796c1"}, - {file = "wrapt-1.15.0-cp36-cp36m-win_amd64.whl", hash = "sha256:077ff0d1f9d9e4ce6476c1a924a3332452c1406e59d90a2cf24aeb29eeac9420"}, - {file = "wrapt-1.15.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5c5aa28df055697d7c37d2099a7bc09f559d5053c3349b1ad0c39000e611d317"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a8564f283394634a7a7054b7983e47dbf39c07712d7b177b37e03f2467a024e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:780c82a41dc493b62fc5884fb1d3a3b81106642c5c5c78d6a0d4cbe96d62ba7e"}, - {file = "wrapt-1.15.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e169e957c33576f47e21864cf3fc9ff47c223a4ebca8960079b8bd36cb014fd0"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b02f21c1e2074943312d03d243ac4388319f2456576b2c6023041c4d57cd7019"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f2e69b3ed24544b0d3dbe2c5c0ba5153ce50dcebb576fdc4696d52aa22db6034"}, - {file = "wrapt-1.15.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d787272ed958a05b2c86311d3a4135d3c2aeea4fc655705f074130aa57d71653"}, - {file = "wrapt-1.15.0-cp37-cp37m-win32.whl", hash = "sha256:02fce1852f755f44f95af51f69d22e45080102e9d00258053b79367d07af39c0"}, - {file = "wrapt-1.15.0-cp37-cp37m-win_amd64.whl", hash = "sha256:abd52a09d03adf9c763d706df707c343293d5d106aea53483e0ec8d9e310ad5e"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdb4f085756c96a3af04e6eca7f08b1345e94b53af8921b25c72f096e704e145"}, - {file = "wrapt-1.15.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:230ae493696a371f1dbffaad3dafbb742a4d27a0afd2b1aecebe52b740167e7f"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63424c681923b9f3bfbc5e3205aafe790904053d42ddcc08542181a30a7a51bd"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6bcbfc99f55655c3d93feb7ef3800bd5bbe963a755687cbf1f490a71fb7794b"}, - {file = "wrapt-1.15.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c99f4309f5145b93eca6e35ac1a988f0dc0a7ccf9ccdcd78d3c0adf57224e62f"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b130fe77361d6771ecf5a219d8e0817d61b236b7d8b37cc045172e574ed219e6"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:96177eb5645b1c6985f5c11d03fc2dbda9ad24ec0f3a46dcce91445747e15094"}, - {file = "wrapt-1.15.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5fe3e099cf07d0fb5a1e23d399e5d4d1ca3e6dfcbe5c8570ccff3e9208274f7"}, - {file = "wrapt-1.15.0-cp38-cp38-win32.whl", hash = "sha256:abd8f36c99512755b8456047b7be10372fca271bf1467a1caa88db991e7c421b"}, - {file = "wrapt-1.15.0-cp38-cp38-win_amd64.whl", hash = "sha256:b06fa97478a5f478fb05e1980980a7cdf2712015493b44d0c87606c1513ed5b1"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2e51de54d4fb8fb50d6ee8327f9828306a959ae394d3e01a1ba8b2f937747d86"}, - {file = "wrapt-1.15.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0970ddb69bba00670e58955f8019bec4a42d1785db3faa043c33d81de2bf843c"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76407ab327158c510f44ded207e2f76b657303e17cb7a572ffe2f5a8a48aa04d"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd525e0e52a5ff16653a3fc9e3dd827981917d34996600bbc34c05d048ca35cc"}, - {file = "wrapt-1.15.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d37ac69edc5614b90516807de32d08cb8e7b12260a285ee330955604ed9dd29"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:078e2a1a86544e644a68422f881c48b84fef6d18f8c7a957ffd3f2e0a74a0d4a"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2cf56d0e237280baed46f0b5316661da892565ff58309d4d2ed7dba763d984b8"}, - {file = "wrapt-1.15.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7dc0713bf81287a00516ef43137273b23ee414fe41a3c14be10dd95ed98a2df9"}, - {file = "wrapt-1.15.0-cp39-cp39-win32.whl", hash = "sha256:46ed616d5fb42f98630ed70c3529541408166c22cdfd4540b88d5f21006b0eff"}, - {file = "wrapt-1.15.0-cp39-cp39-win_amd64.whl", hash = "sha256:eef4d64c650f33347c1f9266fa5ae001440b232ad9b98f1f43dfe7a79435c0a6"}, - {file = "wrapt-1.15.0-py3-none-any.whl", hash = "sha256:64b1df0f83706b4ef4cfb4fb0e4c2669100fd7ecacfb59e091fad300d4e04640"}, - {file = "wrapt-1.15.0.tar.gz", hash = "sha256:d06730c6aed78cee4126234cf2d071e01b44b915e725a6cb439a879ec9754a3a"}, + {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, + {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, + {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, + {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, + {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, + {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, + {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, + {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, + {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, + {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, + {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, + {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, + {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, + {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, + {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, + {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, + {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, + {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, + {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, + {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, + {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, + {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, + {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, + {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, + {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, + {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, + {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, + {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, + {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, + {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, + {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, + {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, + {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, + {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, + {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, + {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, + {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, ] [[package]] @@ -9693,17 +9804,17 @@ viz = ["matplotlib", "nc-time-axis", "seaborn"] [[package]] name = "xgboost" -version = "1.7.6" +version = "2.0.3" description = "XGBoost Python Package" optional = true python-versions = ">=3.8" files = [ - {file = "xgboost-1.7.6-py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.macosx_12_0_x86_64.whl", hash = "sha256:4c34675b4d2678c624ddde5d45361e7e16046923e362e4e609b88353e6b87124"}, - {file = "xgboost-1.7.6-py3-none-macosx_12_0_arm64.whl", hash = "sha256:59b4b366d2cafc7f645e87d897983a5b59be02876194b1d213bd8d8b811d8ce8"}, - {file = "xgboost-1.7.6-py3-none-manylinux2014_aarch64.whl", hash = "sha256:281c3c6f4fbed2d36bf95cd02a641afa95e72e9abde70064056da5e76233e8df"}, - {file = "xgboost-1.7.6-py3-none-manylinux2014_x86_64.whl", hash = "sha256:b1d5db49b199152d62bd9217c98760207d3de86d2b9d243260c573ffe638f80a"}, - {file = "xgboost-1.7.6-py3-none-win_amd64.whl", hash = "sha256:127cf1f5e2ec25cd41429394c6719b87af1456ce583e89f0bffd35d02ad18bcb"}, - {file = "xgboost-1.7.6.tar.gz", hash = "sha256:1c527554a400445e0c38186039ba1a00425dcdb4e40b37eed0e74cb39a159c47"}, + {file = "xgboost-2.0.3-py3-none-macosx_10_15_x86_64.macosx_11_0_x86_64.macosx_12_0_x86_64.whl", hash = "sha256:b21b2bb188b162c615fce468db93e3f995f3690e6184aadc7743b58466dc7f13"}, + {file = "xgboost-2.0.3-py3-none-macosx_12_0_arm64.whl", hash = "sha256:722d5b9351dfdf61973490dfd28abd42844db1cc469d07ed9b0cde9d1ffcdb32"}, + {file = "xgboost-2.0.3-py3-none-manylinux2014_aarch64.whl", hash = "sha256:2315a57b1883221e2f78dd514559aa9797e6c272d995d22e45495a04adac93cc"}, + {file = "xgboost-2.0.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:30bd5f789fad467fd49e04e5d19e04238b931682c3951a514da5c2410b3bf59c"}, + {file = "xgboost-2.0.3-py3-none-win_amd64.whl", hash = "sha256:462f131d7bfb1bc42f67c57fa5aa3e57d2b5755b1573a6e0d2c7e8895164e0fc"}, + {file = "xgboost-2.0.3.tar.gz", hash = "sha256:505955b5d770f8217a049beecce79e04a93787371c06dfb4b2414fec9d496bf3"}, ] [package.dependencies] @@ -9720,88 +9831,96 @@ scikit-learn = ["scikit-learn"] [[package]] name = "xlsxwriter" -version = "3.1.2" +version = "3.2.0" description = "A Python module for creating Excel XLSX files." optional = true python-versions = ">=3.6" files = [ - {file = "XlsxWriter-3.1.2-py3-none-any.whl", hash = "sha256:331508ff39d610ecdaf979e458840bc1eab6e6a02cfd5d08f044f0f73636236f"}, - {file = "XlsxWriter-3.1.2.tar.gz", hash = "sha256:78751099a770273f1c98b8d6643351f68f98ae8e6acf9d09d37dc6798f8cd3de"}, + {file = "XlsxWriter-3.2.0-py3-none-any.whl", hash = "sha256:ecfd5405b3e0e228219bcaf24c2ca0915e012ca9464a14048021d21a995d490e"}, + {file = "XlsxWriter-3.2.0.tar.gz", hash = "sha256:9977d0c661a72866a61f9f7a809e25ebbb0fb7036baa3b9fe74afcfca6b3cb8c"}, ] [[package]] name = "y-py" -version = "0.6.0" +version = "0.6.2" description = "Python bindings for the Y-CRDT built from yrs (Rust)" optional = false python-versions = "*" files = [ - {file = "y_py-0.6.0-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:ebbebc4f6a9e0c89c7b57035f91043b038e804dd1953845d8a66066f4526c853"}, - {file = "y_py-0.6.0-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:2c230bc01b96081550b7583b77d00404fd39825657f4064b919a10515f660cdf"}, - {file = "y_py-0.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5f5975c1a8c2ca99980571b8811d151db8590de9cc96346572a81e0f6f1e30e"}, - {file = "y_py-0.6.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e5f89cf9ef1daf12f438a075415a02f227594e4b0494c78d3b83cb83651631f5"}, - {file = "y_py-0.6.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:efb3225b58dc67152c004da3c26ae5bad0afebbb3c7509d853bdd87eaa655137"}, - {file = "y_py-0.6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aaaec9718f8a23924c95294d41d87829b113bc9a606a3667dfb995afc45c9920"}, - {file = "y_py-0.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fb03947937b0fcb09eb2b94eb08d8e8030ef0ed70af777684ab670bd369bc3c"}, - {file = "y_py-0.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f79ef7303e332e91d738e66e9bb7fce0243d0407a02631a58ebc0bf2fb8743d0"}, - {file = "y_py-0.6.0-cp310-none-win32.whl", hash = "sha256:1667b8a67ace756c04f03778e86fc359028c98905212f8686afb48c26c252bda"}, - {file = "y_py-0.6.0-cp310-none-win_amd64.whl", hash = "sha256:cca539c3804a580992304b18a33f1980282d9097a723f0bd01971477cb365b28"}, - {file = "y_py-0.6.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:5743e94c982585f05e02d9a3345dd9b1f28d90fa128df9f60b0eb357a76d2c32"}, - {file = "y_py-0.6.0-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:281535bb4f18fe09e5517a63b8206dd6f26ad6fb7e7c25c62bf785e594adab4d"}, - {file = "y_py-0.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69e05e01594e99c934562124b159720533b7ad887dde7762d460916aac47a8e4"}, - {file = "y_py-0.6.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a752ba8875ed2038dfc7d62738536cb22b4e308951cb925a7fe8fef782c6db08"}, - {file = "y_py-0.6.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ea7d796bb55d08dd1a60736beb724004f2cbdc207592b5f301a5ff314b17137"}, - {file = "y_py-0.6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5126786f914ff53ea2f04f9da790db168db172521cc4f114d5501badd2f6b96"}, - {file = "y_py-0.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b71cd495d322da25a53a6a830b591a2c0c46db22bb0b3556fca0bbdb1d45a18e"}, - {file = "y_py-0.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0624a5adf29d29330a336eecdf15874871f559d50944d542012665e1c3a18265"}, - {file = "y_py-0.6.0-cp311-none-win32.whl", hash = "sha256:374ffef1939c42286ea18e2a413c9974430226227f8f1480bbee469933aa675b"}, - {file = "y_py-0.6.0-cp311-none-win_amd64.whl", hash = "sha256:9242f3a5c6293e634817d9984c60523ffb34cf5b41501c5958681a75745946e6"}, - {file = "y_py-0.6.0-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:9dad6af2d83a2b0618ba3c1a2fc6657c5303cf4e9f1a65cc3fea40ffbcc552e2"}, - {file = "y_py-0.6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74d5ebb5f9ef0c4c1f7bdd9ab5e53b9d8be4c7464905f39761b22b6ce0d327d3"}, - {file = "y_py-0.6.0-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a027c39296c925f0b81e28a0fefab8c5964a0ea2b50fa05cbddf5e5ab167a380"}, - {file = "y_py-0.6.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:49adf7e25c3b3bac9f19bee181ef5253659ebe5747a7141860692015222b2007"}, - {file = "y_py-0.6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:47b3604c874d25616a097adaaabcad6e77729e23c5d029092b8149af1a08b2a5"}, - {file = "y_py-0.6.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a5a882591c8e1b1d6fbdb7ab43884907cef2b6a18e36c7ae85589e5f55371e5"}, - {file = "y_py-0.6.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:30b9337e4f3d541879a8187af121be1bd42ea110372a21895a1a3f800a6bd1c3"}, - {file = "y_py-0.6.0-cp37-none-win32.whl", hash = "sha256:ef0f08edb2094869e4d12346ee68d5154cb3d23bc3b1e7679222fae12228261c"}, - {file = "y_py-0.6.0-cp37-none-win_amd64.whl", hash = "sha256:391a232c328c2be1de4cb152ed3e9427826e4cbd9d645feacb3dbb344b122e10"}, - {file = "y_py-0.6.0-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:eb60fe68774117378efdbd368ef83cf1417e61d4bc39c6be8e7f4ee91fb7428a"}, - {file = "y_py-0.6.0-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:4f025c50301d9ddbbc2384f98d3ff1dbfe43606146b747e23a17774a02faffe9"}, - {file = "y_py-0.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4181b28f736cae3bb4517090ae5eeca318c075c0106466f13a4ed6682265fc8a"}, - {file = "y_py-0.6.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b6273d84605ee55b3ac52742018f94602dab9b0457f29e6f787021c473b02fed"}, - {file = "y_py-0.6.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1eefb6371cd6e072cf467b897f85bd0d7575f3a3e944fb8675f84fb59aedd071"}, - {file = "y_py-0.6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b75c2199a125ef8926f3216fb324c3bcd8b1b4b6c0b428888cc753ee4c85f81f"}, - {file = "y_py-0.6.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:035ba7ce31bb87bd7b5977eee71ee2ff71e54d347a35e2079362b1c23731dccd"}, - {file = "y_py-0.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:418aaa796a22b0102de09b36b6c6294d0a485f04bc8866c3b28f17e7022c44ba"}, - {file = "y_py-0.6.0-cp38-none-win32.whl", hash = "sha256:fc48db294d327a5cc10ee49f73f1fa1478240cc827c9029e0871106e327353ac"}, - {file = "y_py-0.6.0-cp38-none-win_amd64.whl", hash = "sha256:d1301bfeaa26f78f4b0e5f96e0f22761b38cc407713f70550a1be490945fd6d7"}, - {file = "y_py-0.6.0-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:e48b5b30242c7d517be85b48246b21e4e26540505a1ffe4fe473e239a8ec56d3"}, - {file = "y_py-0.6.0-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:479da40ef1205de52d87209534bf8e713a782e01eeed3df8dff44d21085e3f63"}, - {file = "y_py-0.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:19b7c3eaf65b162e59486a48bea5dd2035937952f15e008a14813e8cb7c24d7b"}, - {file = "y_py-0.6.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a20a4d10c8f0ee2b6df265d182d0be0ecd2ba7348c0a20b9df7d4d39df895801"}, - {file = "y_py-0.6.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:304e88a3deaff9906faa7ba514cf82f4ca4bad1ea88728206ff906e66179abd3"}, - {file = "y_py-0.6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6377e3cbab8f5b8b918130e9f924358f98ca1bea12a8096d3fadea191f7137f1"}, - {file = "y_py-0.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b44fdd64598e9ed4008158e5e60be5e1e2daeed6fae0ab2bf0002461e960709d"}, - {file = "y_py-0.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:51f1997dae6d77b12b50502871c7a9aae22e84048e83b64fe6d4f18dec2e4700"}, - {file = "y_py-0.6.0-cp39-none-win32.whl", hash = "sha256:9f56888aeb07ca76a5cd552581bb3735fcd2d8c18165b946fdb6e4507b10e76c"}, - {file = "y_py-0.6.0-cp39-none-win_amd64.whl", hash = "sha256:11345294820908d5b8af9c6616ea908dda8b3e554ee6f6d50be6a2e15940f63e"}, - {file = "y_py-0.6.0-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:4c16d50d0728abd915bd9e2e0c3ce982005ba78b60e4b6666aadc592d9982c79"}, - {file = "y_py-0.6.0-pp38-pypy38_pp73-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:eccf67d09a4df42a7be2a5427c1b2e0b89bec862f519ded754bd452df516b380"}, - {file = "y_py-0.6.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:513a2fe1318c247fc3b3c3ad208488e870a216784f2a3e6dbe2688c92f671c86"}, - {file = "y_py-0.6.0-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:76e2b14004cadb237499a8a068fd7a8b805b5c1fd0508530473e087c7dd25163"}, - {file = "y_py-0.6.0-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c276a7eb3ae3360f5a2fc503f1e4535d4a2f1c8cfc22af4595ad752e9a94fd77"}, - {file = "y_py-0.6.0-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:71f7689c25bd7608e1e7a76a13138cb202455fac165018693a3e8e5675f54b82"}, - {file = "y_py-0.6.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0505e2ca36408b754774a2bb20d93b5c7def3873406c13e1855de6f007f8a94"}, - {file = "y_py-0.6.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8f143fdcda7a6a89bf96d9b359142a7ca3315e8a9018aa46b0abbdeb47d7192e"}, - {file = "y_py-0.6.0-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:9a920bf096d1eecb0f30afc38ee56bfcb9e2c863c33db96fc9d30d4ac0dbee58"}, - {file = "y_py-0.6.0-pp39-pypy39_pp73-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:97812f9443fd846012d60ecacffa2a11992d02ad9f8618d4faae8e596736c646"}, - {file = "y_py-0.6.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83115cbbd4f6d3b38ebe06d80b1d0dbf1b10e53947f71df16f6145a4f0d14716"}, - {file = "y_py-0.6.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4cac9259839b32706336b3f521cacfd16fc7cefee609bd9c2b5123099328d696"}, - {file = "y_py-0.6.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e76be7258010ce8cbb93a841f78f52901bba1253a51213d3535972d13aa4e89e"}, - {file = "y_py-0.6.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a4b488be17d83173acb7f07c7e3430d2c66d0bd55b821683089311699562b58b"}, - {file = "y_py-0.6.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:37b9f24b00972e5685d0b9bbd01413d9c33d124145343fb92667f0e076f040ad"}, - {file = "y_py-0.6.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:95083c4cdbd593497a695e841b2ad050c0b9a8a9e374f8496aa478cebfcf9cc9"}, - {file = "y_py-0.6.0.tar.gz", hash = "sha256:46836169f7dc2957df8513cfe4bc2009175b3a473e630af421a8e75ee1c48f98"}, + {file = "y_py-0.6.2-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:c26bada6cd109095139237a46f50fc4308f861f0d304bc9e70acbc6c4503d158"}, + {file = "y_py-0.6.2-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:bae1b1ad8d2b8cf938a60313f8f7461de609621c5dcae491b6e54975f76f83c5"}, + {file = "y_py-0.6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e794e44fa260300b8850246c6371d94014753c73528f97f6ccb42f5e7ce698ae"}, + {file = "y_py-0.6.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b2686d7d8ca31531458a48e08b0344a8eec6c402405446ce7d838e2a7e43355a"}, + {file = "y_py-0.6.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d917f5bc27b85611ceee4eb85f0e4088b0a03b4eed22c472409933a94ee953cf"}, + {file = "y_py-0.6.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f6071328aad06fdcc0a4acc2dc4839396d645f5916de07584af807eb7c08407"}, + {file = "y_py-0.6.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:266ec46ab9f9cb40fbb5e649f55c329fc4620fa0b1a8117bdeefe91595e182dc"}, + {file = "y_py-0.6.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ce15a842c2a0bf46180ae136743b561fa276300dd7fa61fe76daf00ec7dc0c2d"}, + {file = "y_py-0.6.2-cp310-none-win32.whl", hash = "sha256:1d5b544e79ace93fdbd0b36ed329c86e346898153ac7ba2ec62bc9b4c6b745c9"}, + {file = "y_py-0.6.2-cp310-none-win_amd64.whl", hash = "sha256:80a827e173372682959a57e6b8cc4f6468b1a4495b4bc7a775ef6ca05ae3e8e8"}, + {file = "y_py-0.6.2-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:a21148b8ea09a631b752d975f9410ee2a31c0e16796fdc113422a6d244be10e5"}, + {file = "y_py-0.6.2-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:898fede446ca1926b8406bdd711617c2aebba8227ee8ec1f0c2f8568047116f7"}, + {file = "y_py-0.6.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce7c20b9395696d3b5425dccf2706d374e61ccf8f3656bff9423093a6df488f5"}, + {file = "y_py-0.6.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a3932f53418b408fa03bd002e6dc573a74075c2c092926dde80657c39aa2e054"}, + {file = "y_py-0.6.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:df35ea436592eb7e30e59c5403ec08ec3a5e7759e270cf226df73c47b3e739f5"}, + {file = "y_py-0.6.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:26cb1307c3ca9e21a3e307ab2c2099677e071ae9c26ec10ddffb3faceddd76b3"}, + {file = "y_py-0.6.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:863e175ce5585f9ff3eba2aa16626928387e2a576157f02c8eb247a218ecdeae"}, + {file = "y_py-0.6.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:35fcb9def6ce137540fdc0e91b08729677548b9c393c0151a6359fd199da3bd7"}, + {file = "y_py-0.6.2-cp311-none-win32.whl", hash = "sha256:86422c6090f34906c062fd3e4fdfdccf3934f2922021e979573ae315050b4288"}, + {file = "y_py-0.6.2-cp311-none-win_amd64.whl", hash = "sha256:6c2f2831c5733b404d2f2da4bfd02bb4612ae18d0822e14ae79b0b92436b816d"}, + {file = "y_py-0.6.2-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:7cbefd4f1060f05768227ddf83be126397b1d430b026c64e0eb25d3cf50c5734"}, + {file = "y_py-0.6.2-cp312-cp312-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:032365dfe932bfab8e80937ad6093b4c22e67d63ad880096b5fa8768f8d829ba"}, + {file = "y_py-0.6.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a70aee572da3994238c974694767365f237fc5949a550bee78a650fe16f83184"}, + {file = "y_py-0.6.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ae80d505aee7b3172cdcc2620ca6e2f85586337371138bb2b71aa377d2c31e9a"}, + {file = "y_py-0.6.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a497ebe617bec6a420fc47378856caae40ab0652e756f3ed40c5f1fe2a12220"}, + {file = "y_py-0.6.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e8638355ae2f996356f7f281e03a3e3ce31f1259510f9d551465356532e0302c"}, + {file = "y_py-0.6.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8448da4092265142662bbd3fc46cb8b0796b1e259189c020bc8f738899abd0b5"}, + {file = "y_py-0.6.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:69cfbcbe0a05f43e780e6a198080ba28034bf2bb4804d7d28f71a0379bfd1b19"}, + {file = "y_py-0.6.2-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:1f798165158b76365a463a4f8aa2e3c2a12eb89b1fc092e7020e93713f2ad4dc"}, + {file = "y_py-0.6.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92878cc05e844c8da937204bc34c2e6caf66709ce5936802fbfb35f04132892"}, + {file = "y_py-0.6.2-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9b8822a5c0fd9a8cffcabfcc0cd7326bad537ee614fc3654e413a03137b6da1a"}, + {file = "y_py-0.6.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e13cba03c7af8c8a846c4495875a09d64362cc4caeed495ada5390644411bbe7"}, + {file = "y_py-0.6.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82f2e5b31678065e7a7fa089ed974af5a4f076673cf4f414219bdadfc3246a21"}, + {file = "y_py-0.6.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1935d12e503780b859d343161a80df65205d23cad7b4f6c3df6e50321e188a3"}, + {file = "y_py-0.6.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bd302c6d46a3be57664571a5f0d4224646804be9890a01d73a0b294f2d3bbff1"}, + {file = "y_py-0.6.2-cp37-none-win32.whl", hash = "sha256:5415083f7f10eac25e1c434c87f07cb9bfa58909a6cad6649166fdad21119fc5"}, + {file = "y_py-0.6.2-cp37-none-win_amd64.whl", hash = "sha256:376c5cc0c177f03267340f36aec23e5eaf19520d41428d87605ca2ca3235d845"}, + {file = "y_py-0.6.2-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:3c011303eb2b360695d2bd4bd7ca85f42373ae89fcea48e7fa5b8dc6fc254a98"}, + {file = "y_py-0.6.2-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:c08311db17647a47d4898fc6f8d9c1f0e58b927752c894877ff0c38b3db0d6e1"}, + {file = "y_py-0.6.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b7cafbe946b4cafc1e5709957e6dd5c6259d241d48ed75713ded42a5e8a4663"}, + {file = "y_py-0.6.2-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3ba99d0bdbd9cabd65f914cd07b4fb2e939ce199b54ae5ace1639ce1edf8e0a2"}, + {file = "y_py-0.6.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dab84c52f64e10adc79011a08673eb80286c159b14e8fb455524bf2994f0cb38"}, + {file = "y_py-0.6.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:72875641a907523d37f4619eb4b303611d17e0a76f2ffc423b62dd1ca67eef41"}, + {file = "y_py-0.6.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c31240e30d5636ded02a54b7280aa129344fe8e964fd63885e85d9a8a83db206"}, + {file = "y_py-0.6.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4c28d977f516d4928f6bc0cd44561f6d0fdd661d76bac7cdc4b73e3c209441d9"}, + {file = "y_py-0.6.2-cp38-none-win32.whl", hash = "sha256:c011997f62d0c3b40a617e61b7faaaf6078e4eeff2e95ce4c45838db537816eb"}, + {file = "y_py-0.6.2-cp38-none-win_amd64.whl", hash = "sha256:ce0ae49879d10610cf3c40f4f376bb3cc425b18d939966ac63a2a9c73eb6f32a"}, + {file = "y_py-0.6.2-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:47fcc19158150dc4a6ae9a970c5bc12f40b0298a2b7d0c573a510a7b6bead3f3"}, + {file = "y_py-0.6.2-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:2d2b054a1a5f4004967532a4b82c6d1a45421ef2a5b41d35b6a8d41c7142aabe"}, + {file = "y_py-0.6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0787e85645bb4986c27e271715bc5ce21bba428a17964e5ec527368ed64669bc"}, + {file = "y_py-0.6.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:17bce637a89f6e75f0013be68becac3e38dc082e7aefaf38935e89215f0aa64a"}, + {file = "y_py-0.6.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:beea5ad9bd9e56aa77a6583b6f4e347d66f1fe7b1a2cb196fff53b7634f9dc84"}, + {file = "y_py-0.6.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d1dca48687f41efd862355e58b0aa31150586219324901dbea2989a506e291d4"}, + {file = "y_py-0.6.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17edd21eef863d230ea00004ebc6d582cc91d325e7132deb93f0a90eb368c855"}, + {file = "y_py-0.6.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:de9cfafe97c75cd3ea052a24cd4aabf9fb0cfc3c0f9f810f00121cdf123db9e4"}, + {file = "y_py-0.6.2-cp39-none-win32.whl", hash = "sha256:82f5ca62bedbf35aaf5a75d1f53b4457a1d9b6ff033497ca346e2a0cedf13d14"}, + {file = "y_py-0.6.2-cp39-none-win_amd64.whl", hash = "sha256:7227f232f2daf130ba786f6834548f2cfcfa45b7ec4f0d449e72560ac298186c"}, + {file = "y_py-0.6.2-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:0649a41cd3c98e290c16592c082dbe42c7ffec747b596172eebcafb7fd8767b0"}, + {file = "y_py-0.6.2-pp38-pypy38_pp73-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:bf6020560584671e76375b7a0539e0d5388fc70fa183c99dc769895f7ef90233"}, + {file = "y_py-0.6.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cf817a72ffec4295def5c5be615dd8f1e954cdf449d72ebac579ff427951328"}, + {file = "y_py-0.6.2-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7c7302619fc962e53093ba4a94559281491c045c925e5c4defec5dac358e0568"}, + {file = "y_py-0.6.2-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0cd6213c3cf2b9eee6f2c9867f198c39124c557f4b3b77d04a73f30fd1277a59"}, + {file = "y_py-0.6.2-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b4fac4ea2ce27b86d173ae45765ced7f159120687d4410bb6d0846cbdb170a3"}, + {file = "y_py-0.6.2-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:932abb560fe739416b50716a72ba6c6c20b219edded4389d1fc93266f3505d4b"}, + {file = "y_py-0.6.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e42258f66ad9f16d9b62e9c9642742982acb1f30b90f5061522048c1cb99814f"}, + {file = "y_py-0.6.2-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:cfc8381df1f0f873da8969729974f90111cfb61a725ef0a2e0e6215408fe1217"}, + {file = "y_py-0.6.2-pp39-pypy39_pp73-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:613f83713714972886e81d71685403098a83ffdacf616f12344b52bc73705107"}, + {file = "y_py-0.6.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:316e5e1c40259d482883d1926fd33fa558dc87b2bd2ca53ce237a6fe8a34e473"}, + {file = "y_py-0.6.2-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:015f7f6c1ce8a83d57955d1dc7ddd57cb633ae00576741a4fc9a0f72ed70007d"}, + {file = "y_py-0.6.2-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff32548e45e45bf3280ac1d28b3148337a5c6714c28db23aeb0693e33eba257e"}, + {file = "y_py-0.6.2-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0f2d881f0f8bf5674f8fe4774a438c545501e40fa27320c73be4f22463af4b05"}, + {file = "y_py-0.6.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d3bbe2f925cc587545c8d01587b4523177408edd252a32ce6d61b97113fe234d"}, + {file = "y_py-0.6.2-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:8f5c14d25611b263b876e9ada1701415a13c3e9f02ea397224fbe4ca9703992b"}, + {file = "y_py-0.6.2.tar.gz", hash = "sha256:4757a82a50406a0b3a333aa0122019a331bd6f16e49fed67dca423f928b3fd4d"}, ] [[package]] @@ -9828,85 +9947,101 @@ test = ["coverage (==5.2.1)", "pytest (==6.0.2)", "pytest-cov (==2.10.1)", "sele [[package]] name = "yarl" -version = "1.9.2" +version = "1.9.4" description = "Yet another URL library" optional = false python-versions = ">=3.7" files = [ - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, - {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, - {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, - {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, - {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, - {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, - {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, - {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, - {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, - {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, - {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, - {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, - {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a8c1df72eb746f4136fe9a2e72b0c9dc1da1cbd23b5372f94b5820ff8ae30e0e"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3a6ed1d525bfb91b3fc9b690c5a21bb52de28c018530ad85093cc488bee2dd2"}, + {file = "yarl-1.9.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c38c9ddb6103ceae4e4498f9c08fac9b590c5c71b0370f98714768e22ac6fa66"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9e09c9d74f4566e905a0b8fa668c58109f7624db96a2171f21747abc7524234"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8477c1ee4bd47c57d49621a062121c3023609f7a13b8a46953eb6c9716ca392"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5ff2c858f5f6a42c2a8e751100f237c5e869cbde669a724f2062d4c4ef93551"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:357495293086c5b6d34ca9616a43d329317feab7917518bc97a08f9e55648455"}, + {file = "yarl-1.9.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54525ae423d7b7a8ee81ba189f131054defdb122cde31ff17477951464c1691c"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:801e9264d19643548651b9db361ce3287176671fb0117f96b5ac0ee1c3530d53"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e516dc8baf7b380e6c1c26792610230f37147bb754d6426462ab115a02944385"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7d5aaac37d19b2904bb9dfe12cdb08c8443e7ba7d2852894ad448d4b8f442863"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:54beabb809ffcacbd9d28ac57b0db46e42a6e341a030293fb3185c409e626b8b"}, + {file = "yarl-1.9.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bac8d525a8dbc2a1507ec731d2867025d11ceadcb4dd421423a5d42c56818541"}, + {file = "yarl-1.9.4-cp310-cp310-win32.whl", hash = "sha256:7855426dfbddac81896b6e533ebefc0af2f132d4a47340cee6d22cac7190022d"}, + {file = "yarl-1.9.4-cp310-cp310-win_amd64.whl", hash = "sha256:848cd2a1df56ddbffeb375535fb62c9d1645dde33ca4d51341378b3f5954429b"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:35a2b9396879ce32754bd457d31a51ff0a9d426fd9e0e3c33394bf4b9036b099"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c7d56b293cc071e82532f70adcbd8b61909eec973ae9d2d1f9b233f3d943f2c"}, + {file = "yarl-1.9.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d8a1c6c0be645c745a081c192e747c5de06e944a0d21245f4cf7c05e457c36e0"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b3c1ffe10069f655ea2d731808e76e0f452fc6c749bea04781daf18e6039525"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:549d19c84c55d11687ddbd47eeb348a89df9cb30e1993f1b128f4685cd0ebbf8"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7409f968456111140c1c95301cadf071bd30a81cbd7ab829169fb9e3d72eae9"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e23a6d84d9d1738dbc6e38167776107e63307dfc8ad108e580548d1f2c587f42"}, + {file = "yarl-1.9.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d8b889777de69897406c9fb0b76cdf2fd0f31267861ae7501d93003d55f54fbe"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:03caa9507d3d3c83bca08650678e25364e1843b484f19986a527630ca376ecce"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e9035df8d0880b2f1c7f5031f33f69e071dfe72ee9310cfc76f7b605958ceb9"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:c0ec0ed476f77db9fb29bca17f0a8fcc7bc97ad4c6c1d8959c507decb22e8572"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:ee04010f26d5102399bd17f8df8bc38dc7ccd7701dc77f4a68c5b8d733406958"}, + {file = "yarl-1.9.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49a180c2e0743d5d6e0b4d1a9e5f633c62eca3f8a86ba5dd3c471060e352ca98"}, + {file = "yarl-1.9.4-cp311-cp311-win32.whl", hash = "sha256:81eb57278deb6098a5b62e88ad8281b2ba09f2f1147c4767522353eaa6260b31"}, + {file = "yarl-1.9.4-cp311-cp311-win_amd64.whl", hash = "sha256:d1d2532b340b692880261c15aee4dc94dd22ca5d61b9db9a8a361953d36410b1"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0d2454f0aef65ea81037759be5ca9947539667eecebca092733b2eb43c965a81"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:44d8ffbb9c06e5a7f529f38f53eda23e50d1ed33c6c869e01481d3fafa6b8142"}, + {file = "yarl-1.9.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:aaaea1e536f98754a6e5c56091baa1b6ce2f2700cc4a00b0d49eca8dea471074"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3777ce5536d17989c91696db1d459574e9a9bd37660ea7ee4d3344579bb6f129"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fc5fc1eeb029757349ad26bbc5880557389a03fa6ada41703db5e068881e5f2"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea65804b5dc88dacd4a40279af0cdadcfe74b3e5b4c897aa0d81cf86927fee78"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa102d6d280a5455ad6a0f9e6d769989638718e938a6a0a2ff3f4a7ff8c62cc4"}, + {file = "yarl-1.9.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09efe4615ada057ba2d30df871d2f668af661e971dfeedf0c159927d48bbeff0"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:008d3e808d03ef28542372d01057fd09168419cdc8f848efe2804f894ae03e51"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:6f5cb257bc2ec58f437da2b37a8cd48f666db96d47b8a3115c29f316313654ff"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:992f18e0ea248ee03b5a6e8b3b4738850ae7dbb172cc41c966462801cbf62cf7"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:0e9d124c191d5b881060a9e5060627694c3bdd1fe24c5eecc8d5d7d0eb6faabc"}, + {file = "yarl-1.9.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3986b6f41ad22988e53d5778f91855dc0399b043fc8946d4f2e68af22ee9ff10"}, + {file = "yarl-1.9.4-cp312-cp312-win32.whl", hash = "sha256:4b21516d181cd77ebd06ce160ef8cc2a5e9ad35fb1c5930882baff5ac865eee7"}, + {file = "yarl-1.9.4-cp312-cp312-win_amd64.whl", hash = "sha256:a9bd00dc3bc395a662900f33f74feb3e757429e545d831eef5bb280252631984"}, + {file = "yarl-1.9.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63b20738b5aac74e239622d2fe30df4fca4942a86e31bf47a81a0e94c14df94f"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7d7f7de27b8944f1fee2c26a88b4dabc2409d2fea7a9ed3df79b67277644e17"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c74018551e31269d56fab81a728f683667e7c28c04e807ba08f8c9e3bba32f14"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ca06675212f94e7a610e85ca36948bb8fc023e458dd6c63ef71abfd482481aa5"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aef935237d60a51a62b86249839b51345f47564208c6ee615ed2a40878dccdd"}, + {file = "yarl-1.9.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b134fd795e2322b7684155b7855cc99409d10b2e408056db2b93b51a52accc7"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d25039a474c4c72a5ad4b52495056f843a7ff07b632c1b92ea9043a3d9950f6e"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f7d6b36dd2e029b6bcb8a13cf19664c7b8e19ab3a58e0fefbb5b8461447ed5ec"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:957b4774373cf6f709359e5c8c4a0af9f6d7875db657adb0feaf8d6cb3c3964c"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:d7eeb6d22331e2fd42fce928a81c697c9ee2d51400bd1a28803965883e13cead"}, + {file = "yarl-1.9.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:6a962e04b8f91f8c4e5917e518d17958e3bdee71fd1d8b88cdce74dd0ebbf434"}, + {file = "yarl-1.9.4-cp37-cp37m-win32.whl", hash = "sha256:f3bc6af6e2b8f92eced34ef6a96ffb248e863af20ef4fde9448cc8c9b858b749"}, + {file = "yarl-1.9.4-cp37-cp37m-win_amd64.whl", hash = "sha256:ad4d7a90a92e528aadf4965d685c17dacff3df282db1121136c382dc0b6014d2"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ec61d826d80fc293ed46c9dd26995921e3a82146feacd952ef0757236fc137be"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8be9e837ea9113676e5754b43b940b50cce76d9ed7d2461df1af39a8ee674d9f"}, + {file = "yarl-1.9.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bef596fdaa8f26e3d66af846bbe77057237cb6e8efff8cd7cc8dff9a62278bbf"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d47552b6e52c3319fede1b60b3de120fe83bde9b7bddad11a69fb0af7db32f1"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84fc30f71689d7fc9168b92788abc977dc8cefa806909565fc2951d02f6b7d57"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4aa9741085f635934f3a2583e16fcf62ba835719a8b2b28fb2917bb0537c1dfa"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:206a55215e6d05dbc6c98ce598a59e6fbd0c493e2de4ea6cc2f4934d5a18d130"}, + {file = "yarl-1.9.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07574b007ee20e5c375a8fe4a0789fad26db905f9813be0f9fef5a68080de559"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5a2e2433eb9344a163aced6a5f6c9222c0786e5a9e9cac2c89f0b28433f56e23"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6ad6d10ed9b67a382b45f29ea028f92d25bc0bc1daf6c5b801b90b5aa70fb9ec"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:6fe79f998a4052d79e1c30eeb7d6c1c1056ad33300f682465e1b4e9b5a188b78"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a825ec844298c791fd28ed14ed1bffc56a98d15b8c58a20e0e08c1f5f2bea1be"}, + {file = "yarl-1.9.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8619d6915b3b0b34420cf9b2bb6d81ef59d984cb0fde7544e9ece32b4b3043c3"}, + {file = "yarl-1.9.4-cp38-cp38-win32.whl", hash = "sha256:686a0c2f85f83463272ddffd4deb5e591c98aac1897d65e92319f729c320eece"}, + {file = "yarl-1.9.4-cp38-cp38-win_amd64.whl", hash = "sha256:a00862fb23195b6b8322f7d781b0dc1d82cb3bcac346d1e38689370cc1cc398b"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:604f31d97fa493083ea21bd9b92c419012531c4e17ea6da0f65cacdcf5d0bd27"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8a854227cf581330ffa2c4824d96e52ee621dd571078a252c25e3a3b3d94a1b1"}, + {file = "yarl-1.9.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ba6f52cbc7809cd8d74604cce9c14868306ae4aa0282016b641c661f981a6e91"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6327976c7c2f4ee6816eff196e25385ccc02cb81427952414a64811037bbc8b"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8397a3817d7dcdd14bb266283cd1d6fc7264a48c186b986f32e86d86d35fbac5"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e0381b4ce23ff92f8170080c97678040fc5b08da85e9e292292aba67fdac6c34"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23d32a2594cb5d565d358a92e151315d1b2268bc10f4610d098f96b147370136"}, + {file = "yarl-1.9.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ddb2a5c08a4eaaba605340fdee8fc08e406c56617566d9643ad8bf6852778fc7"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:26a1dc6285e03f3cc9e839a2da83bcbf31dcb0d004c72d0730e755b33466c30e"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:18580f672e44ce1238b82f7fb87d727c4a131f3a9d33a5e0e82b793362bf18b4"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:29e0f83f37610f173eb7e7b5562dd71467993495e568e708d99e9d1944f561ec"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:1f23e4fe1e8794f74b6027d7cf19dc25f8b63af1483d91d595d4a07eca1fb26c"}, + {file = "yarl-1.9.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db8e58b9d79200c76956cefd14d5c90af54416ff5353c5bfd7cbe58818e26ef0"}, + {file = "yarl-1.9.4-cp39-cp39-win32.whl", hash = "sha256:c7224cab95645c7ab53791022ae77a4509472613e839dab722a72abe5a684575"}, + {file = "yarl-1.9.4-cp39-cp39-win_amd64.whl", hash = "sha256:824d6c50492add5da9374875ce72db7a0733b29c2394890aef23d533106e2b15"}, + {file = "yarl-1.9.4-py3-none-any.whl", hash = "sha256:928cecb0ef9d5a7946eb6ff58417ad2fe9375762382f1bf5c55e61645f2c43ad"}, + {file = "yarl-1.9.4.tar.gz", hash = "sha256:566db86717cf8080b99b58b083b773a908ae40f06681e87e589a976faf8246bf"}, ] [package.dependencies] @@ -9915,13 +10050,13 @@ multidict = ">=4.0" [[package]] name = "yfinance" -version = "0.2.37" +version = "0.2.38" description = "Download market data from Yahoo! Finance API" optional = false python-versions = "*" files = [ - {file = "yfinance-0.2.37-py2.py3-none-any.whl", hash = "sha256:3ac75fa1cd3496ee76b6df5d63d29679487ea9447123c5b935d1593240737a8f"}, - {file = "yfinance-0.2.37.tar.gz", hash = "sha256:e5f78c9bd27bae7abfd0af9b7996620eaa9aba759d67f957296634d7d54f0cef"}, + {file = "yfinance-0.2.38-py2.py3-none-any.whl", hash = "sha256:07525cf84414272723a3e2b9d4c0a2898ddb60cc0828aa190de26664fac6f676"}, + {file = "yfinance-0.2.38.tar.gz", hash = "sha256:483eecae0743d829fc337f21d80da4612f5257d5c1f35570efc4a5e98e4401a7"}, ] [package.dependencies] @@ -9962,82 +10097,90 @@ test = ["mypy", "pre-commit", "pytest", "pytest-asyncio", "websockets (>=10.0)"] [[package]] name = "yt-dlp" -version = "2023.7.6" +version = "2023.12.30" description = "A youtube-dl fork with additional features and patches" optional = true -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "yt-dlp-2023.7.6.tar.gz", hash = "sha256:cb58373869c8ccb5034746f91cfccd6d25ea697090dfd6f93e9034d51eb4aed2"}, - {file = "yt_dlp-2023.7.6-py2.py3-none-any.whl", hash = "sha256:b33b3f68751f33dd8290f1f61f7a011679b3b512aa223df3bff496688bc0bd19"}, + {file = "yt-dlp-2023.12.30.tar.gz", hash = "sha256:a11862e57721b0a0f0883dfeb5a4d79ba213a2d4c45e1880e9fd70f8e6570c38"}, + {file = "yt_dlp-2023.12.30-py2.py3-none-any.whl", hash = "sha256:c00d9a71d64472ad441bcaa1ec0c3797d6e60c9f934f270096a96fe51657e7b3"}, ] [package.dependencies] -brotli = {version = "*", markers = "platform_python_implementation == \"CPython\""} -brotlicffi = {version = "*", markers = "platform_python_implementation != \"CPython\""} +brotli = {version = "*", markers = "implementation_name == \"cpython\""} +brotlicffi = {version = "*", markers = "implementation_name != \"cpython\""} certifi = "*" mutagen = "*" pycryptodomex = "*" -websockets = "*" +requests = ">=2.31.0,<3" +urllib3 = ">=1.26.17,<3" +websockets = ">=12.0" [[package]] name = "zipp" -version = "3.16.2" +version = "3.18.1" description = "Backport of pathlib-compatible object wrapper for zip files" optional = false python-versions = ">=3.8" files = [ - {file = "zipp-3.16.2-py3-none-any.whl", hash = "sha256:679e51dd4403591b2d6838a48de3d283f3d188412a9782faadf845f298736ba0"}, - {file = "zipp-3.16.2.tar.gz", hash = "sha256:ebc15946aa78bd63458992fc81ec3b6f7b1e92d51c35e6de1c3804e73b799147"}, + {file = "zipp-3.18.1-py3-none-any.whl", hash = "sha256:206f5a15f2af3dbaee80769fb7dc6f249695e940acca08dfb2a4769fe61e538b"}, + {file = "zipp-3.18.1.tar.gz", hash = "sha256:2884ed22e7d8961de1c9a05142eb69a247f120291bc0206a00a7642f09b5b715"}, ] [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] [[package]] name = "zope-interface" -version = "6.0" +version = "6.3" description = "Interfaces for Python" optional = false python-versions = ">=3.7" files = [ - {file = "zope.interface-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f299c020c6679cb389814a3b81200fe55d428012c5e76da7e722491f5d205990"}, - {file = "zope.interface-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee4b43f35f5dc15e1fec55ccb53c130adb1d11e8ad8263d68b1284b66a04190d"}, - {file = "zope.interface-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a158846d0fca0a908c1afb281ddba88744d403f2550dc34405c3691769cdd85"}, - {file = "zope.interface-6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f72f23bab1848edb7472309e9898603141644faec9fd57a823ea6b4d1c4c8995"}, - {file = "zope.interface-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48f4d38cf4b462e75fac78b6f11ad47b06b1c568eb59896db5b6ec1094eb467f"}, - {file = "zope.interface-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:87b690bbee9876163210fd3f500ee59f5803e4a6607d1b1238833b8885ebd410"}, - {file = "zope.interface-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f2363e5fd81afb650085c6686f2ee3706975c54f331b426800b53531191fdf28"}, - {file = "zope.interface-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af169ba897692e9cd984a81cb0f02e46dacdc07d6cf9fd5c91e81f8efaf93d52"}, - {file = "zope.interface-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa90bac61c9dc3e1a563e5babb3fd2c0c1c80567e815442ddbe561eadc803b30"}, - {file = "zope.interface-6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:89086c9d3490a0f265a3c4b794037a84541ff5ffa28bb9c24cc9f66566968464"}, - {file = "zope.interface-6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:809fe3bf1a91393abc7e92d607976bbb8586512913a79f2bf7d7ec15bd8ea518"}, - {file = "zope.interface-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:0ec9653825f837fbddc4e4b603d90269b501486c11800d7c761eee7ce46d1bbb"}, - {file = "zope.interface-6.0-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:790c1d9d8f9c92819c31ea660cd43c3d5451df1df61e2e814a6f99cebb292788"}, - {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b39b8711578dcfd45fc0140993403b8a81e879ec25d53189f3faa1f006087dca"}, - {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eba51599370c87088d8882ab74f637de0c4f04a6d08a312dce49368ba9ed5c2a"}, - {file = "zope.interface-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ee934f023f875ec2cfd2b05a937bd817efcc6c4c3f55c5778cbf78e58362ddc"}, - {file = "zope.interface-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:042f2381118b093714081fd82c98e3b189b68db38ee7d35b63c327c470ef8373"}, - {file = "zope.interface-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dfbbbf0809a3606046a41f8561c3eada9db811be94138f42d9135a5c47e75f6f"}, - {file = "zope.interface-6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:424d23b97fa1542d7be882eae0c0fc3d6827784105264a8169a26ce16db260d8"}, - {file = "zope.interface-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e538f2d4a6ffb6edfb303ce70ae7e88629ac6e5581870e66c306d9ad7b564a58"}, - {file = "zope.interface-6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12175ca6b4db7621aedd7c30aa7cfa0a2d65ea3a0105393e05482d7a2d367446"}, - {file = "zope.interface-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c3d7dfd897a588ec27e391edbe3dd320a03684457470415870254e714126b1f"}, - {file = "zope.interface-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:b3f543ae9d3408549a9900720f18c0194ac0fe810cecda2a584fd4dca2eb3bb8"}, - {file = "zope.interface-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0583b75f2e70ec93f100931660328965bb9ff65ae54695fb3fa0a1255daa6f2"}, - {file = "zope.interface-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:23ac41d52fd15dd8be77e3257bc51bbb82469cf7f5e9a30b75e903e21439d16c"}, - {file = "zope.interface-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99856d6c98a326abbcc2363827e16bd6044f70f2ef42f453c0bd5440c4ce24e5"}, - {file = "zope.interface-6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1592f68ae11e557b9ff2bc96ac8fc30b187e77c45a3c9cd876e3368c53dc5ba8"}, - {file = "zope.interface-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4407b1435572e3e1610797c9203ad2753666c62883b921318c5403fb7139dec2"}, - {file = "zope.interface-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:5171eb073474a5038321409a630904fd61f12dd1856dd7e9d19cd6fe092cbbc5"}, - {file = "zope.interface-6.0.tar.gz", hash = "sha256:aab584725afd10c710b8f1e6e208dbee2d0ad009f57d674cb9d1b3964037275d"}, + {file = "zope.interface-6.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f32010ffb87759c6a3ad1c65ed4d2e38e51f6b430a1ca11cee901ec2b42e021"}, + {file = "zope.interface-6.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e78a183a3c2f555c2ad6aaa1ab572d1c435ba42f1dc3a7e8c82982306a19b785"}, + {file = "zope.interface-6.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa0491a9f154cf8519a02026dc85a416192f4cb1efbbf32db4a173ba28b289a"}, + {file = "zope.interface-6.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62e32f02b3f26204d9c02c3539c802afc3eefb19d601a0987836ed126efb1f21"}, + {file = "zope.interface-6.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c40df4aea777be321b7e68facb901bc67317e94b65d9ab20fb96e0eb3c0b60a1"}, + {file = "zope.interface-6.3-cp310-cp310-win_amd64.whl", hash = "sha256:46034be614d1f75f06e7dcfefba21d609b16b38c21fc912b01a99cb29e58febb"}, + {file = "zope.interface-6.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:600101f43a7582d5b9504a7c629a1185a849ce65e60fca0f6968dfc4b76b6d39"}, + {file = "zope.interface-6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4d6b229f5e1a6375f206455cc0a63a8e502ed190fe7eb15e94a312dc69d40299"}, + {file = "zope.interface-6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10cde8dc6b2fd6a1d0b5ca4be820063e46ddba417ab82bcf55afe2227337b130"}, + {file = "zope.interface-6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40aa8c8e964d47d713b226c5baf5f13cdf3a3169c7a2653163b17ff2e2334d10"}, + {file = "zope.interface-6.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d165d7774d558ea971cb867739fb334faf68fc4756a784e689e11efa3becd59e"}, + {file = "zope.interface-6.3-cp311-cp311-win_amd64.whl", hash = "sha256:69dedb790530c7ca5345899a1b4cb837cc53ba669051ea51e8c18f82f9389061"}, + {file = "zope.interface-6.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8d407e0fd8015f6d5dfad481309638e1968d70e6644e0753f229154667dd6cd5"}, + {file = "zope.interface-6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:72d5efecad16c619a97744a4f0b67ce1bcc88115aa82fcf1dc5be9bb403bcc0b"}, + {file = "zope.interface-6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:567d54c06306f9c5b6826190628d66753b9f2b0422f4c02d7c6d2b97ebf0a24e"}, + {file = "zope.interface-6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:483e118b1e075f1819b3c6ace082b9d7d3a6a5eb14b2b375f1b80a0868117920"}, + {file = "zope.interface-6.3-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb78c12c1ad3a20c0d981a043d133299117b6854f2e14893b156979ed4e1d2c"}, + {file = "zope.interface-6.3-cp312-cp312-win_amd64.whl", hash = "sha256:ad4524289d8dbd6fb5aa17aedb18f5643e7d48358f42c007a5ee51a2afc2a7c5"}, + {file = "zope.interface-6.3-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:a56fe1261230093bfeedc1c1a6cd6f3ec568f9b07f031c9a09f46b201f793a85"}, + {file = "zope.interface-6.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:014bb94fe6bf1786da1aa044eadf65bc6437bcb81c451592987e5be91e70a91e"}, + {file = "zope.interface-6.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22e8a218e8e2d87d4d9342aa973b7915297a08efbebea5b25900c73e78ed468e"}, + {file = "zope.interface-6.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f95bebd0afe86b2adc074df29edb6848fc4d474ff24075e2c263d698774e108d"}, + {file = "zope.interface-6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:d0e7321557c702bd92dac3c66a2f22b963155fdb4600133b6b29597f62b71b12"}, + {file = "zope.interface-6.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:187f7900b63845dcdef1be320a523dbbdba94d89cae570edc2781eb55f8c2f86"}, + {file = "zope.interface-6.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a058e6cf8d68a5a19cb5449f42a404f0d6c2778b897e6ce8fadda9cea308b1b0"}, + {file = "zope.interface-6.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8fa0fb05083a1a4216b4b881fdefa71c5d9a106e9b094cd4399af6b52873e91"}, + {file = "zope.interface-6.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:26c9a37fb395a703e39b11b00b9e921c48f82b6e32cc5851ad5d0618cd8876b5"}, + {file = "zope.interface-6.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1b0c4c90e5eefca2c3e045d9f9ed9f1e2cdbe70eb906bff6b247e17119ad89a1"}, + {file = "zope.interface-6.3-cp38-cp38-win_amd64.whl", hash = "sha256:5683aa8f2639016fd2b421df44301f10820e28a9b96382a6e438e5c6427253af"}, + {file = "zope.interface-6.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2c3cfb272bcb83650e6695d49ae0d14dd06dc694789a3d929f23758557a23d92"}, + {file = "zope.interface-6.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:01a0b3dd012f584afcf03ed814bce0fc40ed10e47396578621509ac031be98bf"}, + {file = "zope.interface-6.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4137025731e824eee8d263b20682b28a0bdc0508de9c11d6c6be54163e5b7c83"}, + {file = "zope.interface-6.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c8731596198198746f7ce2a4487a0edcbc9ea5e5918f0ab23c4859bce56055c"}, + {file = "zope.interface-6.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf34840e102d1d0b2d39b1465918d90b312b1119552cebb61a242c42079817b9"}, + {file = "zope.interface-6.3-cp39-cp39-win_amd64.whl", hash = "sha256:a1adc14a2a9d5e95f76df625a9b39f4709267a483962a572e3f3001ef90ea6e6"}, + {file = "zope.interface-6.3.tar.gz", hash = "sha256:f83d6b4b22262d9a826c3bd4b2fbfafe1d0000f085ef8e44cd1328eea274ae6a"}, ] [package.dependencies] setuptools = "*" [package.extras] -docs = ["Sphinx", "repoze.sphinx.autointerface"] +docs = ["Sphinx", "repoze.sphinx.autointerface", "sphinx-rtd-theme"] test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] diff --git a/website/.gitignore b/website/.gitignore index 04ebeaf5138..b2d6de30624 100644 --- a/website/.gitignore +++ b/website/.gitignore @@ -18,8 +18,3 @@ npm-debug.log* yarn-debug.log* yarn-error.log* - -# Reference files -content/excel/reference/* -content/platform/data_models/* -content/platform/reference/* diff --git a/website/content/excel/functions.json b/website/content/excel/functions.json index 1cebe7a1928..e93a51521c4 100644 --- a/website/content/excel/functions.json +++ b/website/content/excel/functions.json @@ -79,7 +79,7 @@ "name": "CRYPTO.PRICE.HISTORICAL", "parameters": [ { - "description": "Symbol to get data for. Can use CURR1-CURR2 or CURR1CURR2 format. Multiple comma separated items allowed for provider(s): fmp, polygon.", + "description": "Symbol to get data for. Can use CURR1-CURR2 or CURR1CURR2 format. Multiple items allowed for provider(s): fmp, polygon.", "name": "symbol", "type": "string" }, @@ -96,19 +96,25 @@ "type": "string" }, { - "description": "Options: fmp, polygon, defaults to fmp.", + "description": "Options: fmp, polygon, tiingo, defaults to fmp.", "name": "provider", "optional": true, "type": "string" }, { - "description": "Time interval of the data to return. (provider: fmp);\nTime interval of the data to return. The numeric portion of the interval can be any positive integer. The letter portion can be one of the following: s, m, h, d, W, M, Q, Y (provider: polygon)", + "description": "Number of days to look back. (provider: fmp)", + "name": "timeseries", + "optional": true, + "type": "number" + }, + { + "description": "Data granularity. (provider: fmp, polygon, tiingo)", "name": "interval", "optional": true, "type": "string" }, { - "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date. (provider: polygon)", + "description": "Sort order of the data. (provider: polygon)", "name": "sort", "optional": true, "type": "string" @@ -118,6 +124,13 @@ "name": "limit", "optional": true, "type": "number" + }, + { + "description": "To limit the query to a subset of exchanges e.g. ['POLONIEX', 'GDAX'] (provider: tiingo)", + "dimensionality": "matrix", + "name": "exchanges", + "optional": true, + "type": "any" } ], "result": { @@ -154,7 +167,7 @@ "name": "CURRENCY.PRICE.HISTORICAL", "parameters": [ { - "description": "Symbol to get data for. Can use CURR1-CURR2 or CURR1CURR2 format. Multiple comma separated items allowed for provider(s): fmp, polygon.", + "description": "Symbol to get data for. Can use CURR1-CURR2 or CURR1CURR2 format. Multiple items allowed for provider(s): polygon.", "name": "symbol", "type": "string" }, @@ -171,19 +184,19 @@ "type": "string" }, { - "description": "Options: fmp, polygon, defaults to fmp.", + "description": "Options: fmp, polygon, tiingo, defaults to fmp.", "name": "provider", "optional": true, "type": "string" }, { - "description": "Time interval of the data to return. (provider: fmp);\nTime interval of the data to return. The numeric portion of the interval can be any positive integer. The letter portion can be one of the following: s, m, h, d, W, M, Q, Y (provider: polygon)", + "description": "Data granularity. (provider: fmp, polygon, tiingo)", "name": "interval", "optional": true, "type": "string" }, { - "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date. (provider: polygon)", + "description": "Sort order of the data. (provider: polygon)", "name": "sort", "optional": true, "type": "string" @@ -275,41 +288,6 @@ "dimensionality": "matrix" } }, - { - "description": "Snapshots of currency exchange rates from an indirect or direct perspective of a base currency.", - "helpUrl": "https://docs.openbb.co/excel/reference/currency/snapshots", - "id": "CURRENCY.SNAPSHOTS", - "name": "CURRENCY.SNAPSHOTS", - "parameters": [ - { - "description": "The base currency symbol. Multiple comma separated items allowed for provider(s): fmp.", - "name": "base", - "optional": true, - "type": "string" - }, - { - "description": "Whether the quote is direct or indirect. Selecting 'direct' will return the exchange rate as the amount of domestic currency required to buy one unit of the foreign currency. Selecting 'indirect' (default) will return the exchange rate as the amount of foreign currency required to buy one unit of the domestic currency.", - "name": "quote_type", - "optional": true, - "type": "string" - }, - { - "description": "An optional list of counter currency symbols to filter for. None returns all.", - "name": "counter_currencies", - "optional": true, - "type": "any" - }, - { - "description": "Options: fmp, defaults to fmp.", - "name": "provider", - "optional": true, - "type": "string" - } - ], - "result": { - "dimensionality": "matrix" - } - }, { "description": "Get the complete options chain for a ticker.", "helpUrl": "https://docs.openbb.co/excel/reference/derivatives/options/chains", @@ -356,48 +334,6 @@ "optional": true, "type": "string" }, - { - "description": "Start date of the data, in YYYY-MM-DD format. If no symbol is supplied, requests are only allowed for a single date. Use the start_date for the target date. Intrinio appears to have data beginning Feb/2022, but is unclear when it actually began. (provider: intrinio)", - "name": "start_date", - "optional": true, - "type": "string" - }, - { - "description": "End date of the data, in YYYY-MM-DD format. If a symbol is not supplied, do not include an end date. (provider: intrinio)", - "name": "end_date", - "optional": true, - "type": "string" - }, - { - "description": "The type of unusual activity to query for. (provider: intrinio)", - "name": "trade_type", - "optional": true, - "type": "string" - }, - { - "description": "The sentiment type to query for. (provider: intrinio)", - "name": "sentiment", - "optional": true, - "type": "string" - }, - { - "description": "The inclusive minimum total value for the unusual activity. (provider: intrinio)", - "name": "min_value", - "optional": true, - "type": "number" - }, - { - "description": "The inclusive maximum total value for the unusual activity. (provider: intrinio)", - "name": "max_value", - "optional": true, - "type": "number" - }, - { - "description": "The number of data entries to return. A typical day for all symbols will yield 50-80K records. The API will paginate at 1000 records. The high default limit (100K) is to be able to reliably capture the most days. The high absolute limit (1.25M) is to allow for outlier days. Queries at the absolute limit will take a long time, and might be unreliable. Apply filters to improve performance. (provider: intrinio)", - "name": "limit", - "optional": true, - "type": "number" - }, { "description": "The source of the data. Either realtime or delayed. (provider: intrinio)", "name": "source", @@ -469,7 +405,7 @@ "type": "string" }, { - "description": "Country of the event. Multiple comma separated items allowed. (provider: tradingeconomics)", + "description": "Country of the event. Multiple items allowed. (provider: tradingeconomics)", "name": "country", "optional": true, "type": "string" @@ -533,7 +469,7 @@ "name": "ECONOMY.CPI", "parameters": [ { - "description": "The country to get data. Multiple comma separated items allowed for provider(s): fred.", + "description": "The country to get data. Multiple items allowed for provider(s): fred.", "name": "country", "type": "string" }, @@ -585,7 +521,7 @@ "name": "ECONOMY.FRED_REGIONAL", "parameters": [ { - "description": "Symbol to get data for.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fred.", "name": "symbol", "type": "string" }, @@ -744,7 +680,7 @@ "name": "ECONOMY.FRED_SERIES", "parameters": [ { - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fred.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fred.", "name": "symbol", "type": "string" }, @@ -1351,13 +1287,13 @@ "name": "EQUITY.ESTIMATES.ANALYST_SEARCH", "parameters": [ { - "description": "Analyst names to return. Omitting will return all available analysts. Multiple comma separated items allowed for provider(s): benzinga.", + "description": "A comma separated list of analyst names to bring back. Omitting will bring back all available analysts.", "name": "analyst_name", "optional": true, "type": "string" }, { - "description": "Firm names to return. Omitting will return all available firms. Multiple comma separated items allowed for provider(s): benzinga.", + "description": "A comma separated list of firm names to bring back. Omitting will bring back all available firms.", "name": "firm_name", "optional": true, "type": "string" @@ -1369,16 +1305,16 @@ "type": "string" }, { - "description": "List of analyst IDs to return. Multiple comma separated items allowed. (provider: benzinga)", + "description": "A comma separated list of analyst IDs to bring back. (provider: benzinga)", "name": "analyst_ids", "optional": true, - "type": "string" + "type": "any" }, { - "description": "Firm IDs to return. Multiple comma separated items allowed. (provider: benzinga)", + "description": "A comma separated list of firm IDs to bring back. (provider: benzinga)", "name": "firm_ids", "optional": true, - "type": "string" + "type": "any" }, { "description": "Number of results returned. Limit 1000. (provider: benzinga)", @@ -1393,10 +1329,10 @@ "type": "number" }, { - "description": "Fields to include in the response. See https://docs.benzinga.io/benzinga-apis/calendar/get-ratings to learn about the available fields. Multiple comma separated items allowed. (provider: benzinga)", + "description": "Comma-separated list of fields to include in the response. See https://docs.benzinga.io/benzinga-apis/calendar/get-ratings to learn about the available fields. (provider: benzinga)", "name": "fields", "optional": true, - "type": "string" + "type": "any" } ], "result": { @@ -1410,7 +1346,7 @@ "name": "EQUITY.ESTIMATES.CONSENSUS", "parameters": [ { - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp.", + "description": "Symbol to get data for.", "name": "symbol", "type": "string" }, @@ -1432,27 +1368,27 @@ "name": "EQUITY.ESTIMATES.HISTORICAL", "parameters": [ { - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp.", + "description": "Symbol to get data for.", "name": "symbol", "type": "string" }, + { + "description": "Time period of the data to return.", + "name": "period", + "optional": true, + "type": "string" + }, + { + "description": "The number of data entries to return.", + "name": "limit", + "optional": true, + "type": "number" + }, { "description": "Options: fmp, defaults to fmp.", "name": "provider", "optional": true, "type": "string" - }, - { - "description": "Time period of the data to return. (provider: fmp)", - "name": "period", - "optional": true, - "type": "string" - }, - { - "description": "The number of data entries to return. (provider: fmp)", - "name": "limit", - "optional": true, - "type": "number" } ], "result": { @@ -1466,7 +1402,7 @@ "name": "EQUITY.ESTIMATES.PRICE_TARGET", "parameters": [ { - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): benzinga, fmp.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): benzinga.", "name": "symbol", "optional": true, "type": "string" @@ -1526,19 +1462,19 @@ "type": "string" }, { - "description": "Comma-separated list of analyst (person) IDs. Omitting will bring back all available analysts. Multiple comma separated items allowed. (provider: benzinga)", + "description": "Comma-separated list of analyst (person) IDs. Omitting will bring back all available analysts. Multiple items allowed. (provider: benzinga)", "name": "analyst_ids", "optional": true, "type": "any" }, { - "description": "Comma-separated list of firm IDs. Multiple comma separated items allowed. (provider: benzinga)", + "description": "Comma-separated list of firm IDs. Multiple items allowed. (provider: benzinga)", "name": "firm_ids", "optional": true, "type": "any" }, { - "description": "Comma-separated list of fields to include in the response. See https://docs.benzinga.io/benzinga-apis/calendar/get-ratings to learn about the available fields. Multiple comma separated items allowed. (provider: benzinga)", + "description": "Comma-separated list of fields to include in the response. See https://docs.benzinga.io/benzinga-apis/calendar/get-ratings to learn about the available fields. Multiple items allowed. (provider: benzinga)", "name": "fields", "optional": true, "type": "any" @@ -1938,6 +1874,12 @@ "optional": true, "type": "number" }, + { + "description": "Sort the data in ascending or descending order. (provider: fmp)", + "name": "sort", + "optional": true, + "type": "string" + }, { "description": "Start date of the data, in YYYY-MM-DD format. (provider: intrinio)", "name": "start_date", @@ -1980,12 +1922,12 @@ "name": "EQUITY.FUNDAMENTAL.HISTORICAL_ATTRIBUTES", "parameters": [ { - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): intrinio.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): intrinio.", "name": "symbol", "type": "string" }, { - "description": "Intrinio data tag ID or code. Multiple comma separated items allowed for provider(s): intrinio.", + "description": "Intrinio data tag ID or code. Multiple items allowed for provider(s): intrinio.", "name": "tag", "type": "string" }, @@ -2245,12 +2187,12 @@ "name": "EQUITY.FUNDAMENTAL.LATEST_ATTRIBUTES", "parameters": [ { - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): intrinio.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): intrinio.", "name": "symbol", "type": "string" }, { - "description": "Intrinio data tag ID or code. Multiple comma separated items allowed for provider(s): intrinio.", + "description": "Intrinio data tag ID or code. Multiple items allowed for provider(s): intrinio.", "name": "tag", "type": "string" }, @@ -2294,21 +2236,27 @@ "name": "EQUITY.FUNDAMENTAL.MANAGEMENT_COMPENSATION", "parameters": [ { - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.", "name": "symbol", "type": "string" }, + { + "description": "Start date of the data, in YYYY-MM-DD format.", + "name": "start_date", + "optional": true, + "type": "string" + }, + { + "description": "End date of the data, in YYYY-MM-DD format.", + "name": "end_date", + "optional": true, + "type": "string" + }, { "description": "Options: fmp, defaults to fmp.", "name": "provider", "optional": true, "type": "string" - }, - { - "description": "Year of the compensation. (provider: fmp)", - "name": "year", - "optional": true, - "type": "number" } ], "result": { @@ -2322,7 +2270,7 @@ "name": "EQUITY.FUNDAMENTAL.METRICS", "parameters": [ { - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.", "name": "symbol", "type": "string" }, @@ -2362,7 +2310,7 @@ "name": "EQUITY.FUNDAMENTAL.MULTIPLES", "parameters": [ { - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.", "name": "symbol", "type": "string" }, @@ -2406,7 +2354,7 @@ "name": "EQUITY.FUNDAMENTAL.RATIOS", "parameters": [ { - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio.", "name": "symbol", "type": "string" }, @@ -2429,7 +2377,7 @@ "type": "string" }, { - "description": "Include trailing twelve months (TTM) data. (provider: fmp)", + "description": "Include trailing twelve months (TTM) data. (provider: fmp, intrinio)", "name": "with_ttm", "optional": true, "type": "boolean" @@ -2587,6 +2535,35 @@ "dimensionality": "matrix" } }, + { + "description": "Get the 1 year trailing dividend yield for a given company over time.", + "helpUrl": "https://docs.openbb.co/excel/reference/equity/fundamental/trailing_dividend_yield", + "id": "EQUITY.FUNDAMENTAL.TRAILING_DIVIDEND_YIELD", + "name": "EQUITY.FUNDAMENTAL.TRAILING_DIVIDEND_YIELD", + "parameters": [ + { + "description": "Symbol to get data for.", + "name": "symbol", + "optional": true, + "type": "string" + }, + { + "description": "The number of data entries to return. Default is 252, the number of trading days in a year.", + "name": "limit", + "optional": true, + "type": "number" + }, + { + "description": "Options: tiingo, defaults to tiingo.", + "name": "provider", + "optional": true, + "type": "string" + } + ], + "result": { + "dimensionality": "matrix" + } + }, { "description": "Get earnings call transcripts for a given company.", "helpUrl": "https://docs.openbb.co/excel/reference/equity/fundamental/transcript", @@ -2601,6 +2578,7 @@ { "description": "Year of the earnings call transcript.", "name": "year", + "optional": true, "type": "number" }, { @@ -2608,6 +2586,12 @@ "name": "provider", "optional": true, "type": "string" + }, + { + "description": "Date of the earnings call transcript. (provider: fmp)", + "name": "earnings_date", + "optional": true, + "type": "string" } ], "result": { @@ -2621,7 +2605,7 @@ "name": "EQUITY.MARKET_SNAPSHOTS", "parameters": [ { - "description": "Options: fmp, intrinio, polygon, defaults to fmp.", + "description": "Options: fmp, polygon, defaults to fmp.", "name": "provider", "optional": true, "type": "string" @@ -2631,46 +2615,6 @@ "name": "market", "optional": true, "type": "string" - }, - { - "description": "The date of the data. Can be a datetime or an ISO datetime string. Historical data appears to go back to mid-June 2022. Example: '2024-03-08T12:15:00+0400' (provider: intrinio)", - "name": "date", - "optional": true, - "type": "string" - } - ], - "result": { - "dimensionality": "matrix" - } - }, - { - "description": "The Securities and Exchange Commission's (SEC) Form 13F is a quarterly report\nthat is required to be filed by all institutional investment managers with at least\n$100 million in assets under management.\nManagers are required to file Form 13F within 45 days after the last day of the calendar quarter.\nMost funds wait until the end of this period in order to conceal\ntheir investment strategy from competitors and the public.", - "helpUrl": "https://docs.openbb.co/excel/reference/equity/ownership/form_13f", - "id": "EQUITY.OWNERSHIP.FORM_13F", - "name": "EQUITY.OWNERSHIP.FORM_13F", - "parameters": [ - { - "description": "Symbol to get data for. A CIK or Symbol can be used.", - "name": "symbol", - "type": "string" - }, - { - "description": "A specific date to get data for. The date represents the end of the reporting period. All form 13F-HR filings are based on the calendar year and are reported quarterly. If a date is not supplied, the most recent filing is returned. Submissions beginning 2013-06-30 are supported.", - "name": "date", - "optional": true, - "type": "string" - }, - { - "description": "The number of data entries to return. The number of previous filings to return. The date parameter takes priority over this parameter.", - "name": "limit", - "optional": true, - "type": "number" - }, - { - "description": "Options: sec, defaults to sec.", - "name": "provider", - "optional": true, - "type": "string" } ], "result": { @@ -2747,7 +2691,7 @@ "type": "string" }, { - "description": "Options: fmp, defaults to fmp.", + "description": "Options: fmp, intrinio, defaults to fmp.", "name": "provider", "optional": true, "type": "string" @@ -2763,6 +2707,12 @@ "name": "date", "optional": true, "type": "string" + }, + { + "description": "The number of data entries to return. (provider: intrinio)", + "name": "page_size", + "optional": true, + "type": "number" } ], "result": { @@ -2797,6 +2747,12 @@ "name": "provider", "optional": true, "type": "string" + }, + { + "description": "Number of records to return. (Ignores page if set. Default: None) (provider: fmp)", + "name": "limit", + "optional": true, + "type": "number" } ], "result": { @@ -2832,7 +2788,7 @@ "name": "EQUITY.PRICE.HISTORICAL", "parameters": [ { - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, polygon.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, polygon, tiingo.", "name": "symbol", "type": "string" }, @@ -2855,11 +2811,23 @@ "type": "string" }, { - "description": "Options: fmp, intrinio, polygon, defaults to fmp.", + "description": "Options: fmp, intrinio, polygon, tiingo, defaults to fmp.", "name": "provider", "optional": true, "type": "string" }, + { + "description": "Number of days to look back (Only for interval 1d). (provider: fmp);\nThe number of results to return per page. (provider: intrinio);\nThe number of data entries to return. (provider: polygon)", + "name": "limit", + "optional": true, + "type": "number" + }, + { + "description": "Sort the data in ascending or descending order. (provider: fmp);\nSort order of the data. (provider: polygon)", + "name": "sort", + "optional": true, + "type": "string" + }, { "description": "Return intervals starting at the specified time on the `start_date` formatted as 'HH:MM:SS'. (provider: intrinio)", "name": "start_time", @@ -2885,28 +2853,16 @@ "type": "string" }, { - "description": "The adjustment factor to apply. Default is splits only. (provider: polygon)", - "name": "adjustment", - "optional": true, - "type": "string" - }, - { - "description": "Include Pre and Post market data. (provider: polygon)", - "name": "extended_hours", - "optional": true, - "type": "boolean" - }, - { - "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date. (provider: polygon)", - "name": "sort", - "optional": true, - "type": "string" - }, - { - "description": "The number of data entries to return. (provider: polygon)", - "name": "limit", + "description": "Time to sleep between requests to avoid rate limiting. (provider: intrinio)", + "name": "sleep", "optional": true, "type": "number" + }, + { + "description": "Output time series is adjusted by historical split and dividend events. (provider: polygon)", + "name": "adjusted", + "optional": true, + "type": "boolean" } ], "result": { @@ -2943,25 +2899,25 @@ "type": "string" }, { - "description": "Query by datetime, less than. Either a date with the format 'YYYY-MM-DD' or a TZ-aware timestamp string, 'YYYY-MM-DDTH:M:S.000000000-04:00'. Include all nanoseconds and the 'T' between the day and hour. (provider: polygon)", + "description": "Query by datetime, less than. Either a date with the format YYYY-MM-DD or a TZ-aware timestamp string,\nYYYY-MM-DDTH:M:S.000000000-04:00\". Include all nanoseconds and the 'T' between the day and hour.\n(provider: polygon)", "name": "timestamp_lt", "optional": true, "type": "string" }, { - "description": "Query by datetime, greater than. Either a date with the format 'YYYY-MM-DD' or a TZ-aware timestamp string, 'YYYY-MM-DDTH:M:S.000000000-04:00'. Include all nanoseconds and the 'T' between the day and hour. (provider: polygon)", + "description": "Query by datetime, greater than. Either a date with the format YYYY-MM-DD or a TZ-aware timestamp string,\nYYYY-MM-DDTH:M:S.000000000-04:00\". Include all nanoseconds and the 'T' between the day and hour.\n(provider: polygon)", "name": "timestamp_gt", "optional": true, "type": "string" }, { - "description": "Query by datetime, less than or equal to. Either a date with the format 'YYYY-MM-DD' or a TZ-aware timestamp string, 'YYYY-MM-DDTH:M:S.000000000-04:00'. Include all nanoseconds and the 'T' between the day and hour. (provider: polygon)", + "description": "Query by datetime, less than or equal to.\nEither a date with the format YYYY-MM-DD or a TZ-aware timestamp string,\nYYYY-MM-DDTH:M:S.000000000-04:00\". Include all nanoseconds and the 'T' between the day and hour.\n(provider: polygon)", "name": "timestamp_lte", "optional": true, "type": "string" }, { - "description": "Query by datetime, greater than or equal to. Either a date with the format 'YYYY-MM-DD' or a TZ-aware timestamp string, 'YYYY-MM-DDTH:M:S.000000000-04:00'. Include all nanoseconds and the 'T' between the day and hour. (provider: polygon)", + "description": "Query by datetime, greater than or equal to.\nEither a date with the format YYYY-MM-DD or a TZ-aware timestamp string,\nYYYY-MM-DDTH:M:S.000000000-04:00\". Include all nanoseconds and the 'T' between the day and hour.\n(provider: polygon)", "name": "timestamp_gte", "optional": true, "type": "string" @@ -2978,7 +2934,7 @@ "name": "EQUITY.PRICE.PERFORMANCE", "parameters": [ { - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.", "name": "symbol", "type": "string" }, @@ -3000,7 +2956,7 @@ "name": "EQUITY.PRICE.QUOTE", "parameters": [ { - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio.", + "description": "Symbol to get data for. This endpoint will accept multiple symbols separated by commas. Multiple items allowed for provider(s): fmp, intrinio.", "name": "symbol", "type": "string" }, @@ -3028,7 +2984,7 @@ "name": "EQUITY.PROFILE", "parameters": [ { - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio.", "name": "symbol", "type": "string" }, @@ -3256,7 +3212,7 @@ "name": "ETF.COUNTRIES", "parameters": [ { - "description": "Symbol to get data for. (ETF) Multiple comma separated items allowed for provider(s): fmp.", + "description": "Symbol to get data for. (ETF) Multiple items allowed for provider(s): fmp.", "name": "symbol", "type": "string" }, @@ -3278,7 +3234,7 @@ "name": "ETF.EQUITY_EXPOSURE", "parameters": [ { - "description": "Symbol to get data for. (Stock) Multiple comma separated items allowed for provider(s): fmp.", + "description": "Symbol to get data for. (Stock) Multiple items allowed for provider(s): fmp.", "name": "symbol", "type": "string" }, @@ -3293,94 +3249,6 @@ "dimensionality": "matrix" } }, - { - "description": "ETF Historical Market Price.", - "helpUrl": "https://docs.openbb.co/excel/reference/etf/historical", - "id": "ETF.HISTORICAL", - "name": "ETF.HISTORICAL", - "parameters": [ - { - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, polygon.", - "name": "symbol", - "type": "string" - }, - { - "description": "Time interval of the data to return.", - "name": "interval", - "optional": true, - "type": "string" - }, - { - "description": "Start date of the data, in YYYY-MM-DD format.", - "name": "start_date", - "optional": true, - "type": "string" - }, - { - "description": "End date of the data, in YYYY-MM-DD format.", - "name": "end_date", - "optional": true, - "type": "string" - }, - { - "description": "Options: fmp, intrinio, polygon, defaults to fmp.", - "name": "provider", - "optional": true, - "type": "string" - }, - { - "description": "Return intervals starting at the specified time on the `start_date` formatted as 'HH:MM:SS'. (provider: intrinio)", - "name": "start_time", - "optional": true, - "type": "string" - }, - { - "description": "Return intervals stopping at the specified time on the `end_date` formatted as 'HH:MM:SS'. (provider: intrinio)", - "name": "end_time", - "optional": true, - "type": "string" - }, - { - "description": "Timezone of the data, in the IANA format (Continent/City). (provider: intrinio)", - "name": "timezone", - "optional": true, - "type": "string" - }, - { - "description": "The source of the data. (provider: intrinio)", - "name": "source", - "optional": true, - "type": "string" - }, - { - "description": "The adjustment factor to apply. Default is splits only. (provider: polygon)", - "name": "adjustment", - "optional": true, - "type": "string" - }, - { - "description": "Include Pre and Post market data. (provider: polygon)", - "name": "extended_hours", - "optional": true, - "type": "boolean" - }, - { - "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date. (provider: polygon)", - "name": "sort", - "optional": true, - "type": "string" - }, - { - "description": "The number of data entries to return. (provider: polygon)", - "name": "limit", - "optional": true, - "type": "number" - } - ], - "result": { - "dimensionality": "matrix" - } - }, { "description": "Get the holdings for an individual ETF.", "helpUrl": "https://docs.openbb.co/excel/reference/etf/holdings", @@ -3393,13 +3261,13 @@ "type": "string" }, { - "description": "Options: fmp, intrinio, sec, defaults to fmp.", + "description": "Options: fmp, sec, defaults to fmp.", "name": "provider", "optional": true, "type": "string" }, { - "description": "A specific date to get data for. Entering a date will attempt to return the NPORT-P filing for the entered date. This needs to be _exactly_ the date of the filing. Use the holdings_date command/endpoint to find available filing dates for the ETF. (provider: fmp);\nA specific date to get data for. The date represents the period ending. The date entered will return the closest filing. (provider: sec)", + "description": "A specific date to get data for. Entering a date will attempt to return the NPORT-P filing for the entered date. This needs to be _exactly_ the date of the filing. Use the holdings_date command/endpoint to find available filing dates for the ETF. (provider: fmp);\nA specific date to get data for. The date represents the period ending. The date entered will return the closest filing. (provider: sec)", "name": "date", "optional": true, "type": "string" @@ -3456,7 +3324,7 @@ "name": "ETF.HOLDINGS_PERFORMANCE", "parameters": [ { - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.", "name": "symbol", "type": "string" }, @@ -3478,12 +3346,12 @@ "name": "ETF.INFO", "parameters": [ { - "description": "Symbol to get data for. (ETF) Multiple comma separated items allowed for provider(s): fmp, intrinio.", + "description": "Symbol to get data for. (ETF) Multiple items allowed for provider(s): fmp.", "name": "symbol", "type": "string" }, { - "description": "Options: fmp, intrinio, defaults to fmp.", + "description": "Options: fmp, defaults to fmp.", "name": "provider", "optional": true, "type": "string" @@ -3494,33 +3362,21 @@ } }, { - "description": "Price performance as a return, over different periods.", + "description": "Price performance as a return, over different periods. This is a proxy for `equity.price.performance`.", "helpUrl": "https://docs.openbb.co/excel/reference/etf/price_performance", "id": "ETF.PRICE_PERFORMANCE", "name": "ETF.PRICE_PERFORMANCE", "parameters": [ { - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.", "name": "symbol", "type": "string" }, { - "description": "Options: fmp, intrinio, defaults to fmp.", + "description": "Options: fmp, defaults to fmp.", "name": "provider", "optional": true, "type": "string" - }, - { - "description": "The type of returns to return, a trailing or calendar window. (provider: intrinio)", - "name": "return_type", - "optional": true, - "type": "string" - }, - { - "description": "The adjustment factor, 'splits_only' will return pure price performance. (provider: intrinio)", - "name": "adjustment", - "optional": true, - "type": "string" } ], "result": { @@ -3540,13 +3396,13 @@ "type": "string" }, { - "description": "Options: fmp, intrinio, defaults to fmp.", + "description": "Options: fmp, defaults to fmp.", "name": "provider", "optional": true, "type": "string" }, { - "description": "The exchange code the ETF trades on. (provider: fmp);\nTarget a specific exchange by providing the MIC code. (provider: intrinio)", + "description": "The exchange code the ETF trades on. (provider: fmp)", "name": "exchange", "optional": true, "type": "string" @@ -3779,16 +3635,18 @@ "type": "string" }, { - "description": "Maturities in years. Multiple comma separated items allowed for provider(s): fred.", + "description": "The maturities in years.", + "dimensionality": "matrix", "name": "maturity", "optional": true, "type": "any" }, { - "description": "Rate category. Options: spot_rate, par_yield. Multiple comma separated items allowed for provider(s): fred.", + "description": "The category.", + "dimensionality": "matrix", "name": "category", "optional": true, - "type": "string" + "type": "any" }, { "description": "Options: fred, defaults to fred.", @@ -4342,7 +4200,7 @@ "name": "INDEX.MARKET", "parameters": [ { - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio, polygon.", + "description": "Symbol to get data for.", "name": "symbol", "type": "string" }, @@ -4359,14 +4217,38 @@ "type": "string" }, { - "description": "Time interval of the data to return.", + "description": "Options: fmp, intrinio, polygon, defaults to fmp.", + "name": "provider", + "optional": true, + "type": "string" + }, + { + "description": "Number of days to look back. (provider: fmp)", + "name": "timeseries", + "optional": true, + "type": "number" + }, + { + "description": "Data granularity. (provider: fmp)", "name": "interval", "optional": true, "type": "string" }, { - "description": "Options: fmp, intrinio, polygon, defaults to fmp.", - "name": "provider", + "description": "Sort the data in ascending or descending order. (provider: fmp);\nSort order. (provider: intrinio);\nSort order of the data. (provider: polygon)", + "name": "sort", + "optional": true, + "type": "string" + }, + { + "description": "Index tag. (provider: intrinio)", + "name": "tag", + "optional": true, + "type": "string" + }, + { + "description": "Index type. (provider: intrinio)", + "name": "type", "optional": true, "type": "string" }, @@ -4377,10 +4259,28 @@ "type": "number" }, { - "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date. (provider: polygon)", - "name": "sort", + "description": "Time to sleep between requests to avoid rate limiting. (provider: intrinio)", + "name": "sleep", + "optional": true, + "type": "number" + }, + { + "description": "Timespan of the data. (provider: polygon)", + "name": "timespan", "optional": true, "type": "string" + }, + { + "description": "Whether the data is adjusted. (provider: polygon)", + "name": "adjusted", + "optional": true, + "type": "boolean" + }, + { + "description": "Multiplier of the timespan. (provider: polygon)", + "name": "multiplier", + "optional": true, + "type": "number" } ], "result": { @@ -4394,7 +4294,7 @@ "name": "INDEX.PRICE.HISTORICAL", "parameters": [ { - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio, polygon.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): intrinio, polygon.", "name": "symbol", "type": "string" }, @@ -4416,6 +4316,18 @@ "optional": true, "type": "string" }, + { + "description": "The number of data entries to return.", + "name": "limit", + "optional": true, + "type": "number" + }, + { + "description": "Sort the data in ascending or descending order.", + "name": "sort", + "optional": true, + "type": "string" + }, { "description": "Options: fmp, intrinio, polygon, defaults to fmp.", "name": "provider", @@ -4423,16 +4335,10 @@ "type": "string" }, { - "description": "The number of data entries to return. (provider: intrinio, polygon)", - "name": "limit", + "description": "Number of days to look back. (provider: fmp)", + "name": "timeseries", "optional": true, "type": "number" - }, - { - "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date. (provider: polygon)", - "name": "sort", - "optional": true, - "type": "string" } ], "result": { @@ -4446,7 +4352,7 @@ "name": "NEWS.COMPANY", "parameters": [ { - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): benzinga, fmp, intrinio, polygon.", + "description": "Symbol to get data for. This endpoint will accept multiple symbols separated by commas. Multiple items allowed for provider(s): benzinga, fmp, intrinio, polygon, tiingo.", "name": "symbol", "optional": true, "type": "string" @@ -4470,7 +4376,7 @@ "type": "number" }, { - "description": "Options: benzinga, fmp, intrinio, polygon, defaults to benzinga.", + "description": "Options: benzinga, fmp, intrinio, polygon, tiingo, defaults to benzinga.", "name": "provider", "optional": true, "type": "string" @@ -4552,6 +4458,18 @@ "name": "page", "optional": true, "type": "number" + }, + { + "description": "Page offset, used in conjunction with limit. (provider: tiingo)", + "name": "offset", + "optional": true, + "type": "number" + }, + { + "description": "A comma-separated list of the domains requested. (provider: tiingo)", + "name": "source", + "optional": true, + "type": "string" } ], "result": { @@ -4583,7 +4501,7 @@ "type": "string" }, { - "description": "Options: benzinga, fmp, intrinio, defaults to benzinga.", + "description": "Options: benzinga, fmp, intrinio, tiingo, defaults to benzinga.", "name": "provider", "optional": true, "type": "string" @@ -4659,6 +4577,18 @@ "name": "content_types", "optional": true, "type": "string" + }, + { + "description": "Page offset, used in conjunction with limit. (provider: tiingo)", + "name": "offset", + "optional": true, + "type": "number" + }, + { + "description": "A comma-separated list of the domains requested. (provider: tiingo)", + "name": "source", + "optional": true, + "type": "string" } ], "result": { @@ -4806,6 +4736,7 @@ { "description": "Search query.", "name": "query", + "optional": true, "type": "string" }, { diff --git a/website/content/excel/openapi.json b/website/content/excel/openapi.json index 7185ffd852e..f986aefdd43 100644 --- a/website/content/excel/openapi.json +++ b/website/content/excel/openapi.json @@ -13,7 +13,7 @@ "name": "MIT", "url": "https://github.com/OpenBB-finance/OpenBBTerminal/blob/develop/LICENSE" }, - "version": "4.1.6" + "version": "1" }, "paths": { "/api/v1/crypto/price/historical": { @@ -37,7 +37,8 @@ "schema": { "enum": [ "fmp", - "polygon" + "polygon", + "tiingo" ], "type": "string", "title": "Provider" @@ -49,14 +50,14 @@ "required": true, "schema": { "type": "string", - "description": "Symbol to get data for. Can use CURR1-CURR2 or CURR1CURR2 format. Multiple comma separated items allowed for provider(s): fmp, polygon.", + "description": "Symbol to get data for. Can use CURR1-CURR2 or CURR1CURR2 format. Multiple items allowed for provider(s): fmp, polygon.", "multiple_items_allowed": [ "fmp", "polygon" ], "title": "Symbol" }, - "description": "Symbol to get data for. Can use CURR1-CURR2 or CURR1CURR2 format. Multiple comma separated items allowed for provider(s): fmp, polygon." + "description": "Symbol to get data for. Can use CURR1-CURR2 or CURR1CURR2 format. Multiple items allowed for provider(s): fmp, polygon." }, { "name": "start_date", @@ -96,6 +97,25 @@ }, "description": "End date of the data, in YYYY-MM-DD format." }, + { + "name": "timeseries", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "fmp", + "description": "Number of days to look back. (provider: fmp)" + }, + "description": "Number of days to look back. (provider: fmp)" + }, { "name": "interval", "in": "query", @@ -104,13 +124,13 @@ "anyOf": [ { "enum": [ - "1m", - "5m", - "15m", - "30m", - "1h", - "4h", - "1d" + "1min", + "5min", + "15min", + "30min", + "1hour", + "4hour", + "1day" ], "type": "string" }, @@ -118,11 +138,11 @@ "type": "string" } ], - "title": "fmp,polygon", - "description": "Time interval of the data to return. (provider: fmp);\n Time interval of the data to return. The numeric portion of the interval can be any positive integer. The letter portion can be one of the following: s, m, h, d, W, M, Q, Y (provider: polygon)", - "default": "1d" + "title": "fmp,polygon,tiingo", + "description": "Data granularity. (provider: fmp, polygon, tiingo)", + "default": "1day" }, - "description": "Time interval of the data to return. (provider: fmp);\n Time interval of the data to return. The numeric portion of the interval can be any positive integer. The letter portion can be one of the following: s, m, h, d, W, M, Q, Y (provider: polygon)" + "description": "Data granularity. (provider: fmp, polygon, tiingo)" }, { "name": "sort", @@ -135,10 +155,10 @@ ], "type": "string", "title": "polygon", - "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date. (provider: polygon)", - "default": "asc" + "description": "Sort order of the data. (provider: polygon)", + "default": "desc" }, - "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date. (provider: polygon)" + "description": "Sort order of the data. (provider: polygon)" }, { "name": "limit", @@ -151,6 +171,27 @@ "default": 49999 }, "description": "The number of data entries to return. (provider: polygon)" + }, + { + "name": "exchanges", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "array", + "items": { + "type": "string" + } + }, + { + "type": "null" + } + ], + "title": "tiingo", + "description": "To limit the query to a subset of exchanges e.g. ['POLONIEX', 'GDAX'] (provider: tiingo)" + }, + "description": "To limit the query to a subset of exchanges e.g. ['POLONIEX', 'GDAX'] (provider: tiingo)" } ], "responses": { @@ -200,34 +241,11 @@ }, "model": "CryptoHistorical", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "BTCUSD", - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "parameters": { - "symbol": "BTCUSD", - "start_date": "2024-01-01", - "end_date": "2024-01-31", - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "parameters": { - "symbol": "BTCUSD,ETHUSD", - "start_date": "2024-01-01", - "end_date": "2024-01-31", - "provider": "polygon" - }, - "provider": "polygon" - } + "obb.crypto.price.historical(symbol=\"BTCUSD\")", + "obb.crypto.price.historical(\"BTCUSD\", start_date=\"2024-01-01\", end_date=\"2024-01-31\")", + "obb.crypto.price.historical(\"ETH-USD\", provider=\"yfinance\", interval=\"1mo\", start_date=\"2024-01-01\", end_date=\"2024-12-31\")", + "obb.crypto.price.historical(\"BTCUSD,ETH-USD\", provider=\"yfinance\", interval=\"1d\", start_date=\"2024-01-01\", end_date=\"2024-01-31\")", + "obb.crypto.price.historical([\"BTCUSD\", \"ETH-USD\"], start_date=\"2024-01-01\", end_date=\"2024-01-31\")" ] } }, @@ -250,11 +268,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -325,21 +339,9 @@ }, "model": "CryptoSearch", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "parameters": { - "query": "BTCUSD", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.crypto.search()", + "obb.crypto.search(\"BTCUSD\")", + "obb.crypto.search(\"ETH-USD\")" ] } }, @@ -364,7 +366,8 @@ "schema": { "enum": [ "fmp", - "polygon" + "polygon", + "tiingo" ], "type": "string", "title": "Provider" @@ -376,14 +379,13 @@ "required": true, "schema": { "type": "string", - "description": "Symbol to get data for. Can use CURR1-CURR2 or CURR1CURR2 format. Multiple comma separated items allowed for provider(s): fmp, polygon.", + "description": "Symbol to get data for. Can use CURR1-CURR2 or CURR1CURR2 format. Multiple items allowed for provider(s): polygon.", "multiple_items_allowed": [ - "fmp", "polygon" ], "title": "Symbol" }, - "description": "Symbol to get data for. Can use CURR1-CURR2 or CURR1CURR2 format. Multiple comma separated items allowed for provider(s): fmp, polygon." + "description": "Symbol to get data for. Can use CURR1-CURR2 or CURR1CURR2 format. Multiple items allowed for provider(s): polygon." }, { "name": "start_date", @@ -431,13 +433,13 @@ "anyOf": [ { "enum": [ - "1m", - "5m", - "15m", - "30m", - "1h", - "4h", - "1d" + "1min", + "5min", + "15min", + "30min", + "1hour", + "4hour", + "1day" ], "type": "string" }, @@ -445,11 +447,11 @@ "type": "string" } ], - "title": "fmp,polygon", - "description": "Time interval of the data to return. (provider: fmp);\n Time interval of the data to return. The numeric portion of the interval can be any positive integer. The letter portion can be one of the following: s, m, h, d, W, M, Q, Y (provider: polygon)", - "default": "1d" + "title": "fmp,polygon,tiingo", + "description": "Data granularity. (provider: fmp, polygon, tiingo)", + "default": "1day" }, - "description": "Time interval of the data to return. (provider: fmp);\n Time interval of the data to return. The numeric portion of the interval can be any positive integer. The letter portion can be one of the following: s, m, h, d, W, M, Q, Y (provider: polygon)" + "description": "Data granularity. (provider: fmp, polygon, tiingo)" }, { "name": "sort", @@ -462,10 +464,10 @@ ], "type": "string", "title": "polygon", - "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date. (provider: polygon)", - "default": "asc" + "description": "Sort order of the data. (provider: polygon)", + "default": "desc" }, - "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date. (provider: polygon)" + "description": "Sort order of the data. (provider: polygon)" }, { "name": "limit", @@ -527,35 +529,11 @@ }, "model": "CurrencyHistorical", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "EURUSD", - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "description": "Filter historical data with specific start and end date.", - "parameters": { - "symbol": "EURUSD", - "start_date": "2023-01-01", - "end_date": "2023-12-31", - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "description": "Get data with different granularity.", - "parameters": { - "symbol": "EURUSD", - "provider": "polygon", - "interval": "15m" - }, - "provider": "polygon" - } + "obb.currency.price.historical(symbol=\"EURUSD\")", + "# Filter historical data with specific start and end date.", + "obb.currency.price.historical(symbol='EURUSD', start_date='2023-01-01', end_date='20213-12-31')", + "# Get data with different granularity.", + "obb.currency.price.historical(symbol='EURUSD', interval='15m', provider='polygon')" ] } }, @@ -784,41 +762,13 @@ }, "model": "CurrencyPairs", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "intrinio" - }, - "provider": "intrinio" - }, - { - "scope": "api", - "description": "Search for 'EURUSD' currency pair using 'intrinio' as provider.", - "parameters": { - "provider": "intrinio", - "symbol": "EURUSD" - }, - "provider": "intrinio" - }, - { - "scope": "api", - "description": "Search for actively traded currency pairs on the queried date using 'polygon' as provider.", - "parameters": { - "provider": "polygon", - "date": "2024-01-02", - "active": 1.0 - }, - "provider": "polygon" - }, - { - "scope": "api", - "description": "Search for terms using 'polygon' as provider.", - "parameters": { - "provider": "polygon", - "search": "Euro zone" - }, - "provider": "polygon" - } + "obb.currency.search()", + "# Search for 'EURUSD' currency pair using 'polygon' as provider.", + "obb.currency.search(provider='polygon', symbol='EURUSD')", + "# Search for terms using 'polygon' as provider.", + "obb.currency.search(provider='polygon', search='Euro zone')", + "# Search for actively traded currency pairs on the queried date using 'polygon' as provider.", + "obb.currency.search(provider='polygon', date='2024-01-02', active=True)" ] } }, @@ -841,11 +791,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "ecb" - ], "const": "ecb", - "type": "string", "default": "ecb", "title": "Provider" } @@ -898,165 +844,7 @@ }, "model": "CurrencyReferenceRates", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "ecb" - }, - "provider": "ecb" - } - ] - } - }, - "/api/v1/currency/snapshots": { - "get": { - "tags": [ - "currency" - ], - "summary": "Snapshots", - "description": "Snapshots of currency exchange rates from an indirect or direct perspective of a base currency.", - "operationId": "currency_snapshots", - "security": [ - { - "OAuth2PasswordBearer": [] - } - ], - "parameters": [ - { - "name": "provider", - "in": "query", - "required": false, - "schema": { - "enum": [ - "fmp" - ], - "const": "fmp", - "type": "string", - "default": "fmp", - "title": "Provider" - } - }, - { - "name": "base", - "in": "query", - "required": false, - "schema": { - "type": "string", - "description": "The base currency symbol. Multiple comma separated items allowed for provider(s): fmp.", - "multiple_items_allowed": [ - "fmp" - ], - "default": "usd", - "title": "Base" - }, - "description": "The base currency symbol. Multiple comma separated items allowed for provider(s): fmp." - }, - { - "name": "quote_type", - "in": "query", - "required": false, - "schema": { - "enum": [ - "direct", - "indirect" - ], - "type": "string", - "description": "Whether the quote is direct or indirect. Selecting 'direct' will return the exchange rate as the amount of domestic currency required to buy one unit of the foreign currency. Selecting 'indirect' (default) will return the exchange rate as the amount of foreign currency required to buy one unit of the domestic currency.", - "default": "indirect", - "title": "Quote Type" - }, - "description": "Whether the quote is direct or indirect. Selecting 'direct' will return the exchange rate as the amount of domestic currency required to buy one unit of the foreign currency. Selecting 'indirect' (default) will return the exchange rate as the amount of foreign currency required to buy one unit of the domestic currency." - }, - { - "name": "counter_currencies", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "array", - "items": { - "type": "string" - } - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "An optional list of counter currency symbols to filter for. None returns all.", - "title": "Counter Currencies" - }, - "description": "An optional list of counter currency symbols to filter for. None returns all." - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OBBject_CurrencySnapshots" - } - } - } - }, - "404": { - "description": "Not found" - }, - "400": { - "description": "No Results Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OpenBBErrorResponse" - } - } - } - }, - "500": { - "description": "Internal Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OpenBBErrorResponse" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - }, - "model": "CurrencySnapshots", - "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "description": "Get exchange rates from USD and XAU to EUR, JPY, and GBP using 'fmp' as provider.", - "parameters": { - "provider": "fmp", - "base": "USD,XAU", - "counter_currencies": "EUR,JPY,GBP", - "quote_type": "indirect" - }, - "provider": "fmp" - } + "obb.currency.reference_rates()" ] } }, @@ -1079,11 +867,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "intrinio" - ], "const": "intrinio", - "type": "string", "default": "intrinio", "title": "Provider" } @@ -1166,24 +950,9 @@ }, "model": "OptionsChains", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "intrinio" - }, - "provider": "intrinio" - }, - { - "scope": "api", - "description": "Use the \"date\" parameter to get the end-of-day-data for a specific date, where supported.", - "parameters": { - "symbol": "AAPL", - "date": "2023-01-25", - "provider": "intrinio" - }, - "provider": "intrinio" - } + "chains = obb.derivatives.options.chains(symbol=\"AAPL\", provider=\"intrinio\").to_df()", + "#### Use the \"date\" parameter to get the end-of-day-data for a specific date, where supported. ####", + "eod_chains = obb.derivatives.options.chains(symbol=\"AAPL\", date=\"2023-01-25\", provider=\"intrinio\").to_df()" ] } }, @@ -1206,11 +975,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "intrinio" - ], "const": "intrinio", - "type": "string", "default": "intrinio", "title": "Provider" } @@ -1233,144 +998,6 @@ }, "description": "Symbol to get data for. (the underlying symbol)" }, - { - "name": "start_date", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string", - "format": "date" - }, - { - "type": "null" - } - ], - "title": "intrinio", - "description": "Start date of the data, in YYYY-MM-DD format. If no symbol is supplied, requests are only allowed for a single date. Use the start_date for the target date. Intrinio appears to have data beginning Feb/2022, but is unclear when it actually began. (provider: intrinio)" - }, - "description": "Start date of the data, in YYYY-MM-DD format. If no symbol is supplied, requests are only allowed for a single date. Use the start_date for the target date. Intrinio appears to have data beginning Feb/2022, but is unclear when it actually began. (provider: intrinio)" - }, - { - "name": "end_date", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string", - "format": "date" - }, - { - "type": "null" - } - ], - "title": "intrinio", - "description": "End date of the data, in YYYY-MM-DD format. If a symbol is not supplied, do not include an end date. (provider: intrinio)" - }, - "description": "End date of the data, in YYYY-MM-DD format. If a symbol is not supplied, do not include an end date. (provider: intrinio)" - }, - { - "name": "trade_type", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "enum": [ - "block", - "sweep", - "large" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "title": "intrinio", - "description": "The type of unusual activity to query for. (provider: intrinio)" - }, - "description": "The type of unusual activity to query for. (provider: intrinio)" - }, - { - "name": "sentiment", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "enum": [ - "bullish", - "bearish", - "neutral" - ], - "type": "string" - }, - { - "type": "null" - } - ], - "title": "intrinio", - "description": "The sentiment type to query for. (provider: intrinio)" - }, - "description": "The sentiment type to query for. (provider: intrinio)" - }, - { - "name": "min_value", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "intrinio", - "description": "The inclusive minimum total value for the unusual activity. (provider: intrinio)" - }, - "description": "The inclusive minimum total value for the unusual activity. (provider: intrinio)" - }, - { - "name": "max_value", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "intrinio", - "description": "The inclusive maximum total value for the unusual activity. (provider: intrinio)" - }, - "description": "The inclusive maximum total value for the unusual activity. (provider: intrinio)" - }, - { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "title": "intrinio", - "description": "The number of data entries to return. A typical day for all symbols will yield 50-80K records. The API will paginate at 1000 records. The high default limit (100K) is to be able to reliably capture the most days. The high absolute limit (1.25M) is to allow for outlier days. Queries at the absolute limit will take a long time, and might be unreliable. Apply filters to improve performance. (provider: intrinio)", - "default": 100000 - }, - "description": "The number of data entries to return. A typical day for all symbols will yield 50-80K records. The API will paginate at 1000 records. The high default limit (100K) is to be able to reliably capture the most days. The high absolute limit (1.25M) is to allow for outlier days. Queries at the absolute limit will take a long time, and might be unreliable. Apply filters to improve performance. (provider: intrinio)" - }, { "name": "source", "in": "query", @@ -1435,22 +1062,9 @@ }, "model": "OptionsUnusual", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "intrinio" - }, - "provider": "intrinio" - }, - { - "scope": "api", - "description": "Use the 'symbol' parameter to get the most recent activity for a specific symbol.", - "parameters": { - "symbol": "TSLA", - "provider": "intrinio" - }, - "provider": "intrinio" - } + "options = obb.derivatives.options.unusual().to_df()", + "#### Use the \"symbol\" parameter to get the most recent activity for a specific symbol. ####", + "options = obb.derivatives.options.unusual(symbol=\"TSLA\").to_df()" ] } }, @@ -1473,11 +1087,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "oecd" - ], "const": "oecd", - "type": "string", "default": "oecd", "title": "Provider" } @@ -1668,22 +1278,7 @@ }, "model": "GdpForecast", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "oecd" - }, - "provider": "oecd" - }, - { - "scope": "api", - "parameters": { - "period": "annual", - "type": "real", - "provider": "oecd" - }, - "provider": "oecd" - } + "obb.economy.gdp.forecast(period=\"annual\", type=\"real\")" ] } }, @@ -1706,11 +1301,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "oecd" - ], "const": "oecd", - "type": "string", "default": "oecd", "title": "Provider" } @@ -1818,8 +1409,7 @@ "switzerland", "turkey", "united_kingdom", - "united_states", - "all" + "united_states" ], "type": "string", "title": "oecd", @@ -1876,21 +1466,7 @@ }, "model": "GdpNominal", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "oecd" - }, - "provider": "oecd" - }, - { - "scope": "api", - "parameters": { - "units": "usd", - "provider": "oecd" - }, - "provider": "oecd" - } + "obb.economy.gdp.nominal(units=\"usd\")" ] } }, @@ -1913,11 +1489,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "oecd" - ], "const": "oecd", - "type": "string", "default": "oecd", "title": "Provider" } @@ -2037,8 +1609,7 @@ "switzerland", "turkey", "united_kingdom", - "united_states", - "all" + "united_states" ], "type": "string", "title": "oecd", @@ -2095,21 +1666,7 @@ }, "model": "GdpReal", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "oecd" - }, - "provider": "oecd" - }, - { - "scope": "api", - "parameters": { - "units": "yoy", - "provider": "oecd" - }, - "provider": "oecd" - } + "obb.economy.gdp.real(units=\"yoy\")" ] } }, @@ -2192,12 +1749,12 @@ } ], "title": "tradingeconomics", - "description": "Country of the event. Multiple comma separated items allowed. (provider: tradingeconomics)", + "description": "Country of the event. Multiple items allowed. (provider: tradingeconomics)", "multiple_items_allowed": [ "tradingeconomics" ] }, - "description": "Country of the event. Multiple comma separated items allowed. (provider: tradingeconomics)" + "description": "Country of the event. Multiple items allowed. (provider: tradingeconomics)" }, { "name": "importance", @@ -2303,23 +1860,9 @@ }, "model": "EconomicCalendar", "examples": [ - { - "scope": "api", - "description": "By default, the calendar will be forward-looking.", - "parameters": { - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "parameters": { - "provider": "fmp", - "start_date": "2020-03-01", - "end_date": "2020-03-31" - }, - "provider": "fmp" - } + "obb.economy.calendar(provider=\"fmp\", start_date=\"2020-03-01\", end_date=\"2020-03-31\")", + "#### By default, the calendar will be forward-looking. ####", + "obb.economy.calendar(provider=\"nasdaq\")" ] } }, @@ -2342,11 +1885,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fred" - ], "const": "fred", - "type": "string", "default": "fred", "title": "Provider" } @@ -2357,64 +1896,13 @@ "required": true, "schema": { "type": "string", - "description": "The country to get data. Multiple comma separated items allowed for provider(s): fred.", - "choices": [ - "australia", - "austria", - "belgium", - "brazil", - "bulgaria", - "canada", - "chile", - "china", - "croatia", - "cyprus", - "czech_republic", - "denmark", - "estonia", - "euro_area", - "finland", - "france", - "germany", - "greece", - "hungary", - "iceland", - "india", - "indonesia", - "ireland", - "israel", - "italy", - "japan", - "korea", - "latvia", - "lithuania", - "luxembourg", - "malta", - "mexico", - "netherlands", - "new_zealand", - "norway", - "poland", - "portugal", - "romania", - "russian_federation", - "slovak_republic", - "slovakia", - "slovenia", - "south_africa", - "spain", - "sweden", - "switzerland", - "turkey", - "united_kingdom", - "united_states" - ], + "description": "The country to get data. Multiple items allowed for provider(s): fred.", "multiple_items_allowed": [ "fred" ], "title": "Country" }, - "description": "The country to get data. Multiple comma separated items allowed for provider(s): fred." + "description": "The country to get data. Multiple items allowed for provider(s): fred." }, { "name": "units", @@ -2548,24 +2036,9 @@ }, "model": "ConsumerPriceIndex", "examples": [ - { - "scope": "api", - "parameters": { - "country": "japan,china,turkey", - "provider": "fred" - }, - "provider": "fred" - }, - { - "scope": "api", - "description": "Use the `units` parameter to define the reference period for the change in values.", - "parameters": { - "country": "united_states,united_kingdom", - "units": "growth_previous", - "provider": "fred" - }, - "provider": "fred" - } + "obb.economy.cpi(countries=[\"japan\", \"china\", \"turkey\"]).to_df()", + "#### Use the `units` parameter to define the reference period for the change in values. ####", + "obb.economy.cpi(countries=[\"united_states\", \"united_kingdom\"], units=\"growth_previous\").to_df()" ] } }, @@ -2588,11 +2061,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -2645,13 +2114,7 @@ }, "model": "RiskPremium", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.economy.risk_premium().to_df()" ] } }, @@ -2674,11 +2137,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "ecb" - ], "const": "ecb", - "type": "string", "default": "ecb", "title": "Provider" } @@ -2793,30 +2252,9 @@ }, "model": "BalanceOfPayments", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "ecb" - }, - "provider": "ecb" - }, - { - "scope": "api", - "parameters": { - "report_type": "summary", - "provider": "ecb" - }, - "provider": "ecb" - }, - { - "scope": "api", - "description": "The `country` parameter will override the `report_type`.", - "parameters": { - "country": "united_states", - "provider": "ecb" - }, - "provider": "ecb" - } + "obb.economy.balance_of_payments(report_type=\"summary\").to_df().set_index(\"period\").T", + "#### The `country` parameter will override the `report_type`. ####", + "obb.economy.balance_of_payments(country=\"united_states\", provider=\"ecb\").to_df().set_index(\"period\").T" ] } }, @@ -2839,11 +2277,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fred" - ], "const": "fred", - "type": "string", "default": "fred", "title": "Provider" } @@ -3080,13 +2514,7 @@ }, "model": "FredSearch", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fred" - }, - "provider": "fred" - } + "obb.economy.fred_search()" ] } }, @@ -3123,13 +2551,13 @@ "required": true, "schema": { "type": "string", - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fred.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fred.", "multiple_items_allowed": [ "fred" ], "title": "Symbol" }, - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fred." + "description": "Symbol to get data for. Multiple items allowed for provider(s): fred." }, { "name": "start_date", @@ -3339,33 +2767,11 @@ }, "model": "FredSeries", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "NFCI", - "provider": "fred" - }, - "provider": "fred" - }, - { - "scope": "api", - "description": "Multiple series can be passed in as a list.", - "parameters": { - "symbol": "NFCI,STLFSI4", - "provider": "fred" - }, - "provider": "fred" - }, - { - "scope": "api", - "description": "Use the `transform` parameter to transform the data as change, log, or percent change.", - "parameters": { - "symbol": "CBBTCUSD", - "transform": "pc1", - "provider": "fred" - }, - "provider": "fred" - } + "obb.economy.fred_series(\"NFCI\").to_df()", + "#### Multiple series can be passed in as a list. ####", + "obb.economy.fred_series([\"NFCI\",\"STLFSI4\"]).to_df()", + "#### Use the `transform` parameter to transform the data as change, log, or percent change. ####", + "obb.economy.fred_series(\"CBBTCUSD\", transform=\"pc1\").to_df()" ] } }, @@ -3388,11 +2794,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "federal_reserve" - ], "const": "federal_reserve", - "type": "string", "default": "federal_reserve", "title": "Provider" } @@ -3502,21 +2904,7 @@ }, "model": "MoneyMeasures", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "federal_reserve" - }, - "provider": "federal_reserve" - }, - { - "scope": "api", - "parameters": { - "adjusted": 0.0, - "provider": "federal_reserve" - }, - "provider": "federal_reserve" - } + "obb.economy.money_measures(adjusted=False).to_df()" ] } }, @@ -3539,11 +2927,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "oecd" - ], "const": "oecd", - "type": "string", "default": "oecd", "title": "Provider" } @@ -3760,33 +3144,11 @@ }, "model": "Unemployment", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "oecd" - }, - "provider": "oecd" - }, - { - "scope": "api", - "parameters": { - "country": "all", - "frequency": "quarterly", - "provider": "oecd" - }, - "provider": "oecd" - }, - { - "scope": "api", - "description": "Demographics for the statistics are selected with the `age` parameter.", - "parameters": { - "country": "all", - "frequency": "quarterly", - "age": "25-54", - "provider": "oecd" - }, - "provider": "oecd" - } + "obb.economy.unemployment(country=\"all\", frequency=\"quarterly\")", + "#### Demographics for the statistics are selected with the `age` and `sex` parameters. ####", + "obb.economy.unemployment(", + "country=\"all\", frequency=\"quarterly\", age=\"25-54\"", + ").to_df().pivot(columns=\"country\", values=\"value\")" ] } }, @@ -3809,11 +3171,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "oecd" - ], "const": "oecd", - "type": "string", "default": "oecd", "title": "Provider" } @@ -3938,21 +3296,7 @@ }, "model": "CLI", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "oecd" - }, - "provider": "oecd" - }, - { - "scope": "api", - "parameters": { - "country": "all", - "provider": "oecd" - }, - "provider": "oecd" - } + "obb.economy.composite_leading_indicator(country=\"all\").to_df()" ] } }, @@ -3975,11 +3319,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "oecd" - ], "const": "oecd", - "type": "string", "default": "oecd", "title": "Provider" } @@ -4147,22 +3487,7 @@ }, "model": "STIR", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "oecd" - }, - "provider": "oecd" - }, - { - "scope": "api", - "parameters": { - "country": "all", - "frequency": "quarterly", - "provider": "oecd" - }, - "provider": "oecd" - } + "obb.economy.short_term_interest_rate(country=\"all\", frequency=\"quarterly\").to_df()" ] } }, @@ -4185,11 +3510,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "oecd" - ], "const": "oecd", - "type": "string", "default": "oecd", "title": "Provider" } @@ -4357,22 +3678,7 @@ }, "model": "LTIR", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "oecd" - }, - "provider": "oecd" - }, - { - "scope": "api", - "parameters": { - "country": "all", - "frequency": "quarterly", - "provider": "oecd" - }, - "provider": "oecd" - } + "obb.economy.long_term_interest_rate(country=\"all\", frequency=\"quarterly\").to_df()" ] } }, @@ -4395,11 +3701,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fred" - ], "const": "fred", - "type": "string", "default": "fred", "title": "Provider" } @@ -4410,10 +3712,13 @@ "required": true, "schema": { "type": "string", - "description": "Symbol to get data for.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fred.", + "multiple_items_allowed": [ + "fred" + ], "title": "Symbol" }, - "description": "Symbol to get data for." + "description": "Symbol to get data for. Multiple items allowed for provider(s): fred." }, { "name": "start_date", @@ -4678,26 +3983,10 @@ }, "model": "FredRegional", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "NYICLAIMS", - "provider": "fred" - }, - "provider": "fred" - }, - { - "scope": "api", - "description": "With a date, time series data is returned.", - "parameters": { - "symbol": "NYICLAIMS", - "start_date": "2021-01-01", - "end_date": "2021-12-31", - "limit": 10, - "provider": "fred" - }, - "provider": "fred" - } + "#### With no date, the most recent report is returned. ####", + "obb.economy.fred_regional(\"NYICLAIMS\")", + "#### With a date, time series data is returned. ####", + "obb.economy.fred_regional(\"NYICLAIMS\", start_date=\"2021-01-01\")" ] } }, @@ -4720,11 +4009,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "intrinio" - ], "const": "intrinio", - "type": "string", "default": "intrinio", "title": "Provider" } @@ -4911,21 +4196,11 @@ }, "model": "CalendarIpo", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "intrinio" - }, - "provider": "intrinio" - }, - { - "scope": "api", - "description": "Get all IPOs available.", - "parameters": { - "provider": "intrinio" - }, - "provider": "intrinio" - } + "obb.equity.calendar.ipo(limit=100)", + "# Get all IPOs available.", + "obb.equity.calendar.ipo()", + "# Get IPOs for specific dates.", + "obb.equity.calendar.ipo(start_date='2024-02-01', end_date='2024-02-07')" ] } }, @@ -4948,11 +4223,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -5043,13 +4314,9 @@ }, "model": "CalendarDividend", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.calendar.dividend()", + "# Get dividend calendar for specific dates.", + "obb.equity.calendar.dividend(start_date='2024-02-01', end_date='2024-02-07')" ] } }, @@ -5072,11 +4339,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -5167,23 +4430,9 @@ }, "model": "CalendarSplits", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "description": "Get stock splits calendar for specific dates.", - "parameters": { - "start_date": "2024-02-01", - "end_date": "2024-02-07", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.calendar.splits()", + "# Get stock splits calendar for specific dates.", + "obb.equity.calendar.splits(start_date='2024-02-01', end_date='2024-02-07')" ] } }, @@ -5206,11 +4455,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -5301,23 +4546,9 @@ }, "model": "CalendarEarnings", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "description": "Get earnings calendar for specific dates.", - "parameters": { - "start_date": "2024-02-01", - "end_date": "2024-02-07", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.calendar.earnings()", + "# Get earnings calendar for specific dates.", + "obb.equity.calendar.earnings(start_date='2024-02-01', end_date='2024-02-07')" ] } }, @@ -5340,11 +4571,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -5408,14 +4635,7 @@ }, "model": "EquityPeers", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.compare.peers(symbol=\"AAPL\")" ] } }, @@ -5459,14 +4679,13 @@ "type": "null" } ], - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): benzinga, fmp.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): benzinga.", "multiple_items_allowed": [ - "benzinga", - "fmp" + "benzinga" ], "title": "Symbol" }, - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): benzinga, fmp." + "description": "Symbol to get data for. Multiple items allowed for provider(s): benzinga." }, { "name": "limit", @@ -5633,26 +4852,26 @@ "required": false, "schema": { "anyOf": [ + { + "type": "string" + }, { "type": "array", "items": { "type": "string" } }, - { - "type": "string" - }, { "type": "null" } ], "title": "benzinga", - "description": "Comma-separated list of analyst (person) IDs. Omitting will bring back all available analysts. Multiple comma separated items allowed. (provider: benzinga)", + "description": "Comma-separated list of analyst (person) IDs. Omitting will bring back all available analysts. Multiple items allowed. (provider: benzinga)", "multiple_items_allowed": [ "benzinga" ] }, - "description": "Comma-separated list of analyst (person) IDs. Omitting will bring back all available analysts. Multiple comma separated items allowed. (provider: benzinga)" + "description": "Comma-separated list of analyst (person) IDs. Omitting will bring back all available analysts. Multiple items allowed. (provider: benzinga)" }, { "name": "firm_ids", @@ -5660,26 +4879,26 @@ "required": false, "schema": { "anyOf": [ + { + "type": "string" + }, { "type": "array", "items": { "type": "string" } }, - { - "type": "string" - }, { "type": "null" } ], "title": "benzinga", - "description": "Comma-separated list of firm IDs. Multiple comma separated items allowed. (provider: benzinga)", + "description": "Comma-separated list of firm IDs. Multiple items allowed. (provider: benzinga)", "multiple_items_allowed": [ "benzinga" ] }, - "description": "Comma-separated list of firm IDs. Multiple comma separated items allowed. (provider: benzinga)" + "description": "Comma-separated list of firm IDs. Multiple items allowed. (provider: benzinga)" }, { "name": "fields", @@ -5687,26 +4906,26 @@ "required": false, "schema": { "anyOf": [ + { + "type": "string" + }, { "type": "array", "items": { "type": "string" } }, - { - "type": "string" - }, { "type": "null" } ], "title": "benzinga", - "description": "Comma-separated list of fields to include in the response. See https://docs.benzinga.io/benzinga-apis/calendar/get-ratings to learn about the available fields. Multiple comma separated items allowed. (provider: benzinga)", + "description": "Comma-separated list of fields to include in the response. See https://docs.benzinga.io/benzinga-apis/calendar/get-ratings to learn about the available fields. Multiple items allowed. (provider: benzinga)", "multiple_items_allowed": [ "benzinga" ] }, - "description": "Comma-separated list of fields to include in the response. See https://docs.benzinga.io/benzinga-apis/calendar/get-ratings to learn about the available fields. Multiple comma separated items allowed. (provider: benzinga)" + "description": "Comma-separated list of fields to include in the response. See https://docs.benzinga.io/benzinga-apis/calendar/get-ratings to learn about the available fields. Multiple items allowed. (provider: benzinga)" }, { "name": "with_grade", @@ -5768,26 +4987,7 @@ }, "model": "PriceTarget", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "benzinga" - }, - "provider": "benzinga" - }, - { - "scope": "api", - "description": "Get price targets for Microsoft using 'benzinga' as provider.", - "parameters": { - "start_date": "2020-01-01", - "end_date": "2024-02-16", - "limit": 10, - "symbol": "msft", - "provider": "benzinga", - "action": "downgrades" - }, - "provider": "benzinga" - } + "obb.equity.estimates.price_target(start_date=\"2020-01-01\", end_date=\"2024-02-16\",limit=10, symbol=\"msft\", provider=\"benzinga\",action=\"downgrades\").to_df()" ] } }, @@ -5810,11 +5010,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -5825,13 +5021,10 @@ "required": true, "schema": { "type": "string", - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp.", - "multiple_items_allowed": [ - "fmp" - ], + "description": "Symbol to get data for.", "title": "Symbol" }, - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp." + "description": "Symbol to get data for." }, { "name": "period", @@ -5843,29 +5036,23 @@ "annual" ], "type": "string", - "title": "fmp", - "description": "Time period of the data to return. (provider: fmp)", - "default": "annual" + "description": "Time period of the data to return.", + "default": "annual", + "title": "Period" }, - "description": "Time period of the data to return. (provider: fmp)" + "description": "Time period of the data to return." }, { "name": "limit", "in": "query", "required": false, "schema": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "fmp", - "description": "The number of data entries to return. (provider: fmp)" + "type": "integer", + "description": "The number of data entries to return.", + "default": 30, + "title": "Limit" }, - "description": "The number of data entries to return. (provider: fmp)" + "description": "The number of data entries to return." } ], "responses": { @@ -5915,14 +5102,7 @@ }, "model": "AnalystEstimates", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.estimates.historical(\"AAPL\", period=\"quarter\", provider=\"fmp\").to_df()" ] } }, @@ -5945,11 +5125,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -5960,13 +5136,10 @@ "required": true, "schema": { "type": "string", - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp.", - "multiple_items_allowed": [ - "fmp" - ], + "description": "Symbol to get data for.", "title": "Symbol" }, - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp." + "description": "Symbol to get data for." } ], "responses": { @@ -6016,14 +5189,7 @@ }, "model": "PriceTargetConsensus", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.estimates.consensus(\"AAPL,MSFT\", provider=\"yfinance\").to_df()" ] } }, @@ -6046,11 +5212,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "benzinga" - ], "const": "benzinga", - "type": "string", "default": "benzinga", "title": "Provider" } @@ -6068,13 +5230,10 @@ "type": "null" } ], - "description": "Analyst names to return. Omitting will return all available analysts. Multiple comma separated items allowed for provider(s): benzinga.", - "multiple_items_allowed": [ - "benzinga" - ], + "description": "A comma separated list of analyst names to bring back. Omitting will bring back all available analysts.", "title": "Analyst Name" }, - "description": "Analyst names to return. Omitting will return all available analysts. Multiple comma separated items allowed for provider(s): benzinga." + "description": "A comma separated list of analyst names to bring back. Omitting will bring back all available analysts." }, { "name": "firm_name", @@ -6089,13 +5248,10 @@ "type": "null" } ], - "description": "Firm names to return. Omitting will return all available firms. Multiple comma separated items allowed for provider(s): benzinga.", - "multiple_items_allowed": [ - "benzinga" - ], + "description": "A comma separated list of firm names to bring back. Omitting will bring back all available firms.", "title": "Firm Name" }, - "description": "Firm names to return. Omitting will return all available firms. Multiple comma separated items allowed for provider(s): benzinga." + "description": "A comma separated list of firm names to bring back. Omitting will bring back all available firms." }, { "name": "analyst_ids", @@ -6106,17 +5262,20 @@ { "type": "string" }, + { + "type": "array", + "items": { + "type": "string" + } + }, { "type": "null" } ], "title": "benzinga", - "description": "List of analyst IDs to return. Multiple comma separated items allowed. (provider: benzinga)", - "multiple_items_allowed": [ - "benzinga" - ] + "description": "A comma separated list of analyst IDs to bring back. (provider: benzinga)" }, - "description": "List of analyst IDs to return. Multiple comma separated items allowed. (provider: benzinga)" + "description": "A comma separated list of analyst IDs to bring back. (provider: benzinga)" }, { "name": "firm_ids", @@ -6127,17 +5286,20 @@ { "type": "string" }, + { + "type": "array", + "items": { + "type": "string" + } + }, { "type": "null" } ], "title": "benzinga", - "description": "Firm IDs to return. Multiple comma separated items allowed. (provider: benzinga)", - "multiple_items_allowed": [ - "benzinga" - ] + "description": "A comma separated list of firm IDs to bring back. (provider: benzinga)" }, - "description": "Firm IDs to return. Multiple comma separated items allowed. (provider: benzinga)" + "description": "A comma separated list of firm IDs to bring back. (provider: benzinga)" }, { "name": "limit", @@ -6186,17 +5348,20 @@ { "type": "string" }, + { + "type": "array", + "items": { + "type": "string" + } + }, { "type": "null" } ], "title": "benzinga", - "description": "Fields to include in the response. See https://docs.benzinga.io/benzinga-apis/calendar/get-ratings to learn about the available fields. Multiple comma separated items allowed. (provider: benzinga)", - "multiple_items_allowed": [ - "benzinga" - ] + "description": "Comma-separated list of fields to include in the response. See https://docs.benzinga.io/benzinga-apis/calendar/get-ratings to learn about the available fields. (provider: benzinga)" }, - "description": "Fields to include in the response. See https://docs.benzinga.io/benzinga-apis/calendar/get-ratings to learn about the available fields. Multiple comma separated items allowed. (provider: benzinga)" + "description": "Comma-separated list of fields to include in the response. See https://docs.benzinga.io/benzinga-apis/calendar/get-ratings to learn about the available fields. (provider: benzinga)" } ], "responses": { @@ -6246,21 +5411,7 @@ }, "model": "AnalystSearch", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "benzinga" - }, - "provider": "benzinga" - }, - { - "scope": "api", - "parameters": { - "firm_name": "Wedbush", - "provider": "benzinga" - }, - "provider": "benzinga" - } + "obb.equity.estimates.analyst_search(firm_name=\"Wedbush\", provider=\"benzinga\").to_df()" ] } }, @@ -6283,11 +5434,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -6426,24 +5573,9 @@ }, "model": "DiscoveryFilings", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "description": "Get filings for the year 2023, limited to 100 results", - "parameters": { - "start_date": "2023-01-01", - "end_date": "2023-12-31", - "limit": 100, - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.discovery.filings(limit=100)", + "# Get filings for the year 2023, limited to 100 results", + "obb.equity.discovery.filings(start_date='2023-01-01', end_date='2023-12-31')" ] } }, @@ -6466,11 +5598,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -6481,13 +5609,13 @@ "required": true, "schema": { "type": "string", - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.", "multiple_items_allowed": [ "fmp" ], "title": "Symbol" }, - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp." + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp." } ], "responses": { @@ -6537,14 +5665,7 @@ }, "model": "EquityValuationMultiples", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.fundamental.multiples(symbol=\"AAPL\")" ] } }, @@ -6931,24 +6052,7 @@ }, "model": "BalanceSheet", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "period": "annual", - "limit": 5, - "provider": "intrinio" - }, - "provider": "intrinio" - } + "obb.equity.fundamental.balance(symbol=\"AAPL\", period=\"annual\", limit=5)" ] } }, @@ -6971,11 +6075,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -7051,23 +6151,7 @@ }, "model": "BalanceSheetGrowth", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "limit": 10, - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.fundamental.balance_growth(symbol=\"AAPL\", limit=10)" ] } }, @@ -7440,24 +6524,7 @@ }, "model": "CashFlowStatement", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "period": "annual", - "limit": 5, - "provider": "intrinio" - }, - "provider": "intrinio" - } + "obb.equity.fundamental.cash(symbol=\"AAPL\", period=\"annual\", limit=5)" ] } }, @@ -7480,11 +6547,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "intrinio" - ], "const": "intrinio", - "type": "string", "default": "intrinio", "title": "Provider" } @@ -7609,46 +6672,11 @@ }, "model": "ReportedFinancials", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "intrinio" - }, - "provider": "intrinio" - }, - { - "scope": "api", - "description": "Get AAPL balance sheet with a limit of 10 items.", - "parameters": { - "symbol": "AAPL", - "period": "annual", - "statement_type": "balance", - "limit": 10, - "provider": "intrinio" - }, - "provider": "intrinio" - }, - { - "scope": "api", - "description": "Get reported income statement", - "parameters": { - "symbol": "AAPL", - "statement_type": "income", - "provider": "intrinio" - }, - "provider": "intrinio" - }, - { - "scope": "api", - "description": "Get reported cash flow statement", - "parameters": { - "symbol": "AAPL", - "statement_type": "cash", - "provider": "intrinio" - }, - "provider": "intrinio" - } + "obb.equity.fundamental.reported_financials(symbol=\"AAPL\", period=\"annual\", statement_type=\"balance\", limit=100)", + "# Get reported income statement", + "obb.equity.fundamental.reported_financials(symbol='AAPL', statement_type='income)", + "# Get reported cash flow statement", + "obb.equity.fundamental.reported_financials(symbol='AAPL', statement_type='cash')" ] } }, @@ -7671,11 +6699,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -7751,23 +6775,7 @@ }, "model": "CashFlowStatementGrowth", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "limit": 10, - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.fundamental.cash_growth(symbol=\"AAPL\", limit=10)" ] } }, @@ -7914,14 +6922,7 @@ }, "model": "HistoricalDividends", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "intrinio" - }, - "provider": "intrinio" - } + "obb.equity.fundamental.dividends(symbol=\"AAPL\")" ] } }, @@ -7944,11 +6945,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -8030,14 +7027,7 @@ }, "model": "HistoricalEps", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.fundamental.historical_eps(symbol=\"AAPL\")" ] } }, @@ -8060,11 +7050,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -8128,14 +7114,7 @@ }, "model": "HistoricalEmployees", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.fundamental.employee_count(symbol=\"AAPL\")" ] } }, @@ -8158,11 +7137,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "intrinio" - ], "const": "intrinio", - "type": "string", "default": "intrinio", "title": "Provider" } @@ -8245,14 +7220,7 @@ }, "model": "SearchAttributes", "examples": [ - { - "scope": "api", - "parameters": { - "query": "ebitda", - "provider": "intrinio" - }, - "provider": "intrinio" - } + "obb.equity.fundamental.search_attributes(query='ebitda')" ] } }, @@ -8275,11 +7243,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "intrinio" - ], "const": "intrinio", - "type": "string", "default": "intrinio", "title": "Provider" } @@ -8290,13 +7254,13 @@ "required": true, "schema": { "type": "string", - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): intrinio.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): intrinio.", "multiple_items_allowed": [ "intrinio" ], "title": "Symbol" }, - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): intrinio." + "description": "Symbol to get data for. Multiple items allowed for provider(s): intrinio." }, { "name": "tag", @@ -8304,13 +7268,13 @@ "required": true, "schema": { "type": "string", - "description": "Intrinio data tag ID or code. Multiple comma separated items allowed for provider(s): intrinio.", + "description": "Intrinio data tag ID or code. Multiple items allowed for provider(s): intrinio.", "multiple_items_allowed": [ "intrinio" ], "title": "Tag" }, - "description": "Intrinio data tag ID or code. Multiple comma separated items allowed for provider(s): intrinio." + "description": "Intrinio data tag ID or code. Multiple items allowed for provider(s): intrinio." } ], "responses": { @@ -8360,15 +7324,7 @@ }, "model": "LatestAttributes", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "tag": "ceo", - "provider": "intrinio" - }, - "provider": "intrinio" - } + "obb.equity.fundamental.latest_attributes(tag='ceo')" ] } }, @@ -8391,11 +7347,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "intrinio" - ], "const": "intrinio", - "type": "string", "default": "intrinio", "title": "Provider" } @@ -8406,13 +7358,13 @@ "required": true, "schema": { "type": "string", - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): intrinio.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): intrinio.", "multiple_items_allowed": [ "intrinio" ], "title": "Symbol" }, - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): intrinio." + "description": "Symbol to get data for. Multiple items allowed for provider(s): intrinio." }, { "name": "tag", @@ -8420,13 +7372,13 @@ "required": true, "schema": { "type": "string", - "description": "Intrinio data tag ID or code. Multiple comma separated items allowed for provider(s): intrinio.", + "description": "Intrinio data tag ID or code. Multiple items allowed for provider(s): intrinio.", "multiple_items_allowed": [ "intrinio" ], "title": "Tag" }, - "description": "Intrinio data tag ID or code. Multiple comma separated items allowed for provider(s): intrinio." + "description": "Intrinio data tag ID or code. Multiple items allowed for provider(s): intrinio." }, { "name": "start_date", @@ -8600,15 +7552,7 @@ }, "model": "HistoricalAttributes", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "tag": "ebitda", - "provider": "intrinio" - }, - "provider": "intrinio" - } + "obb.equity.fundamental.historical_attributes(tag='ebitda')" ] } }, @@ -9001,24 +7945,7 @@ }, "model": "IncomeStatement", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "period": "annual", - "limit": 5, - "provider": "intrinio" - }, - "provider": "intrinio" - } + "obb.equity.fundamental.income(symbol=\"AAPL\", period=\"annual\", limit=5)" ] } }, @@ -9041,11 +7968,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -9137,24 +8060,7 @@ }, "model": "IncomeStatementGrowth", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "limit": 10, - "period": "annual", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.fundamental.income_growth(symbol=\"AAPL\", limit=10, period=\"annual\")" ] } }, @@ -9191,32 +8097,24 @@ "required": true, "schema": { "type": "string", - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.", "multiple_items_allowed": [ - "fmp", - "intrinio" + "fmp" ], "title": "Symbol" }, - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio." + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp." }, { "name": "period", "in": "query", "required": false, "schema": { - "anyOf": [ - { - "enum": [ - "annual", - "quarter" - ], - "type": "string" - }, - { - "type": "null" - } + "enum": [ + "annual", + "quarter" ], + "type": "string", "description": "Time period of the data to return.", "default": "annual", "title": "Period" @@ -9309,24 +8207,7 @@ }, "model": "KeyMetrics", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "period": "annual", - "limit": 100, - "provider": "intrinio" - }, - "provider": "intrinio" - } + "obb.equity.fundamental.metrics(symbol=\"AAPL\", period=\"annual\", limit=100)" ] } }, @@ -9349,11 +8230,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -9417,14 +8294,7 @@ }, "model": "KeyExecutives", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.fundamental.management(symbol=\"AAPL\")" ] } }, @@ -9447,11 +8317,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -9462,31 +8328,51 @@ "required": true, "schema": { "type": "string", - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.", "multiple_items_allowed": [ "fmp" ], "title": "Symbol" }, - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp." + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp." }, { - "name": "year", + "name": "start_date", "in": "query", "required": false, "schema": { "anyOf": [ { - "type": "integer" + "type": "string", + "format": "date" }, { "type": "null" } ], - "title": "fmp", - "description": "Year of the compensation. (provider: fmp)" + "description": "Start date of the data, in YYYY-MM-DD format.", + "title": "Start Date" }, - "description": "Year of the compensation. (provider: fmp)" + "description": "Start date of the data, in YYYY-MM-DD format." + }, + { + "name": "end_date", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "description": "End date of the data, in YYYY-MM-DD format.", + "title": "End Date" + }, + "description": "End date of the data, in YYYY-MM-DD format." } ], "responses": { @@ -9536,14 +8422,7 @@ }, "model": "ExecutiveCompensation", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.fundamental.management_compensation(symbol=\"AAPL\")" ] } }, @@ -9567,11 +8446,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -9635,14 +8510,7 @@ }, "model": "CompanyOverview", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.fundamental.overview(symbol=\"AAPL\")" ] } }, @@ -9679,13 +8547,14 @@ "required": true, "schema": { "type": "string", - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio.", "multiple_items_allowed": [ - "fmp" + "fmp", + "intrinio" ], "title": "Symbol" }, - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp." + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio." }, { "name": "period", @@ -9724,11 +8593,11 @@ "type": "null" } ], - "title": "fmp", - "description": "Include trailing twelve months (TTM) data. (provider: fmp)", + "title": "fmp,intrinio", + "description": "Include trailing twelve months (TTM) data. (provider: fmp, intrinio)", "default": false }, - "description": "Include trailing twelve months (TTM) data. (provider: fmp)" + "description": "Include trailing twelve months (TTM) data. (provider: fmp, intrinio)" }, { "name": "fiscal_year", @@ -9796,24 +8665,7 @@ }, "model": "FinancialRatios", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "period": "annual", - "limit": 12, - "provider": "intrinio" - }, - "provider": "intrinio" - } + "obb.equity.fundamental.ratios(symbol=\"AAPL\", period=\"annual\", limit=12)" ] } }, @@ -9836,11 +8688,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -9936,24 +8784,7 @@ }, "model": "RevenueGeographic", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "period": "annual", - "structure": "flat", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.fundamental.revenue_per_geography(symbol=\"AAPL\", period=\"annual\", structure=\"flat\")" ] } }, @@ -9976,11 +8807,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -10076,24 +8903,7 @@ }, "model": "RevenueBusinessLine", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "period": "annual", - "structure": "flat", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.fundamental.revenue_per_segment(symbol=\"AAPL\", period=\"annual\", structure=\"flat\")" ] } }, @@ -10537,6 +9347,22 @@ }, "description": "The number of data entries to return." }, + { + "name": "sort", + "in": "query", + "required": false, + "schema": { + "enum": [ + "asc", + "desc" + ], + "type": "string", + "title": "fmp", + "description": "Sort the data in ascending or descending order. (provider: fmp)", + "default": "desc" + }, + "description": "Sort the data in ascending or descending order. (provider: fmp)" + }, { "name": "start_date", "in": "query", @@ -10674,21 +9500,7 @@ }, "model": "CompanyFilings", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "parameters": { - "limit": 100, - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.fundamental.filings(limit=100)" ] } }, @@ -10711,11 +9523,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -10779,14 +9587,7 @@ }, "model": "HistoricalSplits", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.fundamental.historical_splits(symbol=\"AAPL\")" ] } }, @@ -10809,11 +9610,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -10832,13 +9629,39 @@ { "name": "year", "in": "query", - "required": true, + "required": false, "schema": { - "type": "integer", + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], "description": "Year of the earnings call transcript.", "title": "Year" }, "description": "Year of the earnings call transcript." + }, + { + "name": "earnings_date", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "null" + } + ], + "title": "fmp", + "description": "Date of the earnings call transcript. (provider: fmp)" + }, + "description": "Date of the earnings call transcript. (provider: fmp)" } ], "responses": { @@ -10888,15 +9711,120 @@ }, "model": "EarningsCallTranscript", "examples": [ + "obb.equity.fundamental.transcript(symbol='AAPL', year=2020)" + ] + } + }, + "/api/v1/equity/fundamental/trailing_dividend_yield": { + "get": { + "tags": [ + "equity" + ], + "summary": "Trailing Dividend Yield", + "description": "Get the 1 year trailing dividend yield for a given company over time.", + "operationId": "equity_fundamental_trailing_dividend_yield", + "security": [ { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "year": 2020, - "provider": "fmp" - }, - "provider": "fmp" + "OAuth2PasswordBearer": [] } + ], + "parameters": [ + { + "name": "provider", + "in": "query", + "required": false, + "schema": { + "const": "tiingo", + "default": "tiingo", + "title": "Provider" + } + }, + { + "name": "symbol", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Symbol to get data for.", + "title": "Symbol" + }, + "description": "Symbol to get data for." + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "The number of data entries to return. Default is 252, the number of trading days in a year.", + "default": 252, + "title": "Limit" + }, + "description": "The number of data entries to return. Default is 252, the number of trading days in a year." + } + ], + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OBBject_TrailingDividendYield" + } + } + } + }, + "404": { + "description": "Not found" + }, + "400": { + "description": "No Results Found", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OpenBBErrorResponse" + } + } + } + }, + "500": { + "description": "Internal Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OpenBBErrorResponse" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + }, + "model": "TrailingDividendYield", + "examples": [ + "obb.equity.fundamental.trailing_dividend_yield(limit=252)" ] } }, @@ -10919,11 +9847,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -10976,6 +9900,24 @@ "title": "Page" }, "description": "Page number of the data to fetch." + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "fmp", + "description": "Number of records to return. (Ignores page if set. Default: None) (provider: fmp)" + }, + "description": "Number of records to return. (Ignores page if set. Default: None) (provider: fmp)" } ], "responses": { @@ -11025,23 +9967,7 @@ }, "model": "EquityOwnership", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "page": 0, - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.ownership.major_holders(symbol=\"AAPL\", page=0)" ] } }, @@ -11062,14 +9988,13 @@ { "name": "provider", "in": "query", - "required": false, + "required": true, "schema": { "enum": [ - "fmp" + "fmp", + "intrinio" ], - "const": "fmp", "type": "string", - "default": "fmp", "title": "Provider" } }, @@ -11121,6 +10046,25 @@ "description": "A specific date to get data for. (provider: fmp)" }, "description": "A specific date to get data for. (provider: fmp)" + }, + { + "name": "page_size", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "intrinio", + "description": "The number of data entries to return. (provider: intrinio)", + "default": 100 + }, + "description": "The number of data entries to return. (provider: intrinio)" } ], "responses": { @@ -11170,14 +10114,7 @@ }, "model": "InstitutionalOwnership", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.ownership.institutional(symbol=\"AAPL\")" ] } }, @@ -11393,23 +10330,7 @@ }, "model": "InsiderTrading", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "limit": 500, - "provider": "intrinio" - }, - "provider": "intrinio" - } + "obb.equity.ownership.insider_trading(symbol=\"AAPL\", limit=500)" ] } }, @@ -11499,169 +10420,7 @@ }, "model": "ShareStatistics", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - } - ] - } - }, - "/api/v1/equity/ownership/form_13f": { - "get": { - "tags": [ - "equity" - ], - "summary": "Form 13F", - "description": "The Securities and Exchange Commission's (SEC) Form 13F is a quarterly report\nthat is required to be filed by all institutional investment managers with at least\n$100 million in assets under management.\nManagers are required to file Form 13F within 45 days after the last day of the calendar quarter.\nMost funds wait until the end of this period in order to conceal\ntheir investment strategy from competitors and the public.", - "operationId": "equity_ownership_form_13f", - "security": [ - { - "OAuth2PasswordBearer": [] - } - ], - "parameters": [ - { - "name": "provider", - "in": "query", - "required": false, - "schema": { - "enum": [ - "sec" - ], - "const": "sec", - "type": "string", - "default": "sec", - "title": "Provider" - } - }, - { - "name": "symbol", - "in": "query", - "required": true, - "schema": { - "type": "string", - "description": "Symbol to get data for. A CIK or Symbol can be used.", - "title": "Symbol" - }, - "description": "Symbol to get data for. A CIK or Symbol can be used." - }, - { - "name": "date", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string", - "format": "date" - }, - { - "type": "null" - } - ], - "description": "A specific date to get data for. The date represents the end of the reporting period. All form 13F-HR filings are based on the calendar year and are reported quarterly. If a date is not supplied, the most recent filing is returned. Submissions beginning 2013-06-30 are supported.", - "title": "Date" - }, - "description": "A specific date to get data for. The date represents the end of the reporting period. All form 13F-HR filings are based on the calendar year and are reported quarterly. If a date is not supplied, the most recent filing is returned. Submissions beginning 2013-06-30 are supported." - }, - { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "description": "The number of data entries to return. The number of previous filings to return. The date parameter takes priority over this parameter.", - "default": 1, - "title": "Limit" - }, - "description": "The number of data entries to return. The number of previous filings to return. The date parameter takes priority over this parameter." - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OBBject_Form13FHR" - } - } - } - }, - "404": { - "description": "Not found" - }, - "400": { - "description": "No Results Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OpenBBErrorResponse" - } - } - } - }, - "500": { - "description": "Internal Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OpenBBErrorResponse" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - }, - "model": "Form13FHR", - "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "NVDA", - "provider": "sec" - }, - "provider": "sec" - }, - { - "scope": "api", - "description": "Enter a date (calendar quarter ending) for a specific report.", - "parameters": { - "symbol": "BRK-A", - "date": "2016-09-30", - "provider": "sec" - }, - "provider": "sec" - }, - { - "scope": "python", - "description": "Example finding Michael Burry's filings.", - "code": [ - "cik = obb.regulators.sec.institutions_search(\"Scion Asset Management\").results[0].cik", - "# Use the `limit` parameter to return N number of reports from the most recent.", - "obb.equity.ownership.form_13f(cik, limit=2).to_df()" - ] - } + "obb.equity.ownership.share_statistics(symbol=\"AAPL\")" ] } }, @@ -11698,14 +10457,14 @@ "required": true, "schema": { "type": "string", - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio.", + "description": "Symbol to get data for. This endpoint will accept multiple symbols separated by commas. Multiple items allowed for provider(s): fmp, intrinio.", "multiple_items_allowed": [ "fmp", "intrinio" ], "title": "Symbol" }, - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio." + "description": "Symbol to get data for. This endpoint will accept multiple symbols separated by commas. Multiple items allowed for provider(s): fmp, intrinio." }, { "name": "source", @@ -11778,14 +10537,7 @@ }, "model": "EquityQuote", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.price.quote(symbol=\"AAPL\")" ] } }, @@ -11808,11 +10560,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "polygon" - ], "const": "polygon", - "type": "string", "default": "polygon", "title": "Provider" } @@ -11877,9 +10625,9 @@ } ], "title": "polygon", - "description": "Query by datetime, less than. Either a date with the format 'YYYY-MM-DD' or a TZ-aware timestamp string, 'YYYY-MM-DDTH:M:S.000000000-04:00'. Include all nanoseconds and the 'T' between the day and hour. (provider: polygon)" + "description": "\n Query by datetime, less than. Either a date with the format YYYY-MM-DD or a TZ-aware timestamp string,\n YYYY-MM-DDTH:M:S.000000000-04:00\". Include all nanoseconds and the 'T' between the day and hour.\n (provider: polygon)" }, - "description": "Query by datetime, less than. Either a date with the format 'YYYY-MM-DD' or a TZ-aware timestamp string, 'YYYY-MM-DDTH:M:S.000000000-04:00'. Include all nanoseconds and the 'T' between the day and hour. (provider: polygon)" + "description": "\n Query by datetime, less than. Either a date with the format YYYY-MM-DD or a TZ-aware timestamp string,\n YYYY-MM-DDTH:M:S.000000000-04:00\". Include all nanoseconds and the 'T' between the day and hour.\n (provider: polygon)" }, { "name": "timestamp_gt", @@ -11899,9 +10647,9 @@ } ], "title": "polygon", - "description": "Query by datetime, greater than. Either a date with the format 'YYYY-MM-DD' or a TZ-aware timestamp string, 'YYYY-MM-DDTH:M:S.000000000-04:00'. Include all nanoseconds and the 'T' between the day and hour. (provider: polygon)" + "description": "\n Query by datetime, greater than. Either a date with the format YYYY-MM-DD or a TZ-aware timestamp string,\n YYYY-MM-DDTH:M:S.000000000-04:00\". Include all nanoseconds and the 'T' between the day and hour.\n (provider: polygon)" }, - "description": "Query by datetime, greater than. Either a date with the format 'YYYY-MM-DD' or a TZ-aware timestamp string, 'YYYY-MM-DDTH:M:S.000000000-04:00'. Include all nanoseconds and the 'T' between the day and hour. (provider: polygon)" + "description": "\n Query by datetime, greater than. Either a date with the format YYYY-MM-DD or a TZ-aware timestamp string,\n YYYY-MM-DDTH:M:S.000000000-04:00\". Include all nanoseconds and the 'T' between the day and hour.\n (provider: polygon)" }, { "name": "timestamp_lte", @@ -11921,9 +10669,9 @@ } ], "title": "polygon", - "description": "Query by datetime, less than or equal to. Either a date with the format 'YYYY-MM-DD' or a TZ-aware timestamp string, 'YYYY-MM-DDTH:M:S.000000000-04:00'. Include all nanoseconds and the 'T' between the day and hour. (provider: polygon)" + "description": "\n Query by datetime, less than or equal to.\n Either a date with the format YYYY-MM-DD or a TZ-aware timestamp string,\n YYYY-MM-DDTH:M:S.000000000-04:00\". Include all nanoseconds and the 'T' between the day and hour.\n (provider: polygon)" }, - "description": "Query by datetime, less than or equal to. Either a date with the format 'YYYY-MM-DD' or a TZ-aware timestamp string, 'YYYY-MM-DDTH:M:S.000000000-04:00'. Include all nanoseconds and the 'T' between the day and hour. (provider: polygon)" + "description": "\n Query by datetime, less than or equal to.\n Either a date with the format YYYY-MM-DD or a TZ-aware timestamp string,\n YYYY-MM-DDTH:M:S.000000000-04:00\". Include all nanoseconds and the 'T' between the day and hour.\n (provider: polygon)" }, { "name": "timestamp_gte", @@ -11943,9 +10691,9 @@ } ], "title": "polygon", - "description": "Query by datetime, greater than or equal to. Either a date with the format 'YYYY-MM-DD' or a TZ-aware timestamp string, 'YYYY-MM-DDTH:M:S.000000000-04:00'. Include all nanoseconds and the 'T' between the day and hour. (provider: polygon)" + "description": "\n Query by datetime, greater than or equal to.\n Either a date with the format YYYY-MM-DD or a TZ-aware timestamp string,\n YYYY-MM-DDTH:M:S.000000000-04:00\". Include all nanoseconds and the 'T' between the day and hour.\n (provider: polygon)" }, - "description": "Query by datetime, greater than or equal to. Either a date with the format 'YYYY-MM-DD' or a TZ-aware timestamp string, 'YYYY-MM-DDTH:M:S.000000000-04:00'. Include all nanoseconds and the 'T' between the day and hour. (provider: polygon)" + "description": "\n Query by datetime, greater than or equal to.\n Either a date with the format YYYY-MM-DD or a TZ-aware timestamp string,\n YYYY-MM-DDTH:M:S.000000000-04:00\". Include all nanoseconds and the 'T' between the day and hour.\n (provider: polygon)" } ], "responses": { @@ -11995,14 +10743,7 @@ }, "model": "EquityNBBO", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "polygon" - }, - "provider": "polygon" - } + "obb.equity.price.nbbo(symbol=\"AAPL\")" ] } }, @@ -12028,7 +10769,8 @@ "enum": [ "fmp", "intrinio", - "polygon" + "polygon", + "tiingo" ], "type": "string", "title": "Provider" @@ -12040,14 +10782,15 @@ "required": true, "schema": { "type": "string", - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, polygon.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, polygon, tiingo.", "multiple_items_allowed": [ "fmp", - "polygon" + "polygon", + "tiingo" ], "title": "Symbol" }, - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, polygon." + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, polygon, tiingo." }, { "name": "interval", @@ -12106,6 +10849,44 @@ }, "description": "End date of the data, in YYYY-MM-DD format." }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "fmp,intrinio,polygon", + "description": "Number of days to look back (Only for interval 1d). (provider: fmp);\n The number of results to return per page. (provider: intrinio);\n The number of data entries to return. (provider: polygon)" + }, + "description": "Number of days to look back (Only for interval 1d). (provider: fmp);\n The number of results to return per page. (provider: intrinio);\n The number of data entries to return. (provider: polygon)" + }, + { + "name": "sort", + "in": "query", + "required": false, + "schema": { + "enum": [ + "asc", + "desc" + ], + "type": "string", + "title": "fmp,polygon", + "description": "Sort the data in ascending or descending order. (provider: fmp);\n Sort order of the data. (provider: polygon)", + "default": "desc" + }, + "description": "Sort the data in ascending or descending order. (provider: fmp);\n Sort order of the data. (provider: polygon)" + }, { "name": "start_time", "in": "query", @@ -12149,17 +10930,10 @@ "in": "query", "required": false, "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], + "type": "string", "title": "intrinio", "description": "Timezone of the data, in the IANA format (Continent/City). (provider: intrinio)", - "default": "America/New_York" + "default": "UTC" }, "description": "Timezone of the data, in the IANA format (Continent/City). (provider: intrinio)" }, @@ -12181,60 +10955,35 @@ "description": "The source of the data. (provider: intrinio)" }, { - "name": "adjustment", + "name": "sleep", "in": "query", "required": false, "schema": { - "enum": [ - "splits_only", - "unadjusted" + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } ], - "type": "string", - "title": "polygon", - "description": "The adjustment factor to apply. Default is splits only. (provider: polygon)", - "default": "splits_only" + "title": "intrinio", + "description": "Time to sleep between requests to avoid rate limiting. (provider: intrinio)", + "default": 1.0 }, - "description": "The adjustment factor to apply. Default is splits only. (provider: polygon)" + "description": "Time to sleep between requests to avoid rate limiting. (provider: intrinio)" }, { - "name": "extended_hours", + "name": "adjusted", "in": "query", "required": false, "schema": { "type": "boolean", "title": "polygon", - "description": "Include Pre and Post market data. (provider: polygon)", - "default": false + "description": "Output time series is adjusted by historical split and dividend events. (provider: polygon)", + "default": true }, - "description": "Include Pre and Post market data. (provider: polygon)" - }, - { - "name": "sort", - "in": "query", - "required": false, - "schema": { - "enum": [ - "asc", - "desc" - ], - "type": "string", - "title": "polygon", - "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date. (provider: polygon)", - "default": "asc" - }, - "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date. (provider: polygon)" - }, - { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "title": "polygon", - "description": "The number of data entries to return. (provider: polygon)", - "default": 49999 - }, - "description": "The number of data entries to return. (provider: polygon)" + "description": "Output time series is adjusted by historical split and dividend events. (provider: polygon)" } ], "responses": { @@ -12284,23 +11033,7 @@ }, "model": "EquityHistorical", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "interval": "1d", - "provider": "intrinio" - }, - "provider": "intrinio" - } + "obb.equity.price.historical(symbol=\"AAPL\", interval=\"1d\")" ] } }, @@ -12323,11 +11056,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -12338,13 +11067,13 @@ "required": true, "schema": { "type": "string", - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.", "multiple_items_allowed": [ "fmp" ], "title": "Symbol" }, - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp." + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp." } ], "responses": { @@ -12394,14 +11123,7 @@ }, "model": "PricePerformance", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.price.performance(symbol=\"AAPL\")" ] } }, @@ -12424,11 +11146,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "sec" - ], "const": "sec", - "type": "string", "default": "sec", "title": "Provider" } @@ -12530,14 +11248,7 @@ }, "model": "EquityFTD", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "sec" - }, - "provider": "sec" - } + "obb.equity.shorts.fails_to_deliver(symbol='AAPL')" ] } }, @@ -12709,13 +11420,7 @@ }, "model": "EquitySearch", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "intrinio" - }, - "provider": "intrinio" - } + "obb.equity.search(query=\"AAPL\", is_symbol=False, use_cache=True)" ] } }, @@ -12738,11 +11443,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -13045,7 +11746,6 @@ { "enum": [ "amex", - "ams", "ase", "asx", "ath", @@ -13074,7 +11774,6 @@ "kuw", "lse", "mex", - "mutual_fund", "nasdaq", "neo", "nse", @@ -13179,13 +11878,7 @@ }, "model": "EquityScreener", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.screener()" ] } }, @@ -13222,14 +11915,14 @@ "required": true, "schema": { "type": "string", - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio.", "multiple_items_allowed": [ "fmp", "intrinio" ], "title": "Symbol" }, - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio." + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp, intrinio." } ], "responses": { @@ -13279,14 +11972,7 @@ }, "model": "EquityInfo", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "AAPL", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.profile(symbol=\"AAPL\")" ] } }, @@ -13311,7 +11997,6 @@ "schema": { "enum": [ "fmp", - "intrinio", "polygon" ], "type": "string", @@ -13324,95 +12009,71 @@ "required": false, "schema": { "enum": [ - "amex", - "ams", - "ase", - "asx", - "ath", - "bme", - "bru", - "bud", - "bue", - "cai", - "cnq", - "cph", - "dfm", - "doh", - "etf", - "euronext", - "hel", - "hkse", - "ice", - "iob", - "ist", - "jkt", - "jnb", - "jpx", - "kls", - "koe", - "ksc", - "kuw", - "lse", - "mex", - "mutual_fund", - "nasdaq", - "neo", - "nse", - "nyse", - "nze", - "osl", - "otc", - "pnk", - "pra", - "ris", - "sao", - "sau", - "set", - "sgo", - "shh", - "shz", - "six", - "sto", - "tai", - "tlv", - "tsx", - "two", - "vie", - "wse", - "xetra" + "AMEX", + "AMS", + "ASE", + "ASX", + "ATH", + "BME", + "BRU", + "BUD", + "BUE", + "CAI", + "CNQ", + "CPH", + "DFM", + "DOH", + "DUS", + "ETF", + "EURONEXT", + "HEL", + "HKSE", + "ICE", + "IOB", + "IST", + "JKT", + "JNB", + "JPX", + "KLS", + "KOE", + "KSC", + "KUW", + "LSE", + "MEX", + "MIL", + "NASDAQ", + "NEO", + "NSE", + "NYSE", + "NZE", + "OSL", + "OTC", + "PNK", + "PRA", + "RIS", + "SAO", + "SAU", + "SES", + "SET", + "SGO", + "SHH", + "SHZ", + "SIX", + "STO", + "TAI", + "TLV", + "TSX", + "TWO", + "VIE", + "WSE", + "XETRA" ], "type": "string", "title": "fmp", "description": "The market to fetch data for. (provider: fmp)", - "default": "nasdaq" + "default": "NASDAQ" }, "description": "The market to fetch data for. (provider: fmp)" - }, - { - "name": "date", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string", - "format": "date" - }, - { - "type": "string", - "format": "date-time" - }, - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "intrinio", - "description": "The date of the data. Can be a datetime or an ISO datetime string. Historical data appears to go back to mid-June 2022. Example: '2024-03-08T12:15:00+0400' (provider: intrinio)" - }, - "description": "The date of the data. Can be a datetime or an ISO datetime string. Historical data appears to go back to mid-June 2022. Example: '2024-03-08T12:15:00+0400' (provider: intrinio)" } ], "responses": { @@ -13462,13 +12123,7 @@ }, "model": "MarketSnapshots", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.equity.market_snapshots()" ] } }, @@ -13489,13 +12144,10 @@ { "name": "provider", "in": "query", - "required": true, + "required": false, "schema": { - "enum": [ - "fmp", - "intrinio" - ], - "type": "string", + "const": "fmp", + "default": "fmp", "title": "Provider" } }, @@ -13535,39 +12187,14 @@ ], "type": "string" }, - { - "enum": [ - "xnas", - "arcx", - "bats", - "xnys", - "bvmf", - "xshg", - "xshe", - "xhkg", - "xbom", - "xnse", - "xidx", - "tase", - "xkrx", - "xkls", - "xmex", - "xses", - "roco", - "xtai", - "xbkk", - "xist" - ], - "type": "string" - }, { "type": "null" } ], - "title": "fmp,intrinio", - "description": "The exchange code the ETF trades on. (provider: fmp);\n Target a specific exchange by providing the MIC code. (provider: intrinio)" + "title": "fmp", + "description": "The exchange code the ETF trades on. (provider: fmp)" }, - "description": "The exchange code the ETF trades on. (provider: fmp);\n Target a specific exchange by providing the MIC code. (provider: intrinio)" + "description": "The exchange code the ETF trades on. (provider: fmp)" }, { "name": "is_active", @@ -13639,312 +12266,9 @@ }, "model": "EtfSearch", "examples": [ - { - "scope": "api", - "description": "An empty query returns the full list of ETFs from the provider.", - "parameters": { - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "description": "The query will return results from text-based fields containing the term.", - "parameters": { - "query": "commercial real estate", - "provider": "fmp" - }, - "provider": "fmp" - } - ] - } - }, - "/api/v1/etf/historical": { - "get": { - "tags": [ - "etf" - ], - "summary": "Historical", - "description": "ETF Historical Market Price.", - "operationId": "etf_historical", - "security": [ - { - "OAuth2PasswordBearer": [] - } - ], - "parameters": [ - { - "name": "provider", - "in": "query", - "required": true, - "schema": { - "enum": [ - "fmp", - "intrinio", - "polygon" - ], - "type": "string", - "title": "Provider" - } - }, - { - "name": "symbol", - "in": "query", - "required": true, - "schema": { - "type": "string", - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, polygon.", - "multiple_items_allowed": [ - "fmp", - "polygon" - ], - "title": "Symbol" - }, - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, polygon." - }, - { - "name": "interval", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "description": "Time interval of the data to return.", - "default": "1d", - "title": "Interval" - }, - "description": "Time interval of the data to return." - }, - { - "name": "start_date", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string", - "format": "date" - }, - { - "type": "null" - } - ], - "description": "Start date of the data, in YYYY-MM-DD format.", - "title": "Start Date" - }, - "description": "Start date of the data, in YYYY-MM-DD format." - }, - { - "name": "end_date", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string", - "format": "date" - }, - { - "type": "null" - } - ], - "description": "End date of the data, in YYYY-MM-DD format.", - "title": "End Date" - }, - "description": "End date of the data, in YYYY-MM-DD format." - }, - { - "name": "start_time", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string", - "format": "time" - }, - { - "type": "null" - } - ], - "title": "intrinio", - "description": "Return intervals starting at the specified time on the `start_date` formatted as 'HH:MM:SS'. (provider: intrinio)" - }, - "description": "Return intervals starting at the specified time on the `start_date` formatted as 'HH:MM:SS'. (provider: intrinio)" - }, - { - "name": "end_time", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string", - "format": "time" - }, - { - "type": "null" - } - ], - "title": "intrinio", - "description": "Return intervals stopping at the specified time on the `end_date` formatted as 'HH:MM:SS'. (provider: intrinio)" - }, - "description": "Return intervals stopping at the specified time on the `end_date` formatted as 'HH:MM:SS'. (provider: intrinio)" - }, - { - "name": "timezone", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "intrinio", - "description": "Timezone of the data, in the IANA format (Continent/City). (provider: intrinio)", - "default": "America/New_York" - }, - "description": "Timezone of the data, in the IANA format (Continent/City). (provider: intrinio)" - }, - { - "name": "source", - "in": "query", - "required": false, - "schema": { - "enum": [ - "realtime", - "delayed", - "nasdaq_basic" - ], - "type": "string", - "title": "intrinio", - "description": "The source of the data. (provider: intrinio)", - "default": "realtime" - }, - "description": "The source of the data. (provider: intrinio)" - }, - { - "name": "adjustment", - "in": "query", - "required": false, - "schema": { - "enum": [ - "splits_only", - "unadjusted" - ], - "type": "string", - "title": "polygon", - "description": "The adjustment factor to apply. Default is splits only. (provider: polygon)", - "default": "splits_only" - }, - "description": "The adjustment factor to apply. Default is splits only. (provider: polygon)" - }, - { - "name": "extended_hours", - "in": "query", - "required": false, - "schema": { - "type": "boolean", - "title": "polygon", - "description": "Include Pre and Post market data. (provider: polygon)", - "default": false - }, - "description": "Include Pre and Post market data. (provider: polygon)" - }, - { - "name": "sort", - "in": "query", - "required": false, - "schema": { - "enum": [ - "asc", - "desc" - ], - "type": "string", - "title": "polygon", - "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date. (provider: polygon)", - "default": "asc" - }, - "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date. (provider: polygon)" - }, - { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "type": "integer", - "title": "polygon", - "description": "The number of data entries to return. (provider: polygon)", - "default": 49999 - }, - "description": "The number of data entries to return. (provider: polygon)" - } - ], - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OBBject_EtfHistorical" - } - } - } - }, - "404": { - "description": "Not found" - }, - "400": { - "description": "No Results Found", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OpenBBErrorResponse" - } - } - } - }, - "500": { - "description": "Internal Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/OpenBBErrorResponse" - } - } - } - }, - "422": { - "description": "Validation Error", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/HTTPValidationError" - } - } - } - } - }, - "model": "EtfHistorical", - "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "SPY", - "provider": "fmp" - }, - "provider": "fmp" - } + "### An empty query returns the full list of ETFs from the provider. ###", + "obb.etf.search(\"\", provider=\"fmp\")", + "#### The query will return results from text-based fields containing the term. ####obb.etf.search(\"commercial real estate\", provider=\"fmp\")" ] } }, @@ -13965,13 +12289,10 @@ { "name": "provider", "in": "query", - "required": true, + "required": false, "schema": { - "enum": [ - "fmp", - "intrinio" - ], - "type": "string", + "const": "fmp", + "default": "fmp", "title": "Provider" } }, @@ -13981,14 +12302,13 @@ "required": true, "schema": { "type": "string", - "description": "Symbol to get data for. (ETF) Multiple comma separated items allowed for provider(s): fmp, intrinio.", + "description": "Symbol to get data for. (ETF) Multiple items allowed for provider(s): fmp.", "multiple_items_allowed": [ - "fmp", - "intrinio" + "fmp" ], "title": "Symbol" }, - "description": "Symbol to get data for. (ETF) Multiple comma separated items allowed for provider(s): fmp, intrinio." + "description": "Symbol to get data for. (ETF) Multiple items allowed for provider(s): fmp." } ], "responses": { @@ -14038,23 +12358,9 @@ }, "model": "EtfInfo", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "SPY", - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "description": "This function accepts multiple tickers.", - "parameters": { - "symbol": "SPY,IWM,QQQ,DJIA", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.etf.info(\"SPY\", provider=\"fmp\")", + "#### This function accepts multiple tickers. ####", + "obb.etf.info(\"SPY,IWM,QQQ,DJIA\", provider=\"fmp\")" ] } }, @@ -14077,11 +12383,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -14145,14 +12447,7 @@ }, "model": "EtfSectors", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "SPY", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.etf.sectors(\"SPY\", provider=\"fmp\")" ] } }, @@ -14175,11 +12470,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -14190,13 +12481,13 @@ "required": true, "schema": { "type": "string", - "description": "Symbol to get data for. (ETF) Multiple comma separated items allowed for provider(s): fmp.", + "description": "Symbol to get data for. (ETF) Multiple items allowed for provider(s): fmp.", "multiple_items_allowed": [ "fmp" ], "title": "Symbol" }, - "description": "Symbol to get data for. (ETF) Multiple comma separated items allowed for provider(s): fmp." + "description": "Symbol to get data for. (ETF) Multiple items allowed for provider(s): fmp." } ], "responses": { @@ -14246,14 +12537,7 @@ }, "model": "EtfCountries", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "VT", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.etf.countries(\"VT\", provider=\"fmp\")" ] } }, @@ -14263,7 +12547,7 @@ "etf" ], "summary": "Price Performance", - "description": "Price performance as a return, over different periods.", + "description": "Price performance as a return, over different periods. This is a proxy for `equity.price.performance`.", "operationId": "etf_price_performance", "security": [ { @@ -14274,13 +12558,10 @@ { "name": "provider", "in": "query", - "required": true, + "required": false, "schema": { - "enum": [ - "fmp", - "intrinio" - ], - "type": "string", + "const": "fmp", + "default": "fmp", "title": "Provider" } }, @@ -14290,46 +12571,13 @@ "required": true, "schema": { "type": "string", - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.", "multiple_items_allowed": [ - "fmp", - "intrinio" + "fmp" ], "title": "Symbol" }, - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio." - }, - { - "name": "return_type", - "in": "query", - "required": false, - "schema": { - "enum": [ - "trailing", - "calendar" - ], - "type": "string", - "title": "intrinio", - "description": "The type of returns to return, a trailing or calendar window. (provider: intrinio)", - "default": "trailing" - }, - "description": "The type of returns to return, a trailing or calendar window. (provider: intrinio)" - }, - { - "name": "adjustment", - "in": "query", - "required": false, - "schema": { - "enum": [ - "splits_only", - "splits_and_dividends" - ], - "type": "string", - "title": "intrinio", - "description": "The adjustment factor, 'splits_only' will return pure price performance. (provider: intrinio)", - "default": "splits_and_dividends" - }, - "description": "The adjustment factor, 'splits_only' will return pure price performance. (provider: intrinio)" + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp." } ], "responses": { @@ -14338,7 +12586,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/OBBject_EtfPricePerformance" + "$ref": "#/components/schemas/OBBject_PricePerformance" } } } @@ -14377,24 +12625,9 @@ } } }, - "model": "EtfPricePerformance", + "model": "PricePerformance", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "QQQ", - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "parameters": { - "symbol": "SPY,QQQ,IWM,DJIA", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.etf.price_performance(\"SPY,QQQ,IWM,DJIA\", provider=\"fmp\")" ] } }, @@ -14419,7 +12652,6 @@ "schema": { "enum": [ "fmp", - "intrinio", "sec" ], "type": "string", @@ -14455,9 +12687,9 @@ } ], "title": "fmp,sec", - "description": "A specific date to get data for. Entering a date will attempt to return the NPORT-P filing for the entered date. This needs to be _exactly_ the date of the filing. Use the holdings_date command/endpoint to find available filing dates for the ETF. (provider: fmp);\n A specific date to get data for. The date represents the period ending. The date entered will return the closest filing. (provider: sec)" + "description": "A specific date to get data for. Entering a date will attempt to return the NPORT-P filing for the entered date. This needs to be _exactly_ the date of the filing. Use the holdings_date command/endpoint to find available filing dates for the ETF. (provider: fmp);\n A specific date to get data for. The date represents the period ending. The date entered will return the closest filing. (provider: sec)" }, - "description": "A specific date to get data for. Entering a date will attempt to return the NPORT-P filing for the entered date. This needs to be _exactly_ the date of the filing. Use the holdings_date command/endpoint to find available filing dates for the ETF. (provider: fmp);\n A specific date to get data for. The date represents the period ending. The date entered will return the closest filing. (provider: sec)" + "description": "A specific date to get data for. Entering a date will attempt to return the NPORT-P filing for the entered date. This needs to be _exactly_ the date of the filing. Use the holdings_date command/endpoint to find available filing dates for the ETF. (provider: fmp);\n A specific date to get data for. The date represents the period ending. The date entered will return the closest filing. (provider: sec)" }, { "name": "cik", @@ -14537,34 +12769,11 @@ }, "model": "EtfHoldings", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "XLK", - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "description": "Including a date (FMP, SEC) will return the holdings as per NPORT-P filings.", - "parameters": { - "symbol": "XLK", - "date": "2022-03-31", - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "description": "The same data can be returned from the SEC directly.", - "parameters": { - "symbol": "XLK", - "date": "2022-03-31", - "provider": "sec" - }, - "provider": "sec" - } + "obb.etf.holdings(\"XLK\", provider=\"fmp\").to_df()", + "#### Including a date (FMP, SEC) will return the holdings as per NPORT-P filings. ####", + "obb.etf.holdings(\"XLK\", date=\"2022-03-31\",provider=\"fmp\").to_df()", + "#### The same data can be returned from the SEC directly. ####", + "obb.etf.holdings(\"XLK\", date=\"2022-03-31\",provider=\"sec\").to_df()" ] } }, @@ -14587,11 +12796,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -14673,14 +12878,7 @@ }, "model": "EtfHoldingsDate", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "XLK", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.etf.holdings_date(\"XLK\", provider=\"fmp\").results" ] } }, @@ -14703,11 +12901,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -14718,13 +12912,13 @@ "required": true, "schema": { "type": "string", - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp.", "multiple_items_allowed": [ "fmp" ], "title": "Symbol" }, - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp." + "description": "Symbol to get data for. Multiple items allowed for provider(s): fmp." } ], "responses": { @@ -14774,14 +12968,7 @@ }, "model": "EtfHoldingsPerformance", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "XLK", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.etf.holdings_performance(\"XLK\", provider=\"fmp\")" ] } }, @@ -14804,11 +12991,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -14819,13 +13002,13 @@ "required": true, "schema": { "type": "string", - "description": "Symbol to get data for. (Stock) Multiple comma separated items allowed for provider(s): fmp.", + "description": "Symbol to get data for. (Stock) Multiple items allowed for provider(s): fmp.", "multiple_items_allowed": [ "fmp" ], "title": "Symbol" }, - "description": "Symbol to get data for. (Stock) Multiple comma separated items allowed for provider(s): fmp." + "description": "Symbol to get data for. (Stock) Multiple items allowed for provider(s): fmp." } ], "responses": { @@ -14875,23 +13058,9 @@ }, "model": "EtfEquityExposure", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "MSFT", - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "description": "This function accepts multiple tickers.", - "parameters": { - "symbol": "MSFT,AAPL", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.etf.equity_exposure(\"MSFT\", provider=\"fmp\")", + "#### This function accepts multiple tickers. ####", + "obb.etf.equity_exposure(\"MSFT,AAPL\", provider=\"fmp\")" ] } }, @@ -14914,11 +13083,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fred" - ], "const": "fred", - "type": "string", "default": "fred", "title": "Provider" } @@ -15034,21 +13199,7 @@ }, "model": "AMERIBOR", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fred" - }, - "provider": "fred" - }, - { - "scope": "api", - "parameters": { - "parameter": "30_day_ma", - "provider": "fred" - }, - "provider": "fred" - } + "obb.fixedincome.rate.ameribor(parameter=\"30_day_ma\").to_df()" ] } }, @@ -15071,11 +13222,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fred" - ], "const": "fred", - "type": "string", "default": "fred", "title": "Provider" } @@ -15187,21 +13334,7 @@ }, "model": "SONIA", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fred" - }, - "provider": "fred" - }, - { - "scope": "api", - "parameters": { - "parameter": "total_nominal_value", - "provider": "fred" - }, - "provider": "fred" - } + "obb.fixedincome.rate.sonia(parameter=\"total_nominal_value\")" ] } }, @@ -15224,11 +13357,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fred" - ], "const": "fred", - "type": "string", "default": "fred", "title": "Provider" } @@ -15319,13 +13448,7 @@ }, "model": "IORB", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fred" - }, - "provider": "fred" - } + "obb.fixedincome.rate.iorb()" ] } }, @@ -15463,21 +13586,7 @@ }, "model": "FEDFUNDS", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fred" - }, - "provider": "fred" - }, - { - "scope": "api", - "parameters": { - "parameter": "daily", - "provider": "fred" - }, - "provider": "fred" - } + "obb.fixedincome.rate.effr(parameter=\"daily\", provider=\"fred\").to_df()" ] } }, @@ -15500,11 +13609,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fred" - ], "const": "fred", - "type": "string", "default": "fred", "title": "Provider" } @@ -15569,21 +13674,7 @@ }, "model": "PROJECTIONS", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fred" - }, - "provider": "fred" - }, - { - "scope": "api", - "parameters": { - "long_run": 1.0, - "provider": "fred" - }, - "provider": "fred" - } + "obb.fixedincome.rate.effr_forecast(long_run=True)" ] } }, @@ -15606,11 +13697,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fred" - ], "const": "fred", - "type": "string", "default": "fred", "title": "Provider" } @@ -15722,21 +13809,7 @@ }, "model": "ESTR", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fred" - }, - "provider": "fred" - }, - { - "scope": "api", - "parameters": { - "parameter": "number_of_active_banks", - "provider": "fred" - }, - "provider": "fred" - } + "obb.fixedincome.rate.estr(parameter=\"number_of_active_banks\")" ] } }, @@ -15759,11 +13832,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fred" - ], "const": "fred", - "type": "string", "default": "fred", "title": "Provider" } @@ -15871,21 +13940,7 @@ }, "model": "EuropeanCentralBankInterestRates", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fred" - }, - "provider": "fred" - }, - { - "scope": "api", - "parameters": { - "interest_rate_type": "refinancing", - "provider": "fred" - }, - "provider": "fred" - } + "obb.fixedincome.rate.ecb(interest_rate_type=\"refinancing\")" ] } }, @@ -15908,11 +13963,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fred" - ], "const": "fred", - "type": "string", "default": "fred", "title": "Provider" } @@ -16022,22 +14073,7 @@ }, "model": "DiscountWindowPrimaryCreditRate", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fred" - }, - "provider": "fred" - }, - { - "scope": "api", - "parameters": { - "start_date": "2023-02-01", - "end_date": "2023-05-01", - "provider": "fred" - }, - "provider": "fred" - } + "obb.fixedincome.rate.dpcredit(start_date=\"2023-02-01\", end_date=\"2023-05-01\").to_df()" ] } }, @@ -16060,11 +14096,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fred" - ], "const": "fred", - "type": "string", "default": "fred", "title": "Provider" } @@ -16178,21 +14210,7 @@ }, "model": "TreasuryConstantMaturity", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fred" - }, - "provider": "fred" - }, - { - "scope": "api", - "parameters": { - "maturity": "2y", - "provider": "fred" - }, - "provider": "fred" - } + "obb.fixedincome.fixedincome.spreads.tcm(maturity=\"2y\")" ] } }, @@ -16215,11 +14233,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fred" - ], "const": "fred", - "type": "string", "default": "fred", "title": "Provider" } @@ -16336,21 +14350,7 @@ }, "model": "SelectedTreasuryConstantMaturity", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fred" - }, - "provider": "fred" - }, - { - "scope": "api", - "parameters": { - "maturity": "10y", - "provider": "fred" - }, - "provider": "fred" - } + "obb.fixedincome.fixedincome.spreads.tcm_effr(maturity=\"10y\")" ] } }, @@ -16373,11 +14373,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fred" - ], "const": "fred", - "type": "string", "default": "fred", "title": "Provider" } @@ -16491,21 +14487,7 @@ }, "model": "SelectedTreasuryBill", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fred" - }, - "provider": "fred" - }, - { - "scope": "api", - "parameters": { - "maturity": "6m", - "provider": "fred" - }, - "provider": "fred" - } + "obb.fixedincome.fixedincome.spreads.treasury_effr(maturity=\"6m\")" ] } }, @@ -16528,11 +14510,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fred" - ], "const": "fred", - "type": "string", "default": "fred", "title": "Provider" } @@ -16623,21 +14601,7 @@ }, "model": "USYieldCurve", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fred" - }, - "provider": "fred" - }, - { - "scope": "api", - "parameters": { - "inflation_adjusted": 1.0, - "provider": "fred" - }, - "provider": "fred" - } + "obb.fixedincome.government.us_yield_curve(inflation_adjusted=True)" ] } }, @@ -16660,11 +14624,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "ecb" - ], "const": "ecb", - "type": "string", "default": "ecb", "title": "Provider" } @@ -16769,21 +14729,7 @@ }, "model": "EUYieldCurve", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "ecb" - }, - "provider": "ecb" - }, - { - "scope": "api", - "parameters": { - "yield_curve_type": "spot_rate", - "provider": "ecb" - }, - "provider": "ecb" - } + "obb.fixedincome.government.eu_yield_curve(yield_curve_type=\"spot_rate\")" ] } }, @@ -16900,13 +14846,7 @@ }, "model": "TreasuryRates", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.fixedincome.government.treasury_rates(provider=\"federal_reserve\")" ] } }, @@ -16929,11 +14869,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fred" - ], "const": "fred", - "type": "string", "default": "fred", "title": "Provider" } @@ -17120,21 +15056,7 @@ }, "model": "ICEBofA", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fred" - }, - "provider": "fred" - }, - { - "scope": "api", - "parameters": { - "index_type": "yield_to_worst", - "provider": "fred" - }, - "provider": "fred" - } + "obb.fixedincome.corporate.ice_bofa(index_type=\"yield_to_worst\")" ] } }, @@ -17157,11 +15079,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fred" - ], "const": "fred", - "type": "string", "default": "fred", "title": "Provider" } @@ -17290,21 +15208,7 @@ }, "model": "MoodyCorporateBondIndex", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fred" - }, - "provider": "fred" - }, - { - "scope": "api", - "parameters": { - "index_type": "baa", - "provider": "fred" - }, - "provider": "fred" - } + "obb.fixedincome.corporate.moody(index_type=\"baa\")" ] } }, @@ -17327,11 +15231,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fred" - ], "const": "fred", - "type": "string", "default": "fred", "title": "Provider" } @@ -17419,21 +15319,7 @@ }, "model": "HighQualityMarketCorporateBond", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fred" - }, - "provider": "fred" - }, - { - "scope": "api", - "parameters": { - "yield_curve": "par", - "provider": "fred" - }, - "provider": "fred" - } + "obb.fixedincome.corporate.hqm(yield_curve=\"par\")" ] } }, @@ -17456,11 +15342,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fred" - ], "const": "fred", - "type": "string", "default": "fred", "title": "Provider" } @@ -17508,41 +15390,38 @@ "in": "query", "required": false, "schema": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "string" - } + "type": "array", + "items": { + "type": "number" + }, + "description": "The maturities in years.", + "default": [ + 10.0 ], - "description": "Maturities in years. Multiple comma separated items allowed for provider(s): fred.", - "multiple_items_allowed": [ - "fred" - ], - "default": 10.0, "title": "Maturity" }, - "description": "Maturities in years. Multiple comma separated items allowed for provider(s): fred." + "description": "The maturities in years." }, { "name": "category", "in": "query", "required": false, "schema": { - "type": "string", - "description": "Rate category. Options: spot_rate, par_yield. Multiple comma separated items allowed for provider(s): fred.", - "choices": [ - "par_yield", + "type": "array", + "items": { + "enum": [ + "par_yield", + "spot_rate" + ], + "type": "string" + }, + "description": "The category.", + "default": [ "spot_rate" ], - "multiple_items_allowed": [ - "fred" - ], - "default": "spot_rate", "title": "Category" }, - "description": "Rate category. Options: spot_rate, par_yield. Multiple comma separated items allowed for provider(s): fred." + "description": "The category." } ], "responses": { @@ -17592,21 +15471,7 @@ }, "model": "SpotRate", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fred" - }, - "provider": "fred" - }, - { - "scope": "api", - "parameters": { - "maturity": "10,20,30,50", - "provider": "fred" - }, - "provider": "fred" - } + "obb.fixedincome.corporate.spot_rates(maturity=[10,20,30,50])" ] } }, @@ -17629,11 +15494,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fred" - ], "const": "fred", - "type": "string", "default": "fred", "title": "Provider" } @@ -17777,21 +15638,7 @@ }, "model": "CommercialPaper", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fred" - }, - "provider": "fred" - }, - { - "scope": "api", - "parameters": { - "maturity": "15d", - "provider": "fred" - }, - "provider": "fred" - } + "obb.fixedincome.corporate.commercial_paper(maturity=\"15d\")" ] } }, @@ -17814,11 +15661,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fred" - ], "const": "fred", - "type": "string", "default": "fred", "title": "Provider" } @@ -17928,21 +15771,7 @@ }, "model": "SOFR", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fred" - }, - "provider": "fred" - }, - { - "scope": "api", - "parameters": { - "period": "overnight", - "provider": "fred" - }, - "provider": "fred" - } + "obb.fixedincome.fixedincome.sofr(period=\"overnight\")" ] } }, @@ -17980,15 +15809,14 @@ "required": true, "schema": { "type": "string", - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio, polygon.", + "description": "Symbol to get data for. Multiple items allowed for provider(s): intrinio, polygon.", "multiple_items_allowed": [ - "fmp", "intrinio", "polygon" ], "title": "Symbol" }, - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio, polygon." + "description": "Symbol to get data for. Multiple items allowed for provider(s): intrinio, polygon." }, { "name": "start_date", @@ -18054,33 +15882,60 @@ "schema": { "anyOf": [ { - "type": "integer" + "type": "integer", + "exclusiveMinimum": 0 }, { "type": "null" } ], - "title": "intrinio,polygon", - "description": "The number of data entries to return. (provider: intrinio, polygon)", - "default": 10000 + "description": "The number of data entries to return.", + "default": 10000, + "title": "Limit" }, - "description": "The number of data entries to return. (provider: intrinio, polygon)" + "description": "The number of data entries to return." }, { "name": "sort", "in": "query", "required": false, "schema": { - "enum": [ - "asc", - "desc" + "anyOf": [ + { + "enum": [ + "asc", + "desc" + ], + "type": "string" + }, + { + "type": "null" + } ], - "type": "string", - "title": "polygon", - "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date. (provider: polygon)", - "default": "asc" + "description": "Sort the data in ascending or descending order.", + "default": "asc", + "title": "Sort" }, - "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date. (provider: polygon)" + "description": "Sort the data in ascending or descending order." + }, + { + "name": "timeseries", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "fmp", + "description": "Number of days to look back. (provider: fmp)" + }, + "description": "Number of days to look back. (provider: fmp)" } ], "responses": { @@ -18130,23 +15985,9 @@ }, "model": "IndexHistorical", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "^GSPC", - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "description": "Not all providers have the same symbols.", - "parameters": { - "symbol": "SPX", - "provider": "intrinio" - }, - "provider": "intrinio" - } + "obb.index.price.historical(\"^GSPC\", provider=\"fmp\").to_df()", + "#### Not all providers have the same symbols. ####", + "obb.index.price.historical(\"SPX\", provider=\"intrinio\").to_df()" ] } }, @@ -18185,15 +16026,10 @@ "required": true, "schema": { "type": "string", - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio, polygon.", - "multiple_items_allowed": [ - "fmp", - "intrinio", - "polygon" - ], + "description": "Symbol to get data for.", "title": "Symbol" }, - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): fmp, intrinio, polygon." + "description": "Symbol to get data for." }, { "name": "start_date", @@ -18233,43 +16069,45 @@ }, "description": "End date of the data, in YYYY-MM-DD format." }, + { + "name": "timeseries", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer", + "minimum": 0 + }, + { + "type": "null" + } + ], + "title": "fmp", + "description": "Number of days to look back. (provider: fmp)" + }, + "description": "Number of days to look back. (provider: fmp)" + }, { "name": "interval", "in": "query", "required": false, "schema": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } + "enum": [ + "1min", + "5min", + "15min", + "30min", + "1hour", + "4hour", + "1day" ], - "description": "Time interval of the data to return.", - "default": "1d", - "title": "Interval" + "type": "string", + "title": "fmp", + "description": "Data granularity. (provider: fmp)", + "default": "1day" }, - "description": "Time interval of the data to return." - }, - { - "name": "limit", - "in": "query", - "required": false, - "schema": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "intrinio,polygon", - "description": "The number of data entries to return. (provider: intrinio, polygon)", - "default": 10000 - }, - "description": "The number of data entries to return. (provider: intrinio, polygon)" + "description": "Data granularity. (provider: fmp)" }, { "name": "sort", @@ -18281,11 +16119,124 @@ "desc" ], "type": "string", - "title": "polygon", - "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date. (provider: polygon)", - "default": "asc" + "title": "fmp,intrinio,polygon", + "description": "Sort the data in ascending or descending order. (provider: fmp);\n Sort order. (provider: intrinio);\n Sort order of the data. (provider: polygon)", + "default": "desc" }, - "description": "Sort order of the data. This impacts the results in combination with the 'limit' parameter. The results are always returned in ascending order by date. (provider: polygon)" + "description": "Sort the data in ascending or descending order. (provider: fmp);\n Sort order. (provider: intrinio);\n Sort order of the data. (provider: polygon)" + }, + { + "name": "tag", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "intrinio", + "description": "Index tag. (provider: intrinio)", + "default": "level" + }, + "description": "Index tag. (provider: intrinio)" + }, + { + "name": "type", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "intrinio", + "description": "Index type. (provider: intrinio)" + }, + "description": "Index type. (provider: intrinio)" + }, + { + "name": "limit", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "title": "intrinio,polygon", + "description": "The number of data entries to return. (provider: intrinio, polygon)", + "default": 1000 + }, + "description": "The number of data entries to return. (provider: intrinio, polygon)" + }, + { + "name": "sleep", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "intrinio", + "description": "Time to sleep between requests to avoid rate limiting. (provider: intrinio)", + "default": 1.0 + }, + "description": "Time to sleep between requests to avoid rate limiting. (provider: intrinio)" + }, + { + "name": "timespan", + "in": "query", + "required": false, + "schema": { + "enum": [ + "minute", + "hour", + "day", + "week", + "month", + "quarter", + "year" + ], + "type": "string", + "title": "polygon", + "description": "Timespan of the data. (provider: polygon)", + "default": "day" + }, + "description": "Timespan of the data. (provider: polygon)" + }, + { + "name": "adjusted", + "in": "query", + "required": false, + "schema": { + "type": "boolean", + "title": "polygon", + "description": "Whether the data is adjusted. (provider: polygon)", + "default": true + }, + "description": "Whether the data is adjusted. (provider: polygon)" + }, + { + "name": "multiplier", + "in": "query", + "required": false, + "schema": { + "type": "integer", + "title": "polygon", + "description": "Multiplier of the timespan. (provider: polygon)", + "default": 1 + }, + "description": "Multiplier of the timespan. (provider: polygon)" } ], "responses": { @@ -18335,14 +16286,7 @@ }, "model": "MarketIndices", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "^IBEX", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.index.market(symbol=\"SPX\")" ] } }, @@ -18365,11 +16309,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -18433,14 +16373,9 @@ }, "model": "IndexConstituents", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "dowjones", - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.index.constituents(\"dowjones\", provider=\"fmp\").to_df()", + "#### Providers other than FMP will use the ticker symbol. ####", + "obb.index.constituents(\"BEP50P\", provider=\"cboe\").to_df()" ] } }, @@ -18463,11 +16398,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "fmp" - ], "const": "fmp", - "type": "string", "default": "fmp", "title": "Provider" } @@ -18520,13 +16451,7 @@ }, "model": "AvailableIndices", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fmp" - }, - "provider": "fmp" - } + "obb.index.available(provider=\"yfinance\").to_df()" ] } }, @@ -18552,7 +16477,8 @@ "enum": [ "benzinga", "fmp", - "intrinio" + "intrinio", + "tiingo" ], "type": "string", "title": "Provider" @@ -18820,6 +16746,43 @@ "description": "Content types of the news to retrieve. (provider: benzinga)" }, "description": "Content types of the news to retrieve. (provider: benzinga)" + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "tiingo", + "description": "Page offset, used in conjunction with limit. (provider: tiingo)", + "default": 0 + }, + "description": "Page offset, used in conjunction with limit. (provider: tiingo)" + }, + { + "name": "source", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "tiingo", + "description": "A comma-separated list of the domains requested. (provider: tiingo)" + }, + "description": "A comma-separated list of the domains requested. (provider: tiingo)" } ], "responses": { @@ -18869,49 +16832,17 @@ }, "model": "WorldNews", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "parameters": { - "limit": 100, - "provider": "intrinio" - }, - "provider": "intrinio" - }, - { - "scope": "api", - "description": "Get news on the specified dates.", - "parameters": { - "start_date": "2024-02-01", - "end_date": "2024-02-07", - "provider": "intrinio" - }, - "provider": "intrinio" - }, - { - "scope": "api", - "description": "Display the headlines of the news.", - "parameters": { - "display": "headline", - "provider": "benzinga" - }, - "provider": "benzinga" - }, - { - "scope": "api", - "description": "Get news by topics.", - "parameters": { - "topics": "finance", - "provider": "benzinga" - }, - "provider": "benzinga" - } + "obb.news.world(limit=2500)", + "# Get news on the specified dates.", + "obb.news.world(start_date='2024-02-01', end_date='2024-02-07')", + "# Display the headlines of the news.", + "obb.news.world(display='headline', provider='benzinga')", + "# Get news by topics.", + "obb.news.world(topics='finance', provider='benzinga')", + "# Get news by source using 'tingo' as provider.", + "obb.news.world(provider='tiingo', source='bloomberg')", + "# Filter aticles by term using 'biztoc' as provider.", + "obb.news.world(provider='biztoc', term='apple')" ] } }, @@ -18938,7 +16869,8 @@ "benzinga", "fmp", "intrinio", - "polygon" + "polygon", + "tiingo" ], "type": "string", "title": "Provider" @@ -18957,16 +16889,17 @@ "type": "null" } ], - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): benzinga, fmp, intrinio, polygon.", + "description": "Symbol to get data for. This endpoint will accept multiple symbols separated by commas. Multiple items allowed for provider(s): benzinga, fmp, intrinio, polygon, tiingo.", "multiple_items_allowed": [ "benzinga", "fmp", "intrinio", - "polygon" + "polygon", + "tiingo" ], "title": "Symbol" }, - "description": "Symbol to get data for. Multiple comma separated items allowed for provider(s): benzinga, fmp, intrinio, polygon." + "description": "Symbol to get data for. This endpoint will accept multiple symbols separated by commas. Multiple items allowed for provider(s): benzinga, fmp, intrinio, polygon, tiingo." }, { "name": "start_date", @@ -19264,6 +17197,43 @@ "default": 0 }, "description": "Page number of the results. Use in combination with limit. (provider: fmp)" + }, + { + "name": "offset", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "tiingo", + "description": "Page offset, used in conjunction with limit. (provider: tiingo)", + "default": 0 + }, + "description": "Page offset, used in conjunction with limit. (provider: tiingo)" + }, + { + "name": "source", + "in": "query", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "tiingo", + "description": "A comma-separated list of the domains requested. (provider: tiingo)" + }, + "description": "A comma-separated list of the domains requested. (provider: tiingo)" } ], "responses": { @@ -19313,61 +17283,15 @@ }, "model": "CompanyNews", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "benzinga" - }, - "provider": "benzinga" - }, - { - "scope": "api", - "parameters": { - "limit": 100, - "provider": "benzinga" - }, - "provider": "benzinga" - }, - { - "scope": "api", - "description": "Get news on the specified dates.", - "parameters": { - "symbol": "AAPL", - "start_date": "2024-02-01", - "end_date": "2024-02-07", - "provider": "intrinio" - }, - "provider": "intrinio" - }, - { - "scope": "api", - "description": "Display the headlines of the news.", - "parameters": { - "symbol": "AAPL", - "display": "headline", - "provider": "benzinga" - }, - "provider": "benzinga" - }, - { - "scope": "api", - "description": "Get news for multiple symbols.", - "parameters": { - "symbol": "aapl,tsla", - "provider": "fmp" - }, - "provider": "fmp" - }, - { - "scope": "api", - "description": "Get news company's ISIN.", - "parameters": { - "symbol": "NVDA", - "isin": "US0378331005", - "provider": "benzinga" - }, - "provider": "benzinga" - } + "obb.news.company(limit=2500)", + "# Get news on the specified dates.", + "obb.news.company(symbol='AAPL', start_date='2024-02-01', end_date='2024-02-07')", + "# Display the headlines of the news.", + "obb.news.company(symbol='AAPL', display='headline', provider='benzinga')", + "# Get news for multiple symbols.", + "obb.news.company(symbol='aapl,tsla')", + "# Get news company's ISIN.", + "obb.news.company(symbol='NVDA', isin='US0378331005')" ] } }, @@ -19390,11 +17314,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "sec" - ], "const": "sec", - "type": "string", "default": "sec", "title": "Provider" } @@ -19458,14 +17378,8 @@ }, "model": "CikMap", "examples": [ - { - "scope": "api", - "parameters": { - "symbol": "MSFT", - "provider": "sec" - }, - "provider": "sec" - } + "obb.regulators.sec.cik_map(symbol=\"MSFT\").results.cik", + " 0000789019" ] } }, @@ -19488,11 +17402,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "sec" - ], "const": "sec", - "type": "string", "default": "sec", "title": "Provider" } @@ -19576,21 +17486,7 @@ }, "model": "InstitutionsSearch", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "sec" - }, - "provider": "sec" - }, - { - "scope": "api", - "parameters": { - "query": "blackstone real estate", - "provider": "sec" - }, - "provider": "sec" - } + "obb.regulators.sec.institutions_search(query=\"blackstone real estate\").to_df()" ] } }, @@ -19613,11 +17509,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "sec" - ], "const": "sec", - "type": "string", "default": "sec", "title": "Provider" } @@ -19719,36 +17611,23 @@ }, "model": "SchemaFiles", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "sec" - }, - "provider": "sec" - }, - { - "scope": "python", - "description": "Get a list of schema files.", - "code": [ - "data = obb.regulators.sec.schema_files().results", - "data.files[0]", - "'https://xbrl.fasb.org/us-gaap/'", - "# The directory structure can be navigated by constructing a URL from the 'results' list.", - "url = data.files[0]+data.files[-1]", - "# The URL base will always be the 0 position in the list, feed the URL back in as a parameter.", - "obb.regulators.sec.schema_files(url=url).results.files", - "['https://xbrl.fasb.org/us-gaap/2024/'", - "'USGAAP2024FileList.xml'", - "'dis/'", - "'dqcrules/'", - "'ebp/'", - "'elts/'", - "'entire/'", - "'meta/'", - "'stm/'", - "'us-gaap-2024.zip']" - ] - } + "data = obb.regulators.sec.schema_files()", + "data.files[0]", + " https://xbrl.fasb.org/us-gaap/", + "#### The directory structure can be navigated by constructing a URL from the 'results' list. ####", + "url = data.files[0]+data.files[-1]", + "#### The URL base will always be the 0 position in the list, feed the URL back in as a parameter. ####", + "obb.regulators.sec.schema_files(url=url).results.files", + " ['https://xbrl.fasb.org/us-gaap/2024/'", + " 'USGAAP2024FileList.xml'", + " 'dis/'", + " 'dqcrules/'", + " 'ebp/'", + " 'elts/'", + " 'entire/'", + " 'meta/'", + " 'stm/'", + " 'us-gaap-2024.zip']" ] } }, @@ -19771,11 +17650,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "sec" - ], "const": "sec", - "type": "string", "default": "sec", "title": "Provider" } @@ -19783,10 +17658,11 @@ { "name": "query", "in": "query", - "required": true, + "required": false, "schema": { "type": "string", "description": "Search query.", + "default": "", "title": "Query" }, "description": "Search query." @@ -19858,14 +17734,8 @@ }, "model": "SymbolMap", "examples": [ - { - "scope": "api", - "parameters": { - "query": "0000789019", - "provider": "sec" - }, - "provider": "sec" - } + "obb.regulators.sec.symbol_map(\"0000789019\").results.symbol", + " MSFT" ] } }, @@ -19888,11 +17758,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "sec" - ], "const": "sec", - "type": "string", "default": "sec", "title": "Provider" } @@ -19945,13 +17811,7 @@ }, "model": "RssLitigation", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "sec" - }, - "provider": "sec" - } + "obb.regulators.sec.rss_litigation().to_dict(\"records\")[0]" ] } }, @@ -19974,11 +17834,7 @@ "in": "query", "required": false, "schema": { - "enum": [ - "sec" - ], "const": "sec", - "type": "string", "default": "sec", "title": "Provider" } @@ -20062,21 +17918,7 @@ }, "model": "SicSearch", "examples": [ - { - "scope": "api", - "parameters": { - "provider": "sec" - }, - "provider": "sec" - }, - { - "scope": "api", - "parameters": { - "query": "real estate investment trusts", - "provider": "sec" - }, - "provider": "sec" - } + "obb.regulators.sec.sic_search(\"real estate investment trusts\").results" ] } }, @@ -20103,7 +17945,6 @@ } ], "description": "Get information on a symbol, or a comma separated list of symbols.", - "default": "", "title": "Q" }, "description": "Get information on a symbol, or a comma separated list of symbols." @@ -20115,16 +17956,23 @@ "schema": { "anyOf": [ { - "type": "string" + "enum": [ + "stock", + "etf", + "index", + "indices", + "all", + null + ] }, { "type": "null" } ], - "description": "Filter by type(s). (stock, etf, index, indices, all) can be a comma separated list.", + "description": "Filter by type.", "title": "Type" }, - "description": "Filter by type(s). (stock, etf, index, indices, all) can be a comma separated list." + "description": "Filter by type." }, { "name": "ignore_type", @@ -20133,7 +17981,13 @@ "schema": { "anyOf": [ { - "type": "string" + "enum": [ + "stock", + "etf", + "index", + "indices", + null + ] }, { "type": "null" @@ -20169,32 +18023,6 @@ } } }, - "/search/currencies": { - "get": { - "tags": [ - "search" - ], - "summary": "Currencies", - "description": "Get supported tickers from the OpenBB SDK API.", - "operationId": "unique_currencies", - "responses": { - "200": { - "description": "Successful Response", - "content": { - "application/json": { - "schema": { - "items": { - "type": "string" - }, - "type": "array", - "title": "Response Unique Currencies" - } - } - } - } - } - } - }, "/search/fred": { "get": { "tags": [ @@ -20388,7 +18216,7 @@ "schema": { "type": "array", "items": { - "$ref": "#/components/schemas/UDFSearchResult" + "$ref": "#/components/schemas/UDFSymbolSearch" }, "title": "Response Query Udf Search" } @@ -20407,6 +18235,28 @@ } } } + }, + "/": { + "get": { + "summary": "Root", + "operationId": "root__get", + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "additionalProperties": { + "type": "string" + }, + "type": "object", + "title": "Response Root Get" + } + } + } + } + } + } } }, "components": { @@ -20514,8 +18364,8 @@ ], "title": "Overall Success Rate", "description": "The percentage (normalized) of gain/loss ratings that resulted in a gain overall.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "overall_avg_return_percentile": { "anyOf": [ @@ -20528,8 +18378,8 @@ ], "title": "Overall Avg Return Percentile", "description": "The percentile (normalized) of this analyst's overall average return per rating in comparison to other analysts' overall average returns per rating.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "total_ratings_percentile": { "anyOf": [ @@ -20542,8 +18392,8 @@ ], "title": "Total Ratings Percentile", "description": "The percentile (normalized) of this analyst's total number of ratings in comparison to the total number of ratings published by all other analysts", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "total_ratings": { "anyOf": [ @@ -20592,8 +18442,8 @@ ], "title": "Overall Average Return", "description": "The average percent (normalized) price difference per rating since the date of recommendation", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "overall_std_dev": { "anyOf": [ @@ -20606,8 +18456,8 @@ ], "title": "Overall Std Dev", "description": "The standard deviation in percent (normalized) price difference in the analyst's ratings since the date of recommendation", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "gain_count_1m": { "anyOf": [ @@ -20644,8 +18494,8 @@ ], "title": "Average Return 1M", "description": "The average percent (normalized) price difference per rating over the last month", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "std_dev_1m": { "anyOf": [ @@ -20658,8 +18508,8 @@ ], "title": "Std Dev 1M", "description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last month", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "gain_count_3m": { "anyOf": [ @@ -20696,8 +18546,8 @@ ], "title": "Average Return 3M", "description": "The average percent (normalized) price difference per rating over the last 3 months", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "std_dev_3m": { "anyOf": [ @@ -20710,8 +18560,8 @@ ], "title": "Std Dev 3M", "description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 3 months", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "gain_count_6m": { "anyOf": [ @@ -20748,8 +18598,8 @@ ], "title": "Average Return 6M", "description": "The average percent (normalized) price difference per rating over the last 6 months", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "std_dev_6m": { "anyOf": [ @@ -20762,8 +18612,8 @@ ], "title": "Std Dev 6M", "description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 6 months", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "gain_count_9m": { "anyOf": [ @@ -20800,8 +18650,8 @@ ], "title": "Average Return 9M", "description": "The average percent (normalized) price difference per rating over the last 9 months", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "std_dev_9m": { "anyOf": [ @@ -20814,8 +18664,8 @@ ], "title": "Std Dev 9M", "description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 9 months", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "gain_count_1y": { "anyOf": [ @@ -20852,8 +18702,8 @@ ], "title": "Average Return 1Y", "description": "The average percent (normalized) price difference per rating over the last 1 year", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "std_dev_1y": { "anyOf": [ @@ -20866,8 +18716,8 @@ ], "title": "Std Dev 1Y", "description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 1 year", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "gain_count_2y": { "anyOf": [ @@ -20904,8 +18754,8 @@ ], "title": "Average Return 2Y", "description": "The average percent (normalized) price difference per rating over the last 2 years", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "std_dev_2y": { "anyOf": [ @@ -20918,8 +18768,8 @@ ], "title": "Std Dev 2Y", "description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 2 years", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "gain_count_3y": { "anyOf": [ @@ -20956,8 +18806,8 @@ ], "title": "Average Return 3Y", "description": "The average percent (normalized) price difference per rating over the last 3 years", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "std_dev_3y": { "anyOf": [ @@ -20970,8 +18820,8 @@ ], "title": "Std Dev 3Y", "description": "The standard deviation in percent (normalized) price difference in the analyst's ratings over the last 3 years", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" } }, "additionalProperties": true, @@ -21487,7 +19337,7 @@ } ], "title": "Images", - "description": "Images associated with the article." + "description": "Images associated with the news." }, "text": { "anyOf": [ @@ -21645,9 +19495,6 @@ }, "ChartFormat": { "type": "string", - "enum": [ - "plotly" - ], "const": "plotly", "title": "ChartFormat" }, @@ -23363,8 +21210,8 @@ ], "title": "Rate", "description": "Yield curve rate, as a normalized percent.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent." } }, "additionalProperties": true, @@ -23386,242 +21233,102 @@ "description": "The date of the data." }, "estimated_revenue_low": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], + "type": "integer", "title": "Estimated Revenue Low", "description": "Estimated revenue low." }, "estimated_revenue_high": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], + "type": "integer", "title": "Estimated Revenue High", "description": "Estimated revenue high." }, "estimated_revenue_avg": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], + "type": "integer", "title": "Estimated Revenue Avg", "description": "Estimated revenue average." }, - "estimated_sga_expense_low": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Estimated Sga Expense Low", - "description": "Estimated SGA expense low." - }, - "estimated_sga_expense_high": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Estimated Sga Expense High", - "description": "Estimated SGA expense high." - }, - "estimated_sga_expense_avg": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Estimated Sga Expense Avg", - "description": "Estimated SGA expense average." - }, "estimated_ebitda_low": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], + "type": "integer", "title": "Estimated Ebitda Low", "description": "Estimated EBITDA low." }, "estimated_ebitda_high": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], + "type": "integer", "title": "Estimated Ebitda High", "description": "Estimated EBITDA high." }, "estimated_ebitda_avg": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], + "type": "integer", "title": "Estimated Ebitda Avg", "description": "Estimated EBITDA average." }, "estimated_ebit_low": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], + "type": "integer", "title": "Estimated Ebit Low", "description": "Estimated EBIT low." }, "estimated_ebit_high": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], + "type": "integer", "title": "Estimated Ebit High", "description": "Estimated EBIT high." }, "estimated_ebit_avg": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], + "type": "integer", "title": "Estimated Ebit Avg", "description": "Estimated EBIT average." }, "estimated_net_income_low": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], + "type": "integer", "title": "Estimated Net Income Low", "description": "Estimated net income low." }, "estimated_net_income_high": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], + "type": "integer", "title": "Estimated Net Income High", "description": "Estimated net income high." }, "estimated_net_income_avg": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], + "type": "integer", "title": "Estimated Net Income Avg", "description": "Estimated net income average." }, + "estimated_sga_expense_low": { + "type": "integer", + "title": "Estimated Sga Expense Low", + "description": "Estimated SGA expense low." + }, + "estimated_sga_expense_high": { + "type": "integer", + "title": "Estimated Sga Expense High", + "description": "Estimated SGA expense high." + }, + "estimated_sga_expense_avg": { + "type": "integer", + "title": "Estimated Sga Expense Avg", + "description": "Estimated SGA expense average." + }, "estimated_eps_avg": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], + "type": "number", "title": "Estimated Eps Avg", "description": "Estimated EPS average." }, "estimated_eps_high": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], + "type": "number", "title": "Estimated Eps High", "description": "Estimated EPS high." }, "estimated_eps_low": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], + "type": "number", "title": "Estimated Eps Low", "description": "Estimated EPS low." }, "number_analyst_estimated_revenue": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], + "type": "integer", "title": "Number Analyst Estimated Revenue", "description": "Number of analysts who estimated revenue." }, "number_analysts_estimated_eps": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], + "type": "integer", "title": "Number Analysts Estimated Eps", "description": "Number of analysts who estimated EPS." } @@ -23630,7 +21337,27 @@ "type": "object", "required": [ "symbol", - "date" + "date", + "estimated_revenue_low", + "estimated_revenue_high", + "estimated_revenue_avg", + "estimated_ebitda_low", + "estimated_ebitda_high", + "estimated_ebitda_avg", + "estimated_ebit_low", + "estimated_ebit_high", + "estimated_ebit_avg", + "estimated_net_income_low", + "estimated_net_income_high", + "estimated_net_income_avg", + "estimated_sga_expense_low", + "estimated_sga_expense_high", + "estimated_sga_expense_avg", + "estimated_eps_avg", + "estimated_eps_high", + "estimated_eps_low", + "number_analyst_estimated_revenue", + "number_analysts_estimated_eps" ], "title": "FMPAnalystEstimates", "description": "FMP Analyst Estimates Data." @@ -25304,7 +23031,8 @@ "type": "null" } ], - "title": "Free Cash Flow" + "title": "Free Cash Flow", + "description": "Free cash flow." }, "link": { "anyOf": [ @@ -26192,6 +23920,18 @@ "title": "Adj Close", "description": "The adjusted close price." }, + "unadjusted_volume": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Unadjusted Volume", + "description": "Unadjusted volume of the symbol." + }, "change": { "anyOf": [ { @@ -26202,7 +23942,7 @@ } ], "title": "Change", - "description": "Change in the price from the previous close." + "description": "Change in the price of the symbol from the previous day." }, "change_percent": { "anyOf": [ @@ -26214,9 +23954,31 @@ } ], "title": "Change Percent", - "description": "Change in the price from the previous close, as a normalized percent.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "description": "Change % in the price of the symbol." + }, + "label": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Label", + "description": "Human readable format of the date." + }, + "change_over_time": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Change Over Time", + "description": "Change % in the price of the symbol over a period of time." } }, "additionalProperties": true, @@ -26351,8 +24113,7 @@ "vwap": { "anyOf": [ { - "type": "number", - "exclusiveMinimum": 0.0 + "type": "number" }, { "type": "null" @@ -26373,6 +24134,18 @@ "title": "Adj Close", "description": "The adjusted close price." }, + "unadjusted_volume": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Unadjusted Volume", + "description": "Unadjusted volume of the symbol." + }, "change": { "anyOf": [ { @@ -26383,7 +24156,7 @@ } ], "title": "Change", - "description": "Change in the price from the previous close." + "description": "Change in the price of the symbol from the previous day." }, "change_percent": { "anyOf": [ @@ -26395,9 +24168,31 @@ } ], "title": "Change Percent", - "description": "Change in the price from the previous close, as a normalized percent.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "description": "Change % in the price of the symbol." + }, + "label": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Label", + "description": "Human readable format of the date." + }, + "change_over_time": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Change Over Time", + "description": "Change % in the price of the symbol over a period of time." } }, "additionalProperties": true, @@ -26464,193 +24259,6 @@ "title": "FMPCurrencyPairs", "description": "FMP Currency Available Pairs Data." }, - "FMPCurrencySnapshots": { - "properties": { - "base_currency": { - "type": "string", - "title": "Base Currency", - "description": "The base, or domestic, currency." - }, - "counter_currency": { - "type": "string", - "title": "Counter Currency", - "description": "The counter, or foreign, currency." - }, - "last_rate": { - "type": "number", - "title": "Last Rate", - "description": "The exchange rate, relative to the base currency. Rates are expressed as the amount of foreign currency received from selling one unit of the base currency, or the quantity of foreign currency required to purchase one unit of the domestic currency. To inverse the perspective, set the 'quote_type' parameter as 'direct'." - }, - "open": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Open", - "description": "The open price." - }, - "high": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "High", - "description": "The high price." - }, - "low": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Low", - "description": "The low price." - }, - "close": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Close", - "description": "The close price." - }, - "volume": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Volume", - "description": "The trading volume." - }, - "prev_close": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Prev Close", - "description": "The previous close price." - }, - "change": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Change", - "description": "The change in the price from the previous close." - }, - "change_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Change Percent", - "description": "The change in the price from the previous close, as a normalized percent.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "ma_50": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Ma 50", - "description": "The 50-day moving average." - }, - "ma_200": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Ma 200", - "description": "The 200-day moving average." - }, - "year_high": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Year High", - "description": "The 52-week high." - }, - "year_low": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Year Low", - "description": "The 52-week low." - }, - "last_rate_timestamp": { - "anyOf": [ - { - "type": "string", - "format": "date-time" - }, - { - "type": "null" - } - ], - "title": "Last Rate Timestamp", - "description": "The timestamp of the last rate." - } - }, - "additionalProperties": true, - "type": "object", - "required": [ - "base_currency", - "counter_currency", - "last_rate" - ], - "title": "FMPCurrencySnapshots", - "description": "FMP Currency Snapshots Data." - }, "FMPDiscoveryFilings": { "properties": { "symbol": { @@ -27060,7 +24668,19 @@ } ], "title": "Symbol", - "description": "Symbol of the equity." + "description": "Symbol representing the entity requested in the data." + }, + "label": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Label", + "description": "Human readable format of the date." }, "adj_close": { "anyOf": [ @@ -27096,7 +24716,7 @@ } ], "title": "Change", - "description": "Change in the price from the previous close." + "description": "Change in the price of the symbol from the previous day." }, "change_percent": { "anyOf": [ @@ -27108,9 +24728,19 @@ } ], "title": "Change Percent", - "description": "Change in the price from the previous close, as a normalized percent.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "description": "Change % in the price of the symbol." + }, + "change_over_time": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Change Over Time", + "description": "Change % in the price of the symbol over a period of time." } }, "additionalProperties": true, @@ -28381,7 +26011,7 @@ } ], "title": "Prev Close", - "description": "The previous close price." + "description": "The closing price of the previous trading day." }, "change": { "anyOf": [ @@ -28522,6 +26152,9 @@ "type": "string", "format": "date-time" }, + { + "type": "string" + }, { "type": "null" } @@ -29479,7 +27112,7 @@ "shares": { "anyOf": [ { - "type": "number" + "type": "integer" }, { "type": "null" @@ -29500,7 +27133,7 @@ "title": "Weight", "description": "The weight of the equity in the ETF, as a normalized percent.", "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "x-units_measurement": "percent" }, "market_value": { "anyOf": [ @@ -29840,11 +27473,6 @@ }, "FMPEtfHoldingsPerformance": { "properties": { - "symbol": { - "type": "string", - "title": "Symbol", - "description": "The ticker symbol." - }, "one_day": { "anyOf": [ { @@ -29985,20 +27613,6 @@ "x-frontend_multiply": 100, "x-unit_measurement": "percent" }, - "two_year": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Two Year", - "description": "Two-year return.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, "three_year": { "anyOf": [ { @@ -30013,20 +27627,6 @@ "x-frontend_multiply": 100, "x-unit_measurement": "percent" }, - "four_year": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Four Year", - "description": "Four-year", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, "five_year": { "anyOf": [ { @@ -30068,6 +27668,11 @@ "description": "Return from the beginning of the time series.", "x-frontend_multiply": 100, "x-unit_measurement": "percent" + }, + "symbol": { + "type": "string", + "title": "Symbol", + "description": "The ticker symbol." } }, "additionalProperties": true, @@ -30490,175 +28095,85 @@ "title": "Cik", "description": "Central Index Key (CIK) for the requested entity." }, - "company_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Company Name", - "description": "The name of the company." - }, - "industry": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Industry", - "description": "The industry of the company." - }, - "year": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Year", - "description": "Year of the compensation." - }, - "name_and_position": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Name And Position", - "description": "Name and position." - }, - "salary": { - "anyOf": [ - { - "type": "number", - "minimum": 0.0 - }, - { - "type": "null" - } - ], - "title": "Salary", - "description": "Salary." - }, - "bonus": { - "anyOf": [ - { - "type": "number", - "minimum": 0.0 - }, - { - "type": "null" - } - ], - "title": "Bonus", - "description": "Bonus payments." - }, - "stock_award": { - "anyOf": [ - { - "type": "number", - "minimum": 0.0 - }, - { - "type": "null" - } - ], - "title": "Stock Award", - "description": "Stock awards." - }, - "incentive_plan_compensation": { - "anyOf": [ - { - "type": "number", - "minimum": 0.0 - }, - { - "type": "null" - } - ], - "title": "Incentive Plan Compensation", - "description": "Incentive plan compensation." - }, - "all_other_compensation": { - "anyOf": [ - { - "type": "number", - "minimum": 0.0 - }, - { - "type": "null" - } - ], - "title": "All Other Compensation", - "description": "All other compensation." - }, - "total": { - "anyOf": [ - { - "type": "number", - "minimum": 0.0 - }, - { - "type": "null" - } - ], - "title": "Total", - "description": "Total compensation." - }, "filing_date": { - "anyOf": [ - { - "type": "string", - "format": "date" - }, - { - "type": "null" - } - ], + "type": "string", + "format": "date", "title": "Filing Date", "description": "Date of the filing." }, "accepted_date": { - "anyOf": [ - { - "type": "string", - "format": "date-time" - }, - { - "type": "null" - } - ], + "type": "string", + "format": "date-time", "title": "Accepted Date", "description": "Date the filing was accepted." }, + "name_and_position": { + "type": "string", + "title": "Name And Position", + "description": "Name and position of the executive." + }, + "year": { + "type": "integer", + "title": "Year", + "description": "Year of the compensation." + }, + "salary": { + "type": "number", + "minimum": 0.0, + "title": "Salary", + "description": "Salary of the executive." + }, + "bonus": { + "type": "number", + "minimum": 0.0, + "title": "Bonus", + "description": "Bonus of the executive." + }, + "stock_award": { + "type": "number", + "minimum": 0.0, + "title": "Stock Award", + "description": "Stock award of the executive." + }, + "incentive_plan_compensation": { + "type": "number", + "minimum": 0.0, + "title": "Incentive Plan Compensation", + "description": "Incentive plan compensation of the executive." + }, + "all_other_compensation": { + "type": "number", + "minimum": 0.0, + "title": "All Other Compensation", + "description": "All other compensation of the executive." + }, + "total": { + "type": "number", + "minimum": 0.0, + "title": "Total", + "description": "Total compensation of the executive." + }, "url": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], + "type": "string", "title": "Url", - "description": "URL to the filing data." + "description": "URL of the filing data." } }, "additionalProperties": true, "type": "object", "required": [ - "symbol" + "symbol", + "filing_date", + "accepted_date", + "name_and_position", + "year", + "salary", + "bonus", + "stock_award", + "incentive_plan_compensation", + "all_other_compensation", + "total", + "url" ], "title": "FMPExecutiveCompensation", "description": "FMP Executive Compensation Data." @@ -31650,47 +29165,29 @@ "title": "Date", "description": "The date of the data." }, + "label": { + "type": "string", + "title": "Label", + "description": "Label of the historical stock splits." + }, "numerator": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], + "type": "number", "title": "Numerator", - "description": "Numerator of the split." + "description": "Numerator of the historical stock splits." }, "denominator": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], + "type": "number", "title": "Denominator", - "description": "Denominator of the split." - }, - "split_ratio": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Split Ratio", - "description": "Split ratio." + "description": "Denominator of the historical stock splits." } }, "additionalProperties": true, "type": "object", "required": [ - "date" + "date", + "label", + "numerator", + "denominator" ], "title": "FMPHistoricalSplits", "description": "FMP Historical Splits Data." @@ -31727,6 +29224,18 @@ "title": "Fiscal Year", "description": "The fiscal year of the fiscal period." }, + "symbol": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Symbol", + "description": "Symbol representing the entity requested in the data." + }, "filing_date": { "anyOf": [ { @@ -32503,7 +30012,7 @@ "title": "Volume", "description": "The trading volume." }, - "vwap": { + "adj_close": { "anyOf": [ { "type": "number" @@ -32512,8 +30021,20 @@ "type": "null" } ], - "title": "Vwap", - "description": "Volume Weighted Average Price over the period." + "title": "Adj Close", + "description": "The adjusted close price." + }, + "unadjusted_volume": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Unadjusted Volume", + "description": "Unadjusted volume of the symbol." }, "change": { "anyOf": [ @@ -32525,7 +30046,7 @@ } ], "title": "Change", - "description": "Change in the price from the previous close." + "description": "Change in the price of the symbol from the previous day." }, "change_percent": { "anyOf": [ @@ -32537,9 +30058,31 @@ } ], "title": "Change Percent", - "description": "Change in the price from the previous close, as a normalized percent.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "description": "Change % in the price of the symbol." + }, + "label": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Label", + "description": "Human readable format of the date." + }, + "change_over_time": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Change Over Time", + "description": "Change % in the price of the symbol over a period of time." } }, "additionalProperties": true, @@ -33791,12 +31334,13 @@ "title": "FMPKeyMetrics", "description": "FMP Key Metrics Data." }, - "FMPMarketSnapshots": { + "FMPMarketIndices": { "properties": { - "symbol": { + "date": { "type": "string", - "title": "Symbol", - "description": "Symbol representing the entity requested in the data." + "format": "date-time", + "title": "Date", + "description": "The date of the data." }, "open": { "anyOf": [ @@ -33858,6 +31402,142 @@ "title": "Volume", "description": "The trading volume." }, + "adj_close": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Adj Close", + "description": "The adjusted close price." + }, + "unadjusted_volume": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Unadjusted Volume", + "description": "Unadjusted volume of the symbol." + }, + "change": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Change", + "description": "Change in the price of the symbol from the previous day." + }, + "change_percent": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Change Percent", + "description": "Change % in the price of the symbol." + }, + "label": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Label", + "description": "Human readable format of the date." + }, + "change_over_time": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Change Over Time", + "description": "Change % in the price of the symbol over a period of time." + } + }, + "additionalProperties": true, + "type": "object", + "required": [ + "date" + ], + "title": "FMPMarketIndices", + "description": "FMP Market Indices Data." + }, + "FMPMarketSnapshots": { + "properties": { + "symbol": { + "type": "string", + "title": "Symbol", + "description": "Symbol representing the entity requested in the data." + }, + "open": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Open", + "description": "The open price." + }, + "high": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "High", + "description": "The high price." + }, + "low": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Low", + "description": "The low price." + }, + "close": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Close", + "description": "The close price." + }, "prev_close": { "anyOf": [ { @@ -33880,7 +31560,7 @@ } ], "title": "Change", - "description": "The change in price from the previous close." + "description": "The change in price." }, "change_percent": { "anyOf": [ @@ -33892,11 +31572,21 @@ } ], "title": "Change Percent", - "description": "The change in price from the previous close, as a normalized percent.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "description": "The change, as a percent." }, - "last_price": { + "volume": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Volume", + "description": "The trading volume." + }, + "price": { "anyOf": [ { "type": "number" @@ -33905,25 +31595,20 @@ "type": "null" } ], - "title": "Last Price", + "title": "Price", "description": "The last price of the stock." }, - "last_price_timestamp": { + "avg_volume": { "anyOf": [ { - "type": "string", - "format": "date" - }, - { - "type": "string", - "format": "date-time" + "type": "integer" }, { "type": "null" } ], - "title": "Last Price Timestamp", - "description": "The timestamp of the last price." + "title": "Avg Volume", + "description": "Average volume of the stock." }, "ma50": { "anyOf": [ @@ -33973,22 +31658,10 @@ "title": "Year Low", "description": "The 52-week low." }, - "volume_avg": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Volume Avg", - "description": "Average daily trading volume." - }, "market_cap": { "anyOf": [ { - "type": "integer" + "type": "number" }, { "type": "null" @@ -33997,6 +31670,18 @@ "title": "Market Cap", "description": "Market cap of the stock." }, + "shares_outstanding": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Shares Outstanding", + "description": "Number of shares outstanding." + }, "eps": { "anyOf": [ { @@ -34021,30 +31706,6 @@ "title": "Pe", "description": "Price to earnings ratio." }, - "shares_outstanding": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Shares Outstanding", - "description": "Number of shares outstanding." - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Name", - "description": "The company name associated with the symbol." - }, "exchange": { "anyOf": [ { @@ -34057,22 +31718,44 @@ "title": "Exchange", "description": "The exchange of the stock." }, - "earnings_date": { + "timestamp": { "anyOf": [ { - "type": "string", - "format": "date" + "type": "number" }, { - "type": "string", - "format": "date-time" + "type": "integer" }, { "type": "null" } ], - "title": "Earnings Date", - "description": "The upcoming earnings announcement date." + "title": "Timestamp", + "description": "The timestamp of the data." + }, + "earnings_announcement": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Earnings Announcement", + "description": "The earnings announcement of the stock." + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name", + "description": "The name associated with the stock symbol." } }, "additionalProperties": true, @@ -34085,11 +31768,6 @@ }, "FMPPricePerformance": { "properties": { - "symbol": { - "type": "string", - "title": "Symbol", - "description": "The ticker symbol." - }, "one_day": { "anyOf": [ { @@ -34230,20 +31908,6 @@ "x-frontend_multiply": 100, "x-unit_measurement": "percent" }, - "two_year": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Two Year", - "description": "Two-year return.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, "three_year": { "anyOf": [ { @@ -34258,20 +31922,6 @@ "x-frontend_multiply": 100, "x-unit_measurement": "percent" }, - "four_year": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Four Year", - "description": "Four-year", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, "five_year": { "anyOf": [ { @@ -34313,6 +31963,11 @@ "description": "Return from the beginning of the time series.", "x-frontend_multiply": 100, "x-unit_measurement": "percent" + }, + "symbol": { + "type": "string", + "title": "Symbol", + "description": "The ticker symbol." } }, "additionalProperties": true, @@ -34927,83 +32582,6 @@ ], "title": "Exchange" }, - "currency": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Currency" - }, - "industry": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Industry" - }, - "sector": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Sector" - }, - "country": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Country" - }, - "cik": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Cik" - }, - "isin": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Isin" - }, - "cusip": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Cusip" - }, "type": { "anyOf": [ { @@ -35068,8 +32646,8 @@ ], "title": "Week 4", "description": "4 week Treasury bills rate (secondary market).", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "month_1": { "anyOf": [ @@ -35082,8 +32660,8 @@ ], "title": "Month 1", "description": "1 month Treasury rate.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "month_2": { "anyOf": [ @@ -35096,8 +32674,8 @@ ], "title": "Month 2", "description": "2 month Treasury rate.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "month_3": { "anyOf": [ @@ -35110,8 +32688,8 @@ ], "title": "Month 3", "description": "3 month Treasury rate.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "month_6": { "anyOf": [ @@ -35124,8 +32702,8 @@ ], "title": "Month 6", "description": "6 month Treasury rate.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "year_1": { "anyOf": [ @@ -35138,8 +32716,8 @@ ], "title": "Year 1", "description": "1 year Treasury rate.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "year_2": { "anyOf": [ @@ -35152,8 +32730,8 @@ ], "title": "Year 2", "description": "2 year Treasury rate.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "year_3": { "anyOf": [ @@ -35166,8 +32744,8 @@ ], "title": "Year 3", "description": "3 year Treasury rate.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "year_5": { "anyOf": [ @@ -35180,8 +32758,8 @@ ], "title": "Year 5", "description": "5 year Treasury rate.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "year_7": { "anyOf": [ @@ -35194,8 +32772,8 @@ ], "title": "Year 7", "description": "7 year Treasury rate.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "year_10": { "anyOf": [ @@ -35208,8 +32786,8 @@ ], "title": "Year 10", "description": "10 year Treasury rate.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "year_20": { "anyOf": [ @@ -35222,8 +32800,8 @@ ], "title": "Year 20", "description": "20 year Treasury rate.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "year_30": { "anyOf": [ @@ -35236,8 +32814,8 @@ ], "title": "Year 30", "description": "30 year Treasury rate.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" } }, "additionalProperties": true, @@ -35277,7 +32855,7 @@ } ], "title": "Images", - "description": "Images associated with the article." + "description": "Images associated with the news." }, "text": { "anyOf": [ @@ -36106,8 +33684,8 @@ ], "title": "Week 4", "description": "4 week Treasury bills rate (secondary market).", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "month_1": { "anyOf": [ @@ -36120,8 +33698,8 @@ ], "title": "Month 1", "description": "1 month Treasury rate.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "month_2": { "anyOf": [ @@ -36134,8 +33712,8 @@ ], "title": "Month 2", "description": "2 month Treasury rate.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "month_3": { "anyOf": [ @@ -36148,8 +33726,8 @@ ], "title": "Month 3", "description": "3 month Treasury rate.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "month_6": { "anyOf": [ @@ -36162,8 +33740,8 @@ ], "title": "Month 6", "description": "6 month Treasury rate.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "year_1": { "anyOf": [ @@ -36176,8 +33754,8 @@ ], "title": "Year 1", "description": "1 year Treasury rate.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "year_2": { "anyOf": [ @@ -36190,8 +33768,8 @@ ], "title": "Year 2", "description": "2 year Treasury rate.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "year_3": { "anyOf": [ @@ -36204,8 +33782,8 @@ ], "title": "Year 3", "description": "3 year Treasury rate.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "year_5": { "anyOf": [ @@ -36218,8 +33796,8 @@ ], "title": "Year 5", "description": "5 year Treasury rate.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "year_7": { "anyOf": [ @@ -36232,8 +33810,8 @@ ], "title": "Year 7", "description": "7 year Treasury rate.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "year_10": { "anyOf": [ @@ -36246,8 +33824,8 @@ ], "title": "Year 10", "description": "10 year Treasury rate.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "year_20": { "anyOf": [ @@ -36260,8 +33838,8 @@ ], "title": "Year 20", "description": "20 year Treasury rate.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" }, "year_30": { "anyOf": [ @@ -36274,8 +33852,8 @@ ], "title": "Year 30", "description": "30 year Treasury rate.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "frontend_multiply": 100, + "unit_measurement": "percent" } }, "additionalProperties": true, @@ -37910,7 +35488,7 @@ } ], "title": "Status", - "description": "The status of the IPO. Upcoming IPOs have not taken place yet but are expected to. Priced IPOs have taken place. Withdrawn IPOs were expected to take place, but were subsequently withdrawn." + "description": "\n The status of the IPO. Upcoming IPOs have not taken place yet but are expected to.\n Priced IPOs have taken place.\n Withdrawn IPOs were expected to take place, but were subsequently withdrawn and did not take place\n " }, "exchange": { "anyOf": [ @@ -37922,7 +35500,7 @@ } ], "title": "Exchange", - "description": "The acronym of the stock exchange that the company is going to trade publicly on. Typically NYSE or NASDAQ." + "description": "\n The acronym of the stock exchange that the company is going to trade publicly on.\n Typically NYSE or NASDAQ.\n " }, "offer_amount": { "anyOf": [ @@ -37958,7 +35536,7 @@ } ], "title": "Share Price Lowest", - "description": "The expected lowest price per share at which the IPO will be offered. Before an IPO is priced, companies typically provide a range of prices per share at which they expect to offer the IPO (typically available for upcoming IPOs)." + "description": "\n The expected lowest price per share at which the IPO will be offered.\n Before an IPO is priced, companies typically provide a range of prices per share at which\n they expect to offer the IPO (typically available for upcoming IPOs).\n " }, "share_price_highest": { "anyOf": [ @@ -37970,7 +35548,7 @@ } ], "title": "Share Price Highest", - "description": "The expected highest price per share at which the IPO will be offered. Before an IPO is priced, companies typically provide a range of prices per share at which they expect to offer the IPO (typically available for upcoming IPOs)." + "description": "\n The expected highest price per share at which the IPO will be offered.\n Before an IPO is priced, companies typically provide a range of prices per share at which\n they expect to offer the IPO (typically available for upcoming IPOs).\n " }, "share_count": { "anyOf": [ @@ -37994,7 +35572,7 @@ } ], "title": "Share Count Lowest", - "description": "The expected lowest number of shares that will be offered in the IPO. Before an IPO is priced, companies typically provide a range of shares that they expect to offer in the IPO (typically available for upcoming IPOs)." + "description": "\n The expected lowest number of shares that will be offered in the IPO. Before an IPO is priced,\n companies typically provide a range of shares that they expect to offer in the IPO\n (typically available for upcoming IPOs).\n " }, "share_count_highest": { "anyOf": [ @@ -38006,7 +35584,7 @@ } ], "title": "Share Count Highest", - "description": "The expected highest number of shares that will be offered in the IPO. Before an IPO is priced, companies typically provide a range of shares that they expect to offer in the IPO (typically available for upcoming IPOs)." + "description": "\n The expected highest number of shares that will be offered in the IPO. Before an IPO is priced,\n companies typically provide a range of shares that they expect to offer in the IPO\n (typically available for upcoming IPOs).\n " }, "announcement_url": { "anyOf": [ @@ -38030,7 +35608,7 @@ } ], "title": "Sec Report Url", - "description": "The URL to the company's S-1, S-1/A, F-1, or F-1/A SEC filing, which is required to be filed before an IPO takes place." + "description": "\n The URL to the company's S-1, S-1/A, F-1, or F-1/A SEC filing,\n which is required to be filed before an IPO takes place.\n " }, "open_price": { "anyOf": [ @@ -38078,7 +35656,7 @@ } ], "title": "Day Change", - "description": "The percentage change between the open price and the close price on the first trading day (only available for priced IPOs)." + "description": "\n The percentage change between the open price and the close price on the first trading day\n (only available for priced IPOs).\n " }, "week_change": { "anyOf": [ @@ -38090,7 +35668,7 @@ } ], "title": "Week Change", - "description": "The percentage change between the open price on the first trading day and the close price approximately a week after the first trading day (only available for priced IPOs)." + "description": "\n The percentage change between the open price on the first trading day and the close price approximately\n a week after the first trading day (only available for priced IPOs).\n " }, "month_change": { "anyOf": [ @@ -38102,7 +35680,7 @@ } ], "title": "Month Change", - "description": "The percentage change between the open price on the first trading day and the close price approximately a month after the first trading day (only available for priced IPOs)." + "description": "\n The percentage change between the open price on the first trading day and the close price approximately\n a month after the first trading day (only available for priced IPOs).\n " }, "id": { "anyOf": [ @@ -38188,30 +35766,6 @@ "title": "Reported Currency", "description": "The currency in which the balance sheet is reported." }, - "net_income_continuing_operations": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Net Income Continuing Operations", - "description": "Net Income (Continuing Operations)" - }, - "net_income_discontinued_operations": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Net Income Discontinued Operations", - "description": "Net Income (Discontinued Operations)" - }, "net_income": { "anyOf": [ { @@ -38332,6 +35886,30 @@ "title": "Net Cash From Discontinued Operating Activities", "description": "Net Cash from Discontinued Operating Activities" }, + "net_income_continuing_operations": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Net Income Continuing Operations", + "description": "Net Income (Continuing Operations)" + }, + "net_income_discontinued_operations": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Net Income Discontinued Operations", + "description": "Net Income (Discontinued Operations)" + }, "net_cash_from_operating_activities": { "anyOf": [ { @@ -39097,164 +36675,6 @@ "title": "Vwap", "description": "Volume Weighted Average Price over the period." }, - "average": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Average", - "description": "Average trade price of an individual equity during the interval." - }, - "change": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Change", - "description": "Change in the price of the symbol from the previous day." - }, - "change_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Change Percent", - "description": "Percent change in the price of the symbol from the previous day.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "adj_open": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Adj Open", - "description": "The adjusted open price." - }, - "adj_high": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Adj High", - "description": "The adjusted high price." - }, - "adj_low": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Adj Low", - "description": "The adjusted low price." - }, - "adj_close": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Adj Close", - "description": "The adjusted close price." - }, - "adj_volume": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Adj Volume", - "description": "The adjusted volume." - }, - "fifty_two_week_high": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Fifty Two Week High", - "description": "52 week high price for the symbol." - }, - "fifty_two_week_low": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Fifty Two Week Low", - "description": "52 week low price for the symbol." - }, - "factor": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Factor", - "description": "factor by which to multiply equity prices before this date, in order to calculate historically-adjusted equity prices." - }, - "split_ratio": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Split Ratio", - "description": "Ratio of the equity split, if a split occurred." - }, - "dividend": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Dividend", - "description": "Dividend amount, if a dividend was paid." - }, "close_time": { "anyOf": [ { @@ -39280,6 +36700,30 @@ "title": "Interval", "description": "The data time frequency." }, + "average": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Average", + "description": "Average trade price of an individual equity during the interval." + }, + "change": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Change", + "description": "Change in the price of the symbol from the previous day." + }, "intra_period": { "anyOf": [ { @@ -39291,6 +36735,138 @@ ], "title": "Intra Period", "description": "If true, the equity price represents an unfinished period (be it day, week, quarter, month, or year), meaning that the close price is the latest price available, not the official close price for the period" + }, + "adj_open": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Adj Open", + "description": "Adjusted open price during the period." + }, + "adj_high": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Adj High", + "description": "Adjusted high price during the period." + }, + "adj_low": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Adj Low", + "description": "Adjusted low price during the period." + }, + "adj_close": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Adj Close", + "description": "Adjusted closing price during the period." + }, + "adj_volume": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Adj Volume", + "description": "Adjusted volume during the period." + }, + "factor": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Factor", + "description": "factor by which to multiply equity prices before this date, in order to calculate historically-adjusted equity prices." + }, + "split_ratio": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Split Ratio", + "description": "Ratio of the equity split, if a equity split occurred." + }, + "dividend": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Dividend", + "description": "Dividend amount, if a dividend was paid." + }, + "percent_change": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Percent Change", + "description": "Percent change in the price of the symbol from the previous day." + }, + "fifty_two_week_high": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Fifty Two Week High", + "description": "52 week high price for the symbol." + }, + "fifty_two_week_low": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Fifty Two Week Low", + "description": "52 week low price for the symbol." } }, "additionalProperties": true, @@ -40183,7 +37759,7 @@ } ], "title": "Prev Close", - "description": "The previous close price." + "description": "The closing price of the previous trading day." }, "change": { "anyOf": [ @@ -40345,2211 +37921,6 @@ "title": "IntrinioEquitySearch", "description": "Intrinio Equity Search Data." }, - "IntrinioEtfHoldings": { - "properties": { - "symbol": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Symbol", - "description": "Symbol representing the entity requested in the data. (ETF)" - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Name", - "description": "The common name for the holding." - }, - "security_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Security Type", - "description": "The type of instrument for this holding. Examples(Bond='BOND', Equity='EQUI')" - }, - "isin": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Isin", - "description": "The International Securities Identification Number." - }, - "ric": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Ric", - "description": "The Reuters Instrument Code." - }, - "sedol": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Sedol", - "description": "The Stock Exchange Daily Official List." - }, - "share_class_figi": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Share Class Figi", - "description": "The OpenFIGI symbol for the holding." - }, - "country": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Country", - "description": "The country or region of the holding." - }, - "maturity_date": { - "anyOf": [ - { - "type": "string", - "format": "date" - }, - { - "type": "null" - } - ], - "title": "Maturity Date", - "description": "The maturity date for the debt security, if available." - }, - "contract_expiry_date": { - "anyOf": [ - { - "type": "string", - "format": "date" - }, - { - "type": "null" - } - ], - "title": "Contract Expiry Date", - "description": "Expiry date for the futures contract held, if available." - }, - "coupon": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Coupon", - "description": "The coupon rate of the debt security, if available." - }, - "balance": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Balance", - "description": "The number of units of the security held, if available." - }, - "unit": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Unit", - "description": "The units of the 'balance' field." - }, - "units_per_share": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Units Per Share", - "description": "Number of units of the security held per share outstanding of the ETF, if available." - }, - "face_value": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Face Value", - "description": "The face value of the debt security, if available." - }, - "derivatives_value": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Derivatives Value", - "description": "The notional value of derivatives contracts held." - }, - "value": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Value", - "description": "The market value of the holding, on the 'as_of' date." - }, - "weight": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Weight", - "description": "The weight of the holding, as a normalized percent." - }, - "updated": { - "anyOf": [ - { - "type": "string", - "format": "date" - }, - { - "type": "null" - } - ], - "title": "Updated", - "description": "The 'as_of' date for the holding." - } - }, - "additionalProperties": true, - "type": "object", - "title": "IntrinioEtfHoldings", - "description": "Intrinio ETF Holdings Data." - }, - "IntrinioEtfInfo": { - "properties": { - "symbol": { - "type": "string", - "title": "Symbol", - "description": "Symbol representing the entity requested in the data. (ETF)" - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Name", - "description": "Name of the ETF." - }, - "description": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Description", - "description": "Description of the fund." - }, - "inception_date": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Inception Date", - "description": "Inception date of the ETF." - }, - "fund_listing_date": { - "anyOf": [ - { - "type": "string", - "format": "date" - }, - { - "type": "null" - } - ], - "title": "Fund Listing Date", - "description": "The date on which the Exchange Traded Product (ETP) or share class of the ETP is listed on a specific exchange." - }, - "data_change_date": { - "anyOf": [ - { - "type": "string", - "format": "date" - }, - { - "type": "null" - } - ], - "title": "Data Change Date", - "description": "The last date on which there was a change in a classifications data field for this ETF." - }, - "etn_maturity_date": { - "anyOf": [ - { - "type": "string", - "format": "date" - }, - { - "type": "null" - } - ], - "title": "Etn Maturity Date", - "description": "If the product is an ETN, this field identifies the maturity date for the ETN." - }, - "is_listed": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Is Listed", - "description": "If true, the ETF is still listed on an exchange." - }, - "close_date": { - "anyOf": [ - { - "type": "string", - "format": "date" - }, - { - "type": "null" - } - ], - "title": "Close Date", - "description": "The date on which the ETF was de-listed if it is no longer listed." - }, - "exchange": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Exchange", - "description": "The exchange Market Identifier Code (MIC)." - }, - "isin": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Isin", - "description": "International Securities Identification Number (ISIN)." - }, - "ric": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Ric", - "description": "Reuters Instrument Code (RIC)." - }, - "sedol": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Sedol", - "description": "Stock Exchange Daily Official List (SEDOL)." - }, - "figi_symbol": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Figi Symbol", - "description": "Financial Instrument Global Identifier (FIGI) symbol." - }, - "share_class_figi": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Share Class Figi", - "description": "Financial Instrument Global Identifier (FIGI)." - }, - "firstbridge_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Firstbridge Id", - "description": "The FirstBridge unique identifier for the Exchange Traded Fund (ETF)." - }, - "firstbridge_parent_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Firstbridge Parent Id", - "description": "The FirstBridge unique identifier for the parent Exchange Traded Fund (ETF), if applicable." - }, - "intrinio_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Intrinio Id", - "description": "Intrinio unique identifier for the security." - }, - "intraday_nav_symbol": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Intraday Nav Symbol", - "description": "Intraday Net Asset Value (NAV) symbol." - }, - "primary_symbol": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Primary Symbol", - "description": "The primary ticker field is used for Exchange Traded Products (ETPs) that have multiple listings and share classes. If an ETP has multiple listings or share classes, the same primary ticker is assigned to all the listings and share classes." - }, - "etp_structure_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Etp Structure Type", - "description": "Classifies Exchange Traded Products (ETPs) into very broad categories based on its legal structure." - }, - "legal_structure": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Legal Structure", - "description": "Legal structure of the fund." - }, - "issuer": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Issuer", - "description": "Issuer of the ETF." - }, - "etn_issuing_bank": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Etn Issuing Bank", - "description": "If the product is an Exchange Traded Note (ETN), this field identifies the issuing bank." - }, - "fund_family": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Fund Family", - "description": "This field identifies the fund family to which the ETF belongs, as categorized by the ETF Sponsor." - }, - "investment_style": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Investment Style", - "description": "Investment style of the ETF." - }, - "derivatives_based": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Derivatives Based", - "description": "This field is populated if the ETF holds either listed or over-the-counter derivatives in its portfolio." - }, - "income_category": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Income Category", - "description": "Identifies if an Exchange Traded Fund (ETF) falls into a category that is specifically designed to provide a high yield or income" - }, - "asset_class": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Asset Class", - "description": "Captures the underlying nature of the securities in the Exchanged Traded Product (ETP)." - }, - "other_asset_types": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Other Asset Types", - "description": "If 'asset_class' field is classified as 'Other Asset Types' this field captures the specific category of the underlying assets." - }, - "single_category_designation": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Single Category Designation", - "description": "This categorization is created for those users who want every ETF to be 'forced' into a single bucket, so that the assets for all categories will always sum to the total market." - }, - "beta_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Beta Type", - "description": "This field identifies whether an ETF provides 'Traditional' beta exposure or 'Smart' beta exposure. ETFs that are active (i.e. non-indexed), leveraged / inverse or have a proprietary quant model (i.e. that don't provide indexed exposure to a targeted factor) are classified separately." - }, - "beta_details": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Beta Details", - "description": "This field provides further detail within the traditional and smart beta categories." - }, - "market_cap_range": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Market Cap Range", - "description": "Equity ETFs are classified as falling into categories based on the description of their investment strategy in the prospectus. Examples ('Mega Cap', 'Large Cap', 'Mid Cap', etc.)" - }, - "market_cap_weighting_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Market Cap Weighting Type", - "description": "For ETFs that take the value 'Market Cap Weighted' in the 'index_weighting_scheme' field, this field provides detail on the market cap weighting type." - }, - "index_weighting_scheme": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Index Weighting Scheme", - "description": "For ETFs that track an underlying index, this field provides detail on the index weighting type." - }, - "index_linked": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Index Linked", - "description": "This field identifies whether an ETF is index linked or active." - }, - "index_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Index Name", - "description": "This field identifies the name of the underlying index tracked by the ETF, if applicable." - }, - "index_symbol": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Index Symbol", - "description": "This field identifies the OpenFIGI ticker for the Index underlying the ETF." - }, - "parent_index": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Parent Index", - "description": "This field identifies the name of the parent index, which represents the broader universe from which the index underlying the ETF is created, if applicable." - }, - "index_family": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Index Family", - "description": "This field identifies the index family to which the index underlying the ETF belongs. The index family is represented as categorized by the index provider." - }, - "broader_index_family": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Broader Index Family", - "description": "This field identifies the broader index family to which the index underlying the ETF belongs. The broader index family is represented as categorized by the index provider." - }, - "index_provider": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Index Provider", - "description": "This field identifies the Index provider for the index underlying the ETF, if applicable." - }, - "index_provider_code": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Index Provider Code", - "description": "This field provides the First Bridge code for each Index provider, corresponding to the index underlying the ETF if applicable." - }, - "replication_structure": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Replication Structure", - "description": "The replication structure of the Exchange Traded Product (ETP)." - }, - "growth_value_tilt": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Growth Value Tilt", - "description": "Classifies equity ETFs as either 'Growth' or Value' based on the stated style tilt in the ETF prospectus. Equity ETFs that do not have a stated style tilt are classified as 'Core / Blend'." - }, - "growth_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Growth Type", - "description": "For ETFs that are classified as 'Growth' in 'growth_value_tilt', this field further identifies those where the stocks in the ETF are both selected and weighted based on their growth (style factor) scores." - }, - "value_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Value Type", - "description": "For ETFs that are classified as 'Value' in 'growth_value_tilt', this field further identifies those where the stocks in the ETF are both selected and weighted based on their value (style factor) scores." - }, - "sector": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Sector", - "description": "For equity ETFs that aim to provide targeted exposure to a sector or industry, this field identifies the Sector that it provides the exposure to." - }, - "industry": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Industry", - "description": "For equity ETFs that aim to provide targeted exposure to an industry, this field identifies the Industry that it provides the exposure to." - }, - "industry_group": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Industry Group", - "description": "For equity ETFs that aim to provide targeted exposure to a sub-industry, this field identifies the sub-Industry that it provides the exposure to." - }, - "cross_sector_theme": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Cross Sector Theme", - "description": "For equity ETFs that aim to provide targeted exposure to a specific investment theme that cuts across GICS sectors, this field identifies the specific cross-sector theme. Examples ('Agri-business', 'Natural Resources', 'Green Investing', etc.)" - }, - "natural_resources_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Natural Resources Type", - "description": "For ETFs that are classified as 'Natural Resources' in the 'cross_sector_theme' field, this field provides further detail on the type of Natural Resources exposure." - }, - "us_or_excludes_us": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Us Or Excludes Us", - "description": "Takes the value of 'Domestic' for US exposure, 'International' for non-US exposure and 'Global' for exposure that includes all regions including the US." - }, - "developed_emerging": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Developed Emerging", - "description": "This field identifies the stage of development of the markets that the ETF provides exposure to." - }, - "specialized_region": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Specialized Region", - "description": "This field is populated if the ETF provides targeted exposure to a specific type of geography-based grouping that does not fall into a specific country or continent grouping. Examples ('BRIC', 'Chindia', etc.)" - }, - "continent": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Continent", - "description": "This field is populated if the ETF provides targeted exposure to a specific continent or country within that Continent." - }, - "latin_america_sub_group": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Latin America Sub Group", - "description": "For ETFs that are classified as 'Latin America' in the 'continent' field, this field provides further detail on the type of regional exposure." - }, - "europe_sub_group": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Europe Sub Group", - "description": "For ETFs that are classified as 'Europe' in the 'continent' field, this field provides further detail on the type of regional exposure." - }, - "asia_sub_group": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Asia Sub Group", - "description": "For ETFs that are classified as 'Asia' in the 'continent' field, this field provides further detail on the type of regional exposure." - }, - "specific_country": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Specific Country", - "description": "This field is populated if the ETF provides targeted exposure to a specific country." - }, - "china_listing_location": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "China Listing Location", - "description": "For ETFs that are classified as 'China' in the 'country' field, this field provides further detail on the type of exposure in the underlying securities." - }, - "us_state": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Us State", - "description": "Takes the value of a US state if the ETF provides targeted exposure to the municipal bonds or equities of companies." - }, - "real_estate": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Real Estate", - "description": "For ETFs that provide targeted real estate exposure, this field is populated if the ETF provides targeted exposure to a specific segment of the real estate market." - }, - "fundamental_weighting_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Fundamental Weighting Type", - "description": "For ETFs that take the value 'Fundamental Weighted' in the 'index_weighting_scheme' field, this field provides detail on the fundamental weighting methodology." - }, - "dividend_weighting_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Dividend Weighting Type", - "description": "For ETFs that take the value 'Dividend Weighted' in the 'index_weighting_scheme' field, this field provides detail on the dividend weighting methodology." - }, - "bond_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Bond Type", - "description": "For ETFs where 'asset_class_type' is 'Bonds', this field provides detail on the type of bonds held in the ETF." - }, - "government_bond_types": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Government Bond Types", - "description": "For bond ETFs that take the value 'Treasury & Government' in 'bond_type', this field provides detail on the exposure." - }, - "municipal_bond_region": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Municipal Bond Region", - "description": "For bond ETFs that take the value 'Municipal' in 'bond_type', this field provides additional detail on the geographic exposure." - }, - "municipal_vrdo": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Municipal Vrdo", - "description": "For bond ETFs that take the value 'Municipal' in 'bond_type', this field identifies those ETFs that specifically provide exposure to Variable Rate Demand Obligations." - }, - "mortgage_bond_types": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Mortgage Bond Types", - "description": "For bond ETFs that take the value 'Mortgage' in 'bond_type', this field provides additional detail on the type of underlying securities." - }, - "bond_tax_status": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Bond Tax Status", - "description": "For all US bond ETFs, this field provides additional detail on the tax treatment of the underlying securities." - }, - "credit_quality": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Credit Quality", - "description": "For all bond ETFs, this field helps to identify if the ETF provides targeted exposure to securities of a specific credit quality range." - }, - "average_maturity": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Average Maturity", - "description": "For all bond ETFs, this field helps to identify if the ETF provides targeted exposure to securities of a specific maturity range." - }, - "specific_maturity_year": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Specific Maturity Year", - "description": "For all bond ETFs that take the value 'Specific Maturity Year' in the 'average_maturity' field, this field specifies the calendar year." - }, - "commodity_types": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Commodity Types", - "description": "For ETFs where 'asset_class_type' is 'Commodities', this field provides detail on the type of commodities held in the ETF." - }, - "energy_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Energy Type", - "description": "For ETFs where 'commodity_type' is 'Energy', this field provides detail on the type of energy exposure provided by the ETF." - }, - "agricultural_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Agricultural Type", - "description": "For ETFs where 'commodity_type' is 'Agricultural', this field provides detail on the type of agricultural exposure provided by the ETF." - }, - "livestock_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Livestock Type", - "description": "For ETFs where 'commodity_type' is 'Livestock', this field provides detail on the type of livestock exposure provided by the ETF." - }, - "metal_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Metal Type", - "description": "For ETFs where 'commodity_type' is 'Gold & Metals', this field provides detail on the type of exposure provided by the ETF." - }, - "inverse_leveraged": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Inverse Leveraged", - "description": "This field is populated if the ETF provides inverse or leveraged exposure." - }, - "target_date_multi_asset_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Target Date Multi Asset Type", - "description": "For ETFs where 'asset_class_type' is 'Target Date / MultiAsset', this field provides detail on the type of commodities held in the ETF." - }, - "currency_pair": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Currency Pair", - "description": "This field is populated if the ETF's strategy involves providing exposure to the movements of a currency or involves hedging currency exposure." - }, - "social_environmental_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Social Environmental Type", - "description": "This field is populated if the ETF's strategy involves providing exposure to a specific social or environmental theme." - }, - "clean_energy_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Clean Energy Type", - "description": "This field is populated if the ETF has a value of 'Clean Energy' in the 'social_environmental_type' field." - }, - "dividend_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Dividend Type", - "description": "This field is populated if the ETF has an intended investment objective of holding dividend-oriented stocks as stated in the prospectus." - }, - "regular_dividend_payor_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Regular Dividend Payor Type", - "description": "This field is populated if the ETF has a value of'Dividend - Regular Payors' in the 'dividend_type' field." - }, - "quant_strategies_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Quant Strategies Type", - "description": "This field is populated if the ETF has either an index-linked or active strategy that is based on a proprietary quantitative strategy." - }, - "other_quant_models": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Other Quant Models", - "description": "For ETFs where 'quant_strategies_type' is 'Other Quant Model', this field provides the name of the specific proprietary quant model used as the underlying strategy for the ETF." - }, - "hedge_fund_type": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Hedge Fund Type", - "description": "For ETFs where 'other_asset_types' is 'Hedge Fund Replication', this field provides detail on the type of hedge fund replication strategy." - }, - "excludes_financials": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Excludes Financials", - "description": "For equity ETFs, identifies those ETFs where the underlying fund holdings will not hold financials stocks, based on the funds intended objective." - }, - "excludes_technology": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Excludes Technology", - "description": "For equity ETFs, identifies those ETFs where the underlying fund holdings will not hold technology stocks, based on the funds intended objective." - }, - "holds_only_nyse_stocks": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Holds Only Nyse Stocks", - "description": "If true, the ETF is an equity ETF and holds only stocks listed on NYSE." - }, - "holds_only_nasdaq_stocks": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Holds Only Nasdaq Stocks", - "description": "If true, the ETF is an equity ETF and holds only stocks listed on Nasdaq." - }, - "holds_mlp": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Holds Mlp", - "description": "If true, the ETF's investment objective explicitly specifies that it holds MLPs as an intended part of its investment strategy." - }, - "holds_preferred_stock": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Holds Preferred Stock", - "description": "If true, the ETF's investment objective explicitly specifies that it holds preferred stock as an intended part of its investment strategy." - }, - "holds_closed_end_funds": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Holds Closed End Funds", - "description": "If true, the ETF's investment objective explicitly specifies that it holds closed end funds as an intended part of its investment strategy." - }, - "holds_adr": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Holds Adr", - "description": "If true, he ETF's investment objective explicitly specifies that it holds American Depositary Receipts (ADRs) as an intended part of its investment strategy." - }, - "laddered": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Laddered", - "description": "For bond ETFs, this field identifies those ETFs that specifically hold bonds in a laddered structure, where the bonds are scheduled to mature in an annual, sequential structure." - }, - "zero_coupon": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Zero Coupon", - "description": "For bond ETFs, this field identifies those ETFs that specifically hold zero coupon Treasury Bills." - }, - "floating_rate": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Floating Rate", - "description": "For bond ETFs, this field identifies those ETFs that specifically hold floating rate bonds." - }, - "build_america_bonds": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Build America Bonds", - "description": "For municipal bond ETFs, this field identifies those ETFs that specifically hold Build America Bonds." - }, - "dynamic_futures_roll": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Dynamic Futures Roll", - "description": "If the product holds futures contracts, this field identifies those products where the roll strategy is dynamic (rather than entirely rules based), so as to minimize roll costs." - }, - "currency_hedged": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Currency Hedged", - "description": "This field is populated if the ETF's strategy involves hedging currency exposure." - }, - "includes_short_exposure": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Includes Short Exposure", - "description": "This field is populated if the ETF has short exposure in any of its holdings e.g. in a long/short or inverse ETF." - }, - "ucits": { - "anyOf": [ - { - "type": "boolean" - }, - { - "type": "null" - } - ], - "title": "Ucits", - "description": "If true, the Exchange Traded Product (ETP) is Undertakings for the Collective Investment in Transferable Securities (UCITS) compliant" - }, - "registered_countries": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Registered Countries", - "description": "The list of countries where the ETF is legally registered for sale. This may differ from where the ETF is domiciled or traded, particularly in Europe." - }, - "issuer_country": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Issuer Country", - "description": "2 letter ISO country code for the country where the issuer is located." - }, - "domicile": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Domicile", - "description": "2 letter ISO country code for the country where the ETP is domiciled." - }, - "listing_country": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Listing Country", - "description": "2 letter ISO country code for the country of the primary listing." - }, - "listing_region": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Listing Region", - "description": "Geographic region in the country of the primary listing falls." - }, - "bond_currency_denomination": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Bond Currency Denomination", - "description": "For all bond ETFs, this field provides additional detail on the currency denomination of the underlying securities." - }, - "base_currency": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Base Currency", - "description": "Base currency in which NAV is reported." - }, - "listing_currency": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Listing Currency", - "description": "Listing currency of the Exchange Traded Product (ETP) in which it is traded. Reported using the 3-digit ISO currency code." - }, - "number_of_holdings": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Number Of Holdings", - "description": "The number of holdings in the ETF." - }, - "month_end_assets": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Month End Assets", - "description": "Net assets in millions of dollars as of the most recent month end." - }, - "net_expense_ratio": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Net Expense Ratio", - "description": "Gross expense net of Fee Waivers, as a percentage of net assets as published by the ETF issuer.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "etf_portfolio_turnover": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Etf Portfolio Turnover", - "description": "The percentage of positions turned over in the last 12 months.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - } - }, - "additionalProperties": true, - "type": "object", - "required": [ - "symbol", - "name", - "inception_date" - ], - "title": "IntrinioEtfInfo", - "description": "Intrinio ETF Info Data." - }, - "IntrinioEtfPricePerformance": { - "properties": { - "symbol": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Symbol", - "description": "Symbol representing the entity requested in the data." - }, - "one_day": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "One Day", - "description": "One-day return.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "wtd": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Wtd", - "description": "Week to date return.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "one_week": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "One Week", - "description": "One-week return.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "mtd": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Mtd", - "description": "Month to date return.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "one_month": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "One Month", - "description": "One-month return.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "qtd": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Qtd", - "description": "Quarter to date return.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "three_month": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Three Month", - "description": "Three-month return.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "six_month": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Six Month", - "description": "Six-month return.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "ytd": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Ytd", - "description": "Year to date return.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "one_year": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "One Year", - "description": "One-year return.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "two_year": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Two Year", - "description": "Two-year return.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "three_year": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Three Year", - "description": "Three-year return.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "four_year": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Four Year", - "description": "Four-year", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "five_year": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Five Year", - "description": "Five-year return.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "ten_year": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Ten Year", - "description": "Ten-year return.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "max": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Max", - "description": "Return from the beginning of the time series.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "max_annualized": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Max Annualized", - "description": "Annualized rate of return from inception.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "volatility_one_year": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Volatility One Year", - "description": "Trailing one-year annualized volatility.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "volatility_three_year": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Volatility Three Year", - "description": "Trailing three-year annualized volatility.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "volatility_five_year": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Volatility Five Year", - "description": "Trailing five-year annualized volatility.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "volume": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Volume", - "description": "The trading volume." - }, - "volume_avg_30": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Volume Avg 30", - "description": "The one-month average daily volume." - }, - "volume_avg_90": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Volume Avg 90", - "description": "The three-month average daily volume." - }, - "volume_avg_180": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Volume Avg 180", - "description": "The six-month average daily volume." - }, - "beta": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Beta", - "description": "Beta compared to the S&P 500." - }, - "nav": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Nav", - "description": "Net asset value per share." - }, - "year_high": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Year High", - "description": "The 52-week high price." - }, - "year_low": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Year Low", - "description": "The 52-week low price." - }, - "market_cap": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Market Cap", - "description": "The market capitalization." - }, - "shares_outstanding": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Shares Outstanding", - "description": "The number of shares outstanding." - }, - "updated": { - "anyOf": [ - { - "type": "string", - "format": "date" - }, - { - "type": "null" - } - ], - "title": "Updated", - "description": "The date of the data." - } - }, - "additionalProperties": true, - "type": "object", - "title": "IntrinioEtfPricePerformance", - "description": "Intrinio ETF Performance Data." - }, - "IntrinioEtfSearch": { - "properties": { - "symbol": { - "type": "string", - "title": "Symbol", - "description": "Symbol representing the entity requested in the data.(ETF)" - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Name", - "description": "Name of the ETF." - }, - "exchange": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Exchange", - "description": "The exchange MIC code." - }, - "figi_ticker": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Figi Ticker", - "description": "The OpenFIGI ticker." - }, - "ric": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Ric", - "description": "The Reuters Instrument Code." - }, - "isin": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Isin", - "description": "The International Securities Identification Number." - }, - "sedol": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Sedol", - "description": "The Stock Exchange Daily Official List." - }, - "intrinio_id": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Intrinio Id", - "description": "The unique Intrinio ID for the security." - } - }, - "additionalProperties": true, - "type": "object", - "required": [ - "symbol" - ], - "title": "IntrinioEtfSearch", - "description": "Intrinio ETF Search Data." - }, "IntrinioFinancialRatios": { "properties": { "period_ending": { @@ -44151,6 +39522,95 @@ "title": "IntrinioInsiderTrading", "description": "Intrinio Insider Trading Data." }, + "IntrinioInstitutionalOwnership": { + "properties": { + "symbol": { + "type": "string", + "title": "Symbol", + "description": "Symbol representing the entity requested in the data." + }, + "cik": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Cik", + "description": "Central Index Key (CIK) for the requested entity." + }, + "date": { + "type": "string", + "format": "date", + "title": "Date", + "description": "The date of the data." + }, + "name": { + "type": "string", + "title": "Name", + "description": "Name of the institutional owner." + }, + "value": { + "type": "number", + "title": "Value", + "description": "Value of the institutional owner." + }, + "amount": { + "type": "number", + "title": "Amount", + "description": "Amount of the institutional owner." + }, + "sole_voting_authority": { + "type": "number", + "title": "Sole Voting Authority", + "description": "Sole voting authority of the institutional owner." + }, + "shared_voting_authority": { + "type": "number", + "title": "Shared Voting Authority", + "description": "Shared voting authority of the institutional owner." + }, + "no_voting_authority": { + "type": "number", + "title": "No Voting Authority", + "description": "No voting authority of the institutional owner." + }, + "previous_amount": { + "type": "number", + "title": "Previous Amount", + "description": "Previous amount of the institutional owner." + }, + "amount_change": { + "type": "number", + "title": "Amount Change", + "description": "Amount change of the institutional owner." + }, + "amount_percent_change": { + "type": "number", + "title": "Amount Percent Change", + "description": "Amount percent change of the institutional owner." + } + }, + "additionalProperties": true, + "type": "object", + "required": [ + "symbol", + "date", + "name", + "value", + "amount", + "sole_voting_authority", + "shared_voting_authority", + "no_voting_authority", + "previous_amount", + "amount_change", + "amount_percent_change" + ], + "title": "IntrinioInstitutionalOwnership", + "description": "Intrinio Institutional Ownership Data." + }, "IntrinioKeyMetrics": { "properties": { "symbol": { @@ -44189,464 +39649,42 @@ "title": "Pe Ratio", "description": "Price-to-earnings ratio (P/E ratio)" }, - "price_to_book": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Price To Book", - "description": "Price to book ratio." - }, - "price_to_tangible_book": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Price To Tangible Book", - "description": "Price to tangible book ratio." - }, - "price_to_revenue": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Price To Revenue", - "description": "Price to revenue ratio." - }, - "quick_ratio": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Quick Ratio", - "description": "Quick ratio." - }, - "gross_margin": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Gross Margin", - "description": "Gross margin, as a normalized percent.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "ebit_margin": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Ebit Margin", - "description": "EBIT margin, as a normalized percent.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "profit_margin": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Profit Margin", - "description": "Profit margin, as a normalized percent.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "eps": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Eps", - "description": "Basic earnings per share." - }, - "eps_growth": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Eps Growth", - "description": "EPS growth, as a normalized percent.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "revenue_growth": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Revenue Growth", - "description": "Revenue growth, as a normalized percent.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "ebitda_growth": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Ebitda Growth", - "description": "EBITDA growth, as a normalized percent.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "ebit_growth": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Ebit Growth", - "description": "EBIT growth, as a normalized percent.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "net_income_growth": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Net Income Growth", - "description": "Net income growth, as a normalized percent.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "free_cash_flow_to_firm_growth": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Free Cash Flow To Firm Growth", - "description": "Free cash flow to firm growth, as a normalized percent.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "invested_capital_growth": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Invested Capital Growth", - "description": "Invested capital growth, as a normalized percent.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "return_on_assets": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Return On Assets", - "description": "Return on assets, as a normalized percent.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "return_on_equity": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Return On Equity", - "description": "Return on equity, as a normalized percent.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "return_on_invested_capital": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Return On Invested Capital", - "description": "Return on invested capital, as a normalized percent.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "ebitda": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Ebitda", - "description": "Earnings before interest, taxes, depreciation, and amortization." - }, - "ebit": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Ebit", - "description": "Earnings before interest and taxes." - }, - "long_term_debt": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Long Term Debt", - "description": "Long-term debt." - }, - "total_debt": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Total Debt", - "description": "Total debt." - }, - "total_capital": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Total Capital", - "description": "The sum of long-term debt and total shareholder equity." - }, - "enterprise_value": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Enterprise Value", - "description": "Enterprise value." - }, - "free_cash_flow_to_firm": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Free Cash Flow To Firm", - "description": "Free cash flow to firm." - }, - "altman_z_score": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Altman Z Score", - "description": "Altman Z-score." - }, "beta": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], + "type": "number", "title": "Beta", - "description": "Beta relative to the broad market (rolling three-year)." + "description": "Beta relative to the broad market calculated on a rolling three-year basis." + }, + "volume": { + "type": "number", + "title": "Volume", + "description": "Volume" + }, + "fifty_two_week_high": { + "type": "number", + "title": "Fifty Two Week High", + "description": "52 week high" + }, + "fifty_two_week_low": { + "type": "number", + "title": "Fifty Two Week Low", + "description": "52 week low" }, "dividend_yield": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], + "type": "number", "title": "Dividend Yield", "description": "Dividend yield, as a normalized percent.", "x-frontend_multiply": 100, "x-unit_measurement": "percent" - }, - "earnings_yield": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Earnings Yield", - "description": "Earnings yield, as a normalized percent.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "last_price": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Last Price", - "description": "Last price of the stock." - }, - "year_high": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Year High", - "description": "52 week high" - }, - "year_low": { - "type": "number", - "title": "Year Low", - "description": "52 week low" - }, - "volume_avg": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Volume Avg", - "description": "Average daily volume." - }, - "short_interest": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Short Interest", - "description": "Number of shares reported as sold short." - }, - "shares_outstanding": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Shares Outstanding", - "description": "Weighted average shares outstanding (TTM)." - }, - "days_to_cover": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Days To Cover", - "description": "Days to cover short interest, based on average daily volume." } }, "additionalProperties": true, "type": "object", + "required": [ + "beta", + "volume", + "fifty_two_week_high", + "fifty_two_week_low" + ], "title": "IntrinioKeyMetrics", "description": "Intrinio Key Metrics Data." }, @@ -44693,12 +39731,13 @@ "title": "IntrinioLatestAttributes", "description": "Intrinio Latest Attributes Data." }, - "IntrinioMarketSnapshots": { + "IntrinioMarketIndices": { "properties": { - "symbol": { + "date": { "type": "string", - "title": "Symbol", - "description": "Symbol representing the entity requested in the data." + "format": "date-time", + "title": "Date", + "description": "The date of the data." }, "open": { "anyOf": [ @@ -44759,176 +39798,15 @@ ], "title": "Volume", "description": "The trading volume." - }, - "prev_close": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Prev Close", - "description": "The previous close price." - }, - "change": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Change", - "description": "The change in price from the previous close." - }, - "change_percent": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Change Percent", - "description": "The change in price from the previous close, as a normalized percent.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - }, - "last_price": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Last Price", - "description": "The last trade price." - }, - "last_size": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Last Size", - "description": "The last trade size." - }, - "last_volume": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Last Volume", - "description": "The last trade volume." - }, - "last_trade_timestamp": { - "anyOf": [ - { - "type": "string", - "format": "date-time" - }, - { - "type": "null" - } - ], - "title": "Last Trade Timestamp", - "description": "The timestamp of the last trade." - }, - "bid_size": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Bid Size", - "description": "The size of the last bid price. Bid price and size is not always available." - }, - "bid_price": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Bid Price", - "description": "The last bid price. Bid price and size is not always available." - }, - "ask_price": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Ask Price", - "description": "The last ask price. Ask price and size is not always available." - }, - "ask_size": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Ask Size", - "description": "The size of the last ask price. Ask price and size is not always available." - }, - "last_bid_timestamp": { - "anyOf": [ - { - "type": "string", - "format": "date-time" - }, - { - "type": "null" - } - ], - "title": "Last Bid Timestamp", - "description": "The timestamp of the last bid price. Bid price and size is not always available." - }, - "last_ask_timestamp": { - "anyOf": [ - { - "type": "string", - "format": "date-time" - }, - { - "type": "null" - } - ], - "title": "Last Ask Timestamp", - "description": "The timestamp of the last ask price. Ask price and size is not always available." } }, "additionalProperties": true, "type": "object", "required": [ - "symbol" + "date" ], - "title": "IntrinioMarketSnapshots", - "description": "Intrinio Market Snapshots Data." + "title": "IntrinioMarketIndices", + "description": "Intrinio Market Indices Data." }, "IntrinioOptionsChains": { "properties": { @@ -45468,64 +40346,16 @@ "title": "Contract Symbol", "description": "Contract symbol for the option." }, - "trade_timestamp": { - "type": "string", - "format": "date-time", - "title": "Trade Timestamp", - "description": "The datetime of order placement." - }, "trade_type": { "type": "string", - "enum": [ - "block", - "sweep", - "large" - ], "title": "Trade Type", "description": "The type of unusual trade." }, "sentiment": { "type": "string", - "enum": [ - "bullish", - "bearish", - "neutral" - ], "title": "Sentiment", "description": "Bullish, Bearish, or Neutral Sentiment is estimated based on whether the trade was executed at the bid, ask, or mark price." }, - "bid_at_execution": { - "type": "number", - "title": "Bid At Execution", - "description": "Bid price at execution." - }, - "ask_at_execution": { - "type": "number", - "title": "Ask At Execution", - "description": "Ask price at execution." - }, - "average_price": { - "type": "number", - "title": "Average Price", - "description": "The average premium paid per option contract." - }, - "underlying_price_at_execution": { - "anyOf": [ - { - "type": "number" - }, - { - "type": "null" - } - ], - "title": "Underlying Price At Execution", - "description": "Price of the underlying security at execution of trade." - }, - "total_size": { - "type": "integer", - "title": "Total Size", - "description": "The total number of contracts involved in a single transaction." - }, "total_value": { "anyOf": [ { @@ -45537,20 +40367,52 @@ ], "title": "Total Value", "description": "The aggregated value of all option contract premiums included in the trade." + }, + "total_size": { + "type": "integer", + "title": "Total Size", + "description": "The total number of contracts involved in a single transaction." + }, + "average_price": { + "type": "number", + "title": "Average Price", + "description": "The average premium paid per option contract." + }, + "ask_at_execution": { + "type": "number", + "title": "Ask At Execution", + "description": "Ask price at execution." + }, + "bid_at_execution": { + "type": "number", + "title": "Bid At Execution", + "description": "Bid price at execution." + }, + "underlying_price_at_execution": { + "type": "number", + "title": "Underlying Price At Execution", + "description": "Price of the underlying security at execution of trade." + }, + "timestamp": { + "type": "string", + "format": "date-time", + "title": "Timestamp", + "description": "The UTC timestamp of order placement." } }, "additionalProperties": true, "type": "object", "required": [ "contract_symbol", - "trade_timestamp", "trade_type", "sentiment", - "bid_at_execution", - "ask_at_execution", - "average_price", + "total_value", "total_size", - "total_value" + "average_price", + "ask_at_execution", + "bid_at_execution", + "underlying_price_at_execution", + "timestamp" ], "title": "IntrinioOptionsUnusual", "description": "Intrinio Unusual Options Data." @@ -45974,7 +40836,7 @@ } ], "title": "Images", - "description": "Images associated with the article." + "description": "Images associated with the news." }, "text": { "anyOf": [ @@ -47459,6 +42321,9 @@ }, { "$ref": "#/components/schemas/PolygonCompanyNews" + }, + { + "$ref": "#/components/schemas/TiingoCompanyNews" } ], "discriminator": { @@ -47467,7 +42332,8 @@ "benzinga": "#/components/schemas/BenzingaCompanyNews", "fmp": "#/components/schemas/FMPCompanyNews", "intrinio": "#/components/schemas/IntrinioCompanyNews", - "polygon": "#/components/schemas/PolygonCompanyNews" + "polygon": "#/components/schemas/PolygonCompanyNews", + "tiingo": "#/components/schemas/TiingoCompanyNews" } } }, @@ -47708,13 +42574,17 @@ }, { "$ref": "#/components/schemas/PolygonCryptoHistorical" + }, + { + "$ref": "#/components/schemas/TiingoCryptoHistorical" } ], "discriminator": { "propertyName": "provider", "mapping": { "fmp": "#/components/schemas/FMPCryptoHistorical", - "polygon": "#/components/schemas/PolygonCryptoHistorical" + "polygon": "#/components/schemas/PolygonCryptoHistorical", + "tiingo": "#/components/schemas/TiingoCryptoHistorical" } } }, @@ -47876,13 +42746,17 @@ }, { "$ref": "#/components/schemas/PolygonCurrencyHistorical" + }, + { + "$ref": "#/components/schemas/TiingoCurrencyHistorical" } ], "discriminator": { "propertyName": "provider", "mapping": { "fmp": "#/components/schemas/FMPCurrencyHistorical", - "polygon": "#/components/schemas/PolygonCurrencyHistorical" + "polygon": "#/components/schemas/PolygonCurrencyHistorical", + "tiingo": "#/components/schemas/TiingoCurrencyHistorical" } } }, @@ -48115,88 +42989,6 @@ "title": "OBBject_CurrencyReferenceRates", "description": "OBBject with results of type CurrencyReferenceRates" }, - "OBBject_CurrencySnapshots": { - "properties": { - "_id": { - "type": "string", - "title": " Id" - }, - "results": { - "anyOf": [ - { - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/FMPCurrencySnapshots" - } - ], - "discriminator": { - "propertyName": "provider", - "mapping": { - "fmp": "#/components/schemas/FMPCurrencySnapshots" - } - } - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Results", - "description": "Serializable results.", - "has_list": true, - "is_union": false, - "model": "CurrencySnapshots" - }, - "provider": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Provider", - "description": "Provider name." - }, - "warnings": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Warning_" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Warnings", - "description": "List of warnings." - }, - "chart": { - "anyOf": [ - { - "$ref": "#/components/schemas/Chart" - }, - { - "type": "null" - } - ], - "description": "Chart object." - }, - "extra": { - "type": "object", - "title": "Extra", - "description": "Extra info." - } - }, - "type": "object", - "title": "OBBject_CurrencySnapshots", - "description": "OBBject with results of type CurrencySnapshots" - }, "OBBject_DiscountWindowPrimaryCreditRate": { "properties": { "_id": { @@ -48794,6 +43586,9 @@ }, { "$ref": "#/components/schemas/PolygonEquityHistorical" + }, + { + "$ref": "#/components/schemas/TiingoEquityHistorical" } ], "discriminator": { @@ -48801,7 +43596,8 @@ "mapping": { "fmp": "#/components/schemas/FMPEquityHistorical", "intrinio": "#/components/schemas/IntrinioEquityHistorical", - "polygon": "#/components/schemas/PolygonEquityHistorical" + "polygon": "#/components/schemas/PolygonEquityHistorical", + "tiingo": "#/components/schemas/TiingoEquityHistorical" } } }, @@ -49694,96 +44490,6 @@ "title": "OBBject_EtfEquityExposure", "description": "OBBject with results of type EtfEquityExposure" }, - "OBBject_EtfHistorical": { - "properties": { - "_id": { - "type": "string", - "title": " Id" - }, - "results": { - "anyOf": [ - { - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/FMPEquityHistorical" - }, - { - "$ref": "#/components/schemas/IntrinioEquityHistorical" - }, - { - "$ref": "#/components/schemas/PolygonEquityHistorical" - } - ], - "discriminator": { - "propertyName": "provider", - "mapping": { - "fmp": "#/components/schemas/FMPEquityHistorical", - "intrinio": "#/components/schemas/IntrinioEquityHistorical", - "polygon": "#/components/schemas/PolygonEquityHistorical" - } - } - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Results", - "description": "Serializable results.", - "has_list": true, - "is_union": false, - "model": "EtfHistorical" - }, - "provider": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Provider", - "description": "Provider name." - }, - "warnings": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Warning_" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Warnings", - "description": "List of warnings." - }, - "chart": { - "anyOf": [ - { - "$ref": "#/components/schemas/Chart" - }, - { - "type": "null" - } - ], - "description": "Chart object." - }, - "extra": { - "type": "object", - "title": "Extra", - "description": "Extra info." - } - }, - "type": "object", - "title": "OBBject_EtfHistorical", - "description": "OBBject with results of type EtfHistorical" - }, "OBBject_EtfHoldings": { "properties": { "_id": { @@ -49798,9 +44504,6 @@ { "$ref": "#/components/schemas/FMPEtfHoldings" }, - { - "$ref": "#/components/schemas/IntrinioEtfHoldings" - }, { "$ref": "#/components/schemas/SecEtfHoldings" } @@ -49809,7 +44512,6 @@ "propertyName": "provider", "mapping": { "fmp": "#/components/schemas/FMPEtfHoldings", - "intrinio": "#/components/schemas/IntrinioEtfHoldings", "sec": "#/components/schemas/SecEtfHoldings" } } @@ -50051,16 +44753,12 @@ "oneOf": [ { "$ref": "#/components/schemas/FMPEtfInfo" - }, - { - "$ref": "#/components/schemas/IntrinioEtfInfo" } ], "discriminator": { "propertyName": "provider", "mapping": { - "fmp": "#/components/schemas/FMPEtfInfo", - "intrinio": "#/components/schemas/IntrinioEtfInfo" + "fmp": "#/components/schemas/FMPEtfInfo" } } }, @@ -50124,92 +44822,6 @@ "title": "OBBject_EtfInfo", "description": "OBBject with results of type EtfInfo" }, - "OBBject_EtfPricePerformance": { - "properties": { - "_id": { - "type": "string", - "title": " Id" - }, - "results": { - "anyOf": [ - { - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/FMPPricePerformance" - }, - { - "$ref": "#/components/schemas/IntrinioEtfPricePerformance" - } - ], - "discriminator": { - "propertyName": "provider", - "mapping": { - "fmp": "#/components/schemas/FMPPricePerformance", - "intrinio": "#/components/schemas/IntrinioEtfPricePerformance" - } - } - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Results", - "description": "Serializable results.", - "has_list": true, - "is_union": false, - "model": "EtfPricePerformance" - }, - "provider": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Provider", - "description": "Provider name." - }, - "warnings": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Warning_" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Warnings", - "description": "List of warnings." - }, - "chart": { - "anyOf": [ - { - "$ref": "#/components/schemas/Chart" - }, - { - "type": "null" - } - ], - "description": "Chart object." - }, - "extra": { - "type": "object", - "title": "Extra", - "description": "Extra info." - } - }, - "type": "object", - "title": "OBBject_EtfPricePerformance", - "description": "OBBject with results of type EtfPricePerformance" - }, "OBBject_EtfSearch": { "properties": { "_id": { @@ -50223,16 +44835,12 @@ "oneOf": [ { "$ref": "#/components/schemas/FMPEtfSearch" - }, - { - "$ref": "#/components/schemas/IntrinioEtfSearch" } ], "discriminator": { "propertyName": "provider", "mapping": { - "fmp": "#/components/schemas/FMPEtfSearch", - "intrinio": "#/components/schemas/IntrinioEtfSearch" + "fmp": "#/components/schemas/FMPEtfSearch" } } }, @@ -50714,88 +45322,6 @@ "title": "OBBject_FinancialRatios", "description": "OBBject with results of type FinancialRatios" }, - "OBBject_Form13FHR": { - "properties": { - "_id": { - "type": "string", - "title": " Id" - }, - "results": { - "anyOf": [ - { - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/SecForm13FHR" - } - ], - "discriminator": { - "propertyName": "provider", - "mapping": { - "sec": "#/components/schemas/SecForm13FHR" - } - } - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Results", - "description": "Serializable results.", - "has_list": true, - "is_union": false, - "model": "Form13FHR" - }, - "provider": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Provider", - "description": "Provider name." - }, - "warnings": { - "anyOf": [ - { - "items": { - "$ref": "#/components/schemas/Warning_" - }, - "type": "array" - }, - { - "type": "null" - } - ], - "title": "Warnings", - "description": "List of warnings." - }, - "chart": { - "anyOf": [ - { - "$ref": "#/components/schemas/Chart" - }, - { - "type": "null" - } - ], - "description": "Chart object." - }, - "extra": { - "type": "object", - "title": "Extra", - "description": "Extra info." - } - }, - "type": "object", - "title": "OBBject_Form13FHR", - "description": "OBBject with results of type Form13FHR" - }, "OBBject_FredRegional": { "properties": { "_id": { @@ -52395,12 +46921,16 @@ "oneOf": [ { "$ref": "#/components/schemas/FMPInstitutionalOwnership" + }, + { + "$ref": "#/components/schemas/IntrinioInstitutionalOwnership" } ], "discriminator": { "propertyName": "provider", "mapping": { - "fmp": "#/components/schemas/FMPInstitutionalOwnership" + "fmp": "#/components/schemas/FMPInstitutionalOwnership", + "intrinio": "#/components/schemas/IntrinioInstitutionalOwnership" } } }, @@ -52641,21 +47171,30 @@ "oneOf": [ { "$ref": "#/components/schemas/FMPKeyMetrics" - }, - { - "$ref": "#/components/schemas/IntrinioKeyMetrics" } ], "discriminator": { "propertyName": "provider", "mapping": { - "fmp": "#/components/schemas/FMPKeyMetrics", - "intrinio": "#/components/schemas/IntrinioKeyMetrics" + "fmp": "#/components/schemas/FMPKeyMetrics" } } }, "type": "array" }, + { + "oneOf": [ + { + "$ref": "#/components/schemas/IntrinioKeyMetrics" + } + ], + "discriminator": { + "propertyName": "provider", + "mapping": { + "intrinio": "#/components/schemas/IntrinioKeyMetrics" + } + } + }, { "type": "null" } @@ -52663,7 +47202,7 @@ "title": "Results", "description": "Serializable results.", "has_list": true, - "is_union": false, + "is_union": true, "model": "KeyMetrics" }, "provider": { @@ -52890,21 +47429,21 @@ "items": { "oneOf": [ { - "$ref": "#/components/schemas/FMPIndexHistorical" + "$ref": "#/components/schemas/FMPMarketIndices" }, { - "$ref": "#/components/schemas/IntrinioIndexHistorical" + "$ref": "#/components/schemas/IntrinioMarketIndices" }, { - "$ref": "#/components/schemas/PolygonIndexHistorical" + "$ref": "#/components/schemas/PolygonMarketIndices" } ], "discriminator": { "propertyName": "provider", "mapping": { - "fmp": "#/components/schemas/FMPIndexHistorical", - "intrinio": "#/components/schemas/IntrinioIndexHistorical", - "polygon": "#/components/schemas/PolygonIndexHistorical" + "fmp": "#/components/schemas/FMPMarketIndices", + "intrinio": "#/components/schemas/IntrinioMarketIndices", + "polygon": "#/components/schemas/PolygonMarketIndices" } } }, @@ -52982,9 +47521,6 @@ { "$ref": "#/components/schemas/FMPMarketSnapshots" }, - { - "$ref": "#/components/schemas/IntrinioMarketSnapshots" - }, { "$ref": "#/components/schemas/PolygonMarketSnapshots" } @@ -52993,7 +47529,6 @@ "propertyName": "provider", "mapping": { "fmp": "#/components/schemas/FMPMarketSnapshots", - "intrinio": "#/components/schemas/IntrinioMarketSnapshots", "polygon": "#/components/schemas/PolygonMarketSnapshots" } } @@ -53645,20 +48180,17 @@ "results": { "anyOf": [ { - "items": { - "oneOf": [ - { - "$ref": "#/components/schemas/FMPPriceTargetConsensus" - } - ], - "discriminator": { - "propertyName": "provider", - "mapping": { - "fmp": "#/components/schemas/FMPPriceTargetConsensus" - } + "oneOf": [ + { + "$ref": "#/components/schemas/FMPPriceTargetConsensus" } - }, - "type": "array" + ], + "discriminator": { + "propertyName": "provider", + "mapping": { + "fmp": "#/components/schemas/FMPPriceTargetConsensus" + } + } }, { "type": "null" @@ -53666,7 +48198,7 @@ ], "title": "Results", "description": "Serializable results.", - "has_list": true, + "has_list": false, "is_union": false, "model": "PriceTargetConsensus" }, @@ -55028,6 +49560,88 @@ "title": "OBBject_SymbolMap", "description": "OBBject with results of type SymbolMap" }, + "OBBject_TrailingDividendYield": { + "properties": { + "_id": { + "type": "string", + "title": " Id" + }, + "results": { + "anyOf": [ + { + "items": { + "oneOf": [ + { + "$ref": "#/components/schemas/TiingoTrailingDivYield" + } + ], + "discriminator": { + "propertyName": "provider", + "mapping": { + "tiingo": "#/components/schemas/TiingoTrailingDivYield" + } + } + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Results", + "description": "Serializable results.", + "has_list": true, + "is_union": false, + "model": "TrailingDividendYield" + }, + "provider": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Provider", + "description": "Provider name." + }, + "warnings": { + "anyOf": [ + { + "items": { + "$ref": "#/components/schemas/Warning_" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Warnings", + "description": "List of warnings." + }, + "chart": { + "anyOf": [ + { + "$ref": "#/components/schemas/Chart" + }, + { + "type": "null" + } + ], + "description": "Chart object." + }, + "extra": { + "type": "object", + "title": "Extra", + "description": "Extra info." + } + }, + "type": "object", + "title": "OBBject_TrailingDividendYield", + "description": "OBBject with results of type TrailingDividendYield" + }, "OBBject_TreasuryConstantMaturity": { "properties": { "_id": { @@ -55379,6 +49993,9 @@ }, { "$ref": "#/components/schemas/IntrinioWorldNews" + }, + { + "$ref": "#/components/schemas/TiingoWorldNews" } ], "discriminator": { @@ -55386,7 +50003,8 @@ "mapping": { "benzinga": "#/components/schemas/BenzingaWorldNews", "fmp": "#/components/schemas/FMPWorldNews", - "intrinio": "#/components/schemas/IntrinioWorldNews" + "intrinio": "#/components/schemas/IntrinioWorldNews", + "tiingo": "#/components/schemas/TiingoWorldNews" } } }, @@ -56596,8 +51214,7 @@ "vwap": { "anyOf": [ { - "type": "number", - "exclusiveMinimum": 0.0 + "type": "number" }, { "type": "null" @@ -56910,7 +51527,7 @@ } ], "title": "Sequence Num", - "description": "The sequence number represents the sequence in which message events happened. These are increasing and unique per ticker symbol, but will not always be sequential (e.g., 1, 2, 6, 9, 10, 11)" + "description": "\n The sequence number represents the sequence in which message events happened.\n These are increasing and unique per ticker symbol, but will not always be sequential\n (e.g., 1, 2, 6, 9, 10, 11)\n " }, "participant_timestamp": { "anyOf": [ @@ -56923,7 +51540,7 @@ } ], "title": "Participant Timestamp", - "description": "The nanosecond accuracy Participant/Exchange Unix Timestamp. This is the timestamp of when the quote was actually generated at the exchange." + "description": "\n The nanosecond accuracy Participant/Exchange Unix Timestamp.\n This is the timestamp of when the quote was actually generated at the exchange.\n " }, "sip_timestamp": { "anyOf": [ @@ -56936,7 +51553,7 @@ } ], "title": "Sip Timestamp", - "description": "The nanosecond accuracy SIP Unix Timestamp. This is the timestamp of when the SIP received this quote from the exchange which produced it." + "description": "\n The nanosecond accuracy SIP Unix Timestamp.\n This is the timestamp of when the SIP received this quote from the exchange which produced it.\n " }, "trf_timestamp": { "anyOf": [ @@ -56949,7 +51566,7 @@ } ], "title": "Trf Timestamp", - "description": "The nanosecond accuracy TRF (Trade Reporting Facility) Unix Timestamp. This is the timestamp of when the trade reporting facility received this quote." + "description": "\n The nanosecond accuracy TRF (Trade Reporting Facility) Unix Timestamp.\n This is the timestamp of when the trade reporting facility received this quote.\n " } }, "additionalProperties": true, @@ -57620,12 +52237,13 @@ "title": "PolygonIndexHistorical", "description": "Polygon Index Historical Data." }, - "PolygonMarketSnapshots": { + "PolygonMarketIndices": { "properties": { - "symbol": { + "date": { "type": "string", - "title": "Symbol", - "description": "Symbol representing the entity requested in the data." + "format": "date-time", + "title": "Date", + "description": "The date of the data." }, "open": { "anyOf": [ @@ -57687,6 +52305,83 @@ "title": "Volume", "description": "The trading volume." }, + "transactions": { + "anyOf": [ + { + "type": "integer", + "exclusiveMinimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Transactions", + "description": "Number of transactions for the symbol in the time period." + } + }, + "additionalProperties": true, + "type": "object", + "required": [ + "date" + ], + "title": "PolygonMarketIndices", + "description": "Polygon Market Indices Data." + }, + "PolygonMarketSnapshots": { + "properties": { + "symbol": { + "type": "string", + "title": "Symbol", + "description": "Symbol representing the entity requested in the data." + }, + "open": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Open", + "description": "The open price." + }, + "high": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "High", + "description": "The high price." + }, + "low": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Low", + "description": "The low price." + }, + "close": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Close", + "description": "The close price." + }, "prev_close": { "anyOf": [ { @@ -57709,7 +52404,7 @@ } ], "title": "Change", - "description": "The change in price from the previous close." + "description": "The change in price." }, "change_percent": { "anyOf": [ @@ -57721,9 +52416,19 @@ } ], "title": "Change Percent", - "description": "The change in price from the previous close, as a normalized percent.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" + "description": "The change, as a percent." + }, + "volume": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Volume", + "description": "The trading volume." }, "vwap": { "anyOf": [ @@ -58750,7 +53455,7 @@ } ], "title": "Is Paid Kind", - "description": "If the debt security payments are paid in kind." + "description": "If the debt security payments are are paid in kind." }, "derivative_category": { "anyOf": [ @@ -59314,129 +54019,6 @@ "title": "SecEtfHoldings", "description": "SEC ETF Holdings Data." }, - "SecForm13FHR": { - "properties": { - "period_ending": { - "type": "string", - "format": "date", - "title": "Period Ending", - "description": "The end-of-quarter date of the filing." - }, - "issuer": { - "type": "string", - "title": "Issuer", - "description": "The name of the issuer." - }, - "cusip": { - "type": "string", - "title": "Cusip", - "description": "The CUSIP of the security." - }, - "asset_class": { - "type": "string", - "title": "Asset Class", - "description": "The title of the asset class for the security." - }, - "security_type": { - "anyOf": [ - { - "type": "string", - "enum": [ - "SH", - "PRN" - ] - }, - { - "type": "null" - } - ], - "title": "Security Type", - "description": "The total number of shares of the class of security or the principal amount of such class. 'SH' for shares. 'PRN' for principal amount. Convertible debt securities are reported as 'PRN'." - }, - "option_type": { - "anyOf": [ - { - "type": "string", - "enum": [ - "call", - "put" - ] - }, - { - "type": "null" - } - ], - "title": "Option Type", - "description": "Defined when the holdings being reported are put or call options. Only long positions are reported." - }, - "voting_authority_sole": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Voting Authority Sole", - "description": "The number of shares for which the Manager exercises sole voting authority (none)." - }, - "voting_authority_shared": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Voting Authority Shared", - "description": "The number of shares for which the Manager exercises a defined shared voting authority (none)." - }, - "voting_authority_other": { - "anyOf": [ - { - "type": "integer" - }, - { - "type": "null" - } - ], - "title": "Voting Authority Other", - "description": "The number of shares for which the Manager exercises other shared voting authority (none)." - }, - "principal_amount": { - "type": "integer", - "title": "Principal Amount", - "description": "The total number of shares of the class of security or the principal amount of such class. Only long positions are reported" - }, - "value": { - "type": "integer", - "title": "Value", - "description": "The fair market value of the holding of the particular class of security. The value reported for options is the fair market value of the underlying security with respect to the number of shares controlled. Values are rounded to the nearest US dollar and use the closing price of the last trading day of the calendar year or quarter." - }, - "weight": { - "type": "number", - "title": "Weight", - "description": "The weight of the security relative to the market value of all securities in the filing , as a normalized percent.", - "x-frontend_multiply": 100, - "x-unit_measurement": "percent" - } - }, - "additionalProperties": true, - "type": "object", - "required": [ - "period_ending", - "issuer", - "cusip", - "asset_class", - "principal_amount", - "value", - "weight" - ], - "title": "SecForm13FHR", - "description": "SEC Form 13F-HR Data." - }, "SecInstitutionsSearch": { "properties": { "name": { @@ -59774,50 +54356,20 @@ "title": "TEEconomicCalendar", "description": "Trading Economics Economic Calendar Data." }, - "UDFSearchResult": { + "TiingoCompanyNews": { "properties": { - "symbol": { + "date": { "type": "string", - "title": "Symbol" + "format": "date-time", + "title": "Date", + "description": "The date of the data. Here it is the published date of the article." }, - "full_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Full Name" - }, - "name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Name" - }, - "short_name": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Short Name" - }, - "description": { + "title": { "type": "string", - "title": "Description" + "title": "Title", + "description": "Title of the article." }, - "exchange": { + "text": { "anyOf": [ { "type": "string" @@ -59826,17 +54378,17 @@ "type": "null" } ], - "title": "Exchange" + "title": "Text", + "description": "Text/body of the article." }, - "ticker": { - "type": "string", - "title": "Ticker" - }, - "logo_urls": { + "images": { "anyOf": [ { "items": { - "type": "string" + "additionalProperties": { + "type": "string" + }, + "type": "object" }, "type": "array" }, @@ -59844,22 +54396,531 @@ "type": "null" } ], - "title": "Logo Urls" + "title": "Images", + "description": "Images associated with the article." }, - "type": { + "url": { "type": "string", - "title": "Type" + "title": "Url", + "description": "URL to the article." + }, + "symbols": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Symbols", + "description": "Symbols associated with the article." + }, + "tags": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Tags", + "description": "Tags associated with the news article." + }, + "article_id": { + "type": "integer", + "title": "Article Id", + "description": "Unique ID of the news article." + }, + "source": { + "type": "string", + "title": "Source", + "description": "News source." + }, + "crawl_date": { + "type": "string", + "format": "date-time", + "title": "Crawl Date", + "description": "Date the news article was crawled." } }, + "additionalProperties": true, "type": "object", "required": [ - "symbol", - "description", - "ticker", - "type" + "date", + "title", + "url", + "article_id", + "source", + "crawl_date" ], - "title": "UDFSearchResult", - "description": "UDF Symbol Search Model." + "title": "TiingoCompanyNews", + "description": "Tiingo Company News data." + }, + "TiingoCryptoHistorical": { + "properties": { + "date": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "string", + "format": "date-time" + } + ], + "title": "Date", + "description": "The date of the data." + }, + "open": { + "type": "number", + "exclusiveMinimum": 0.0, + "title": "Open", + "description": "The open price." + }, + "high": { + "type": "number", + "exclusiveMinimum": 0.0, + "title": "High", + "description": "The high price." + }, + "low": { + "type": "number", + "exclusiveMinimum": 0.0, + "title": "Low", + "description": "The low price." + }, + "close": { + "type": "number", + "exclusiveMinimum": 0.0, + "title": "Close", + "description": "The close price." + }, + "volume": { + "type": "number", + "title": "Volume", + "description": "The trading volume." + }, + "vwap": { + "anyOf": [ + { + "type": "number", + "exclusiveMinimum": 0.0 + }, + { + "type": "null" + } + ], + "title": "Vwap", + "description": "Volume Weighted Average Price over the period." + }, + "transactions": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Transactions", + "description": "Number of transactions for the symbol in the time period." + }, + "volume_notional": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Volume Notional", + "description": "The last size done for the asset on the specific date in the quote currency. The volume of the asset on the specific date in the quote currency." + } + }, + "additionalProperties": true, + "type": "object", + "required": [ + "date", + "open", + "high", + "low", + "close", + "volume" + ], + "title": "TiingoCryptoHistorical", + "description": "Tiingo Crypto Historical Price Data." + }, + "TiingoCurrencyHistorical": { + "properties": { + "date": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "string", + "format": "date-time" + } + ], + "title": "Date", + "description": "The date of the data." + }, + "open": { + "type": "number", + "exclusiveMinimum": 0.0, + "title": "Open", + "description": "The open price." + }, + "high": { + "type": "number", + "exclusiveMinimum": 0.0, + "title": "High", + "description": "The high price." + }, + "low": { + "type": "number", + "exclusiveMinimum": 0.0, + "title": "Low", + "description": "The low price." + }, + "close": { + "type": "number", + "exclusiveMinimum": 0.0, + "title": "Close", + "description": "The close price." + }, + "volume": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Volume", + "description": "The trading volume." + }, + "vwap": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Vwap", + "description": "Volume Weighted Average Price over the period." + } + }, + "additionalProperties": true, + "type": "object", + "required": [ + "date", + "open", + "high", + "low", + "close" + ], + "title": "TiingoCurrencyHistorical", + "description": "Tiingo Currency Historical Price Data." + }, + "TiingoEquityHistorical": { + "properties": { + "date": { + "anyOf": [ + { + "type": "string", + "format": "date" + }, + { + "type": "string", + "format": "date-time" + } + ], + "title": "Date", + "description": "The date of the data." + }, + "open": { + "type": "number", + "title": "Open", + "description": "The open price." + }, + "high": { + "type": "number", + "title": "High", + "description": "The high price." + }, + "low": { + "type": "number", + "title": "Low", + "description": "The low price." + }, + "close": { + "type": "number", + "title": "Close", + "description": "The close price." + }, + "volume": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Volume", + "description": "The trading volume." + }, + "vwap": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Vwap", + "description": "Volume Weighted Average Price over the period." + }, + "adj_open": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Adj Open", + "description": "Adjusted open price during the period." + }, + "adj_high": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Adj High", + "description": "Adjusted high price during the period." + }, + "adj_low": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Adj Low", + "description": "Adjusted low price during the period." + }, + "adj_close": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Adj Close", + "description": "Adjusted closing price during the period." + }, + "adj_volume": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Adj Volume", + "description": "Adjusted volume during the period." + }, + "split_ratio": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Split Ratio", + "description": "Ratio of the equity split, if a equity split occurred." + }, + "dividend": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "title": "Dividend", + "description": "Dividend amount, if a dividend was paid." + } + }, + "additionalProperties": true, + "type": "object", + "required": [ + "date", + "open", + "high", + "low", + "close" + ], + "title": "TiingoEquityHistorical", + "description": "Tiingo Equity Historical Price Data." + }, + "TiingoTrailingDivYield": { + "properties": { + "date": { + "type": "string", + "format": "date", + "title": "Date", + "description": "The date of the data." + }, + "trailing_dividend_yield": { + "type": "number", + "title": "Trailing Dividend Yield", + "description": "Trailing dividend yield." + } + }, + "additionalProperties": true, + "type": "object", + "required": [ + "date", + "trailing_dividend_yield" + ], + "title": "TiingoTrailingDivYield", + "description": "Tiingo Trailing Dividend Yield Data." + }, + "TiingoWorldNews": { + "properties": { + "date": { + "type": "string", + "format": "date-time", + "title": "Date", + "description": "The date of the data. The published date of the article." + }, + "title": { + "type": "string", + "title": "Title", + "description": "Title of the article." + }, + "images": { + "anyOf": [ + { + "items": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Images", + "description": "Images associated with the news." + }, + "text": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Text", + "description": "Text/body of the article." + }, + "url": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Url", + "description": "URL to the article." + }, + "symbols": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Symbols", + "description": "Ticker tagged in the fetched news." + }, + "article_id": { + "type": "integer", + "title": "Article Id", + "description": "Unique ID of the news article." + }, + "site": { + "type": "string", + "title": "Site", + "description": "News source." + }, + "tags": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Tags", + "description": "Tags associated with the news article." + }, + "crawl_date": { + "type": "string", + "format": "date-time", + "title": "Crawl Date", + "description": "Date the news article was crawled." + } + }, + "additionalProperties": true, + "type": "object", + "required": [ + "date", + "title", + "article_id", + "site", + "crawl_date" + ], + "title": "TiingoWorldNews", + "description": "Tiingo World News Data." }, "UDFSubsession": { "properties": { @@ -60089,28 +55150,6 @@ "title": "Currency Code", "default": "USD" }, - "sector": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Sector" - }, - "industry": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "null" - } - ], - "title": "Industry" - }, "fractional": { "anyOf": [ { @@ -60159,6 +55198,7 @@ "30", "60", "D", + "1D", "W", "M", "3M", @@ -60272,6 +55312,86 @@ "title": "UDFSymbol", "description": "UDF Symbol Model." }, + "UDFSymbolSearch": { + "properties": { + "symbol": { + "type": "string", + "title": "Symbol" + }, + "full_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Full Name" + }, + "name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Name" + }, + "short_name": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "title": "Short Name" + }, + "description": { + "type": "string", + "title": "Description" + }, + "exchange": { + "type": "string", + "title": "Exchange" + }, + "ticker": { + "type": "string", + "title": "Ticker" + }, + "logo_urls": { + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "title": "Logo Urls" + }, + "type": { + "type": "string", + "title": "Type" + } + }, + "type": "object", + "required": [ + "symbol", + "description", + "exchange", + "ticker", + "type" + ], + "title": "UDFSymbolSearch" + }, "ValidationError": { "properties": { "loc": { diff --git a/website/content/platform/development/how-to/add_data_provider_extension.md b/website/content/platform/development/how-to/add_data_provider_extension.md index 796821adf8c..f8d99af0332 100644 --- a/website/content/platform/development/how-to/add_data_provider_extension.md +++ b/website/content/platform/development/how-to/add_data_provider_extension.md @@ -212,7 +212,7 @@ The updated endpoint's function signature will now display the additional provid ```python Signature: obb.derivatives.options.chains( - symbol: typing.Annotated[str, OpenBBCustomParameter(description='Symbol to get data for.')], + symbol: typing.Annotated[str, OpenBBField(description='Symbol to get data for.')], provider: Optional[Literal['cboe', 'intrinio', 'tmx', 'tradier']] = None, **kwargs, ) -> openbb_core.app.model.obbject.OBBject @@ -270,4 +270,3 @@ Now, you can pip install your package from PyPI with: ```bash pip install openbb-some_ext ``` - diff --git a/website/content/platform/extensions/charting/_category_.json b/website/content/platform/extensions/charting/_category_.json new file mode 100644 index 00000000000..bbcd6d4e083 --- /dev/null +++ b/website/content/platform/extensions/charting/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Charting", + "position": 3 +} \ No newline at end of file diff --git a/website/content/platform/extensions/charting/examples.md b/website/content/platform/extensions/charting/examples.md new file mode 100644 index 00000000000..87b9918ceed --- /dev/null +++ b/website/content/platform/extensions/charting/examples.md @@ -0,0 +1,165 @@ +--- +title: Examples +sidebar_position: 1 +description: This page provides examples of creating charts with the `openbb-charting` extension. +keywords: +- tutorial +- OpenBB Platform +- Python client +- Fast API +- getting started +- extensions +- charting +- view +- Plotly +- toolkits +- how-to +- generic +- figure +--- + +import HeadTitle from '@site/src/components/General/HeadTitle.tsx'; + + + +## Overview + +This page will walk through creating different charts using the `openbb-charting` extension. +The perspective for this content is from the the Python Interface, +and the examples will assume that the OpenBB Platform is installed with all optional packages. + +```python +from datetime import datetime, timedelta +from openbb import obb +``` + +## Cumulative Returns + +The historical (equity) prices can be requested for multiple symbols. +The extension will attempt to handle variations accordingly. +By default, more than three symbols will draw the chart as cumulative returns from the beginning of the series. + +### Default View + +The tickers below are a collection of State Street Global Advisors SPDR funds, representing S&P 500 components. +The data is looking back five years. + +``` +SPDRS = [ + "SPY", + "XLE", + "XLB", + "XLI", + "XHB", + "XLP", + "XLY", + "XRT", + "XLF", + "XLV", + "XLK", + "XLC", + "XLU", + "XLRE", +] +start_date = (datetime.now() - timedelta(weeks=52*5)).date() +spdrs = obb.equity.price.historical(SPDRS, start_date=start_date, provider="yfinance", chart=True) + +spdrs.show() +``` + +![SPDRs Cumulative Returns - 5 years](https://github.com/OpenBB-finance/OpenBBTerminal/assets/85772166/8884f4ed-b09c-4161-9dc6-87ad66d9fc8b) + +### Redraw as YTD + +The `charting` attribute of the command output has methods for creating the chart again. +The `data` parameter allows modifications to the data before creating the figure. +In this example, the length of the data is trimmed to the beginning of the year. + +```python +new_data = spdrs.to_df().loc[datetime(2023,12,29).date():] +spdrs.charting.to_chart(data=new_data, title="YTD") +``` + +:::note +This replaces the chart that was already created. +::: + +![SPDRs Cumulative Returns - YTD](https://github.com/OpenBB-finance/OpenBBTerminal/assets/85772166/22ed2588-1098-4712-aec1-54dd22c324ef) + +## Price Performance Bar Chart + +The `obb.equity.price.performance` endpoint will create a bar chart over intervals. + +```python +price_performance = obb.equity.price.performance(SPDRS, chart=True) +price_performance.show() +``` + +![Price Performance](https://github.com/OpenBB-finance/OpenBBTerminal/assets/85772166/0de3260d-7fce-490b-90e1-bdfa38d6ab23) + +### Create Bar Chart + +This example uses the `create_bar_chart()` method, which does not replace the existing chart, in `price_performance.chart`. +It isolates the one-month performance and orients the layout as horizontal. + +```python +new_data = price_performance.to_df().set_index("symbol").multiply(100).reset_index() +price_performance.charting.create_bar_chart( + data=new_data, + x="symbol", + y="one_month", + orientation="h", + title="One Month Price Performance", + xtitle="Percent (%)" +) +``` + +![Horizonontal Price Performance](https://github.com/OpenBB-finance/OpenBBTerminal/assets/85772166/8da01f73-d7a8-4168-846a-9fa9ed6a0e39) + +## Create Your Own + +This example analyzes the share volume turnover of the S&P 500 Energy Sector constituents, year-to-date. + +```python +symbols = [ + 'XOM', + 'CVX', + 'COP', + 'EOG', + 'MPC', + 'SLB', + 'PSX', + 'PXD', + 'VLO', + 'WMB', + 'OKE', + 'OXY', + 'HES', + 'FANG', + 'HAL', + 'KMI', + 'DVN', + 'BKR', + 'TRGP', + 'CTRA', + 'MRO', + 'EQT', + 'APA' +] +data = obb.equity.price.historical(symbols, start_date="2024-01-01", provider="yfinance") +create_bar_chart = data.charting.create_bar_chart +volume = data.to_df().groupby("symbol").sum()["volume"] +shares = obb.equity.profile( + symbols, provider="yfinance" +).to_df().set_index("symbol")["shares_float"] +df = volume.to_frame().join(shares) +df["Turnover"] = (df.shares_float/df.volume).round(4) +df = df.sort_values(by="Turnover", ascending=False).reset_index() +create_bar_chart( + data=df, + x="symbol", + y="Turnover", + title="S&P Energy Sector YTD Turnover Rate", +) +``` +![S&P 500 Energy Sector Turnover Rate](https://github.com/OpenBB-finance/OpenBBTerminal/assets/85772166/4f59eb36-e637-4a54-87ab-e730e43baf8d) diff --git a/website/content/platform/extensions/charting/index.md b/website/content/platform/extensions/charting/index.md new file mode 100644 index 00000000000..f55bbe6a8fe --- /dev/null +++ b/website/content/platform/extensions/charting/index.md @@ -0,0 +1,358 @@ +--- +title: OpenBB Charting +sidebar_position: 1 +description: This page introduces the optional openbb-charting extension. +keywords: +- explanation +- OpenBB Platform +- Python client +- Fast API +- getting started +- extensions +- charting +- view +- Plotly +- toolkits +- community +- Plotly +- OpenBBFigure +- PyWry +--- + +import HeadTitle from '@site/src/components/General/HeadTitle.tsx'; + + + +## Overview + +The `openbb-charting` extension provides elements for building and displaying interactive charts, tables, dashboards, and more, directly from the OpenBB Platform's Python Interface and FAST API. + +It allows users to create a custom view, without any previous experience working with Plotly, from any response served by the OpenBB Platform. + +The Python Interface includes a custom [PyWry](https://github.com/OpenBB-finance/pywry) backend for displaying any content, in a WebKit HTML window served over `localhost`. In an IDE setting, they will be rendered inline. + +To install, follow the instructions [here](installation). The sections below provide a general explanation of the extension. + +## How Does It Work? + +It works by extending the `OBBject` class with a new attribute, `charting`. When it is installed, every response from the OpenBB Platform will be equipped with these tools. + +For functions that have pre-defined views, it serves as an intermediary between the user request and the response, activated when `chart=True`. When a chart is created, it will populate the existing, `chart`, attribute of the `OBBject`. This is where it is served by the FAST API from the function request. In the Python Interface, charts can be generated post-request, regardless of `chart=True`. + +The `chart` attribute in the OBBject contains three items, responses from the API have two: + +- `fig`: The OpenBBFigure object - an extended Plotly GraphObjects class. Not included in the API response. +- `content`: The Plotly JSON representation of the chart - Returned to the API. +- `format`: The format of the chart - 'plotly' is currently the only charting library. + +There is one OBBject class method, `show()`, which will display the contents of the `chart` attribute, if populated. + +The new `charting` attribute that binds to the OBBject also has a `show()` method. This differs in that it overwrites the existing chart, effectively a 'reset' for the view. + +The extension has a docstring, and it lists the class methods within `charting`. + +```python +from openbb import obb +data = obb.equity.price.historical("AAPL") +data.charting? +``` + +```console +Charting extension. + +Methods +------- +show + Display chart and save it to the OBBject. +to_chart + Redraw the chart and save it to the OBBject, with an optional entry point for Data. +functions + Return a list of Platform commands with charting functions. +get_params + Return the charting parameters for the function the OBBject was created from. +indicators + Return the list of the available technical indicators to use with the `to_chart` method and OHLC+V data. +table + Display an interactive table. +create_line_chart + Create a line chart from external data. +create_bar_chart + Create a bar chart, on a single x-axis with one or more values for the y-axis, from external data. +``` + +:::note +When creating a chart directly from the OpenBB Platform endpoint, chart parameters must be passed as a nested dictionary under the name, `chart_params`. + +```python +chart_params = dict( + title="AAPL 50/200 Day EMA", + indicators=dict( + ema=dict(length=[50,200]), + ), +) +params = dict( + symbol="AAPL", + start_date="2022-01-01", + provider="yfinance", + chart=True, + chart_params=chart_params, +) +data = obb.equity.price.historical(**params) +``` + +`chart_params` are sent in the body of the request when using the API. +::: + +Passing only `chart=True` will return a default view which can be modified and drawn again post-request, via the `OBBject`. + +```console +OBBject + +id: 06614d74-7443-7201-8000-a65f358136a3 +results: [{'date': datetime.date(2022, 1, 3), 'open': 177.8300018310547, 'high': 18... +provider: yfinance +warnings: None +chart: {'content': {'data': [{'close': [182.00999450683594, 179.6999969482422, 174.... +extra: {'metadata': {'arguments': {'provider_choices': {'provider': 'yfinance'}, 's... +``` + +```python +data.show() +``` + +![candles with ema](https://github.com/OpenBB-finance/OpenBBTerminal/assets/85772166/b427d68b-777e-4230-852a-df749c5dbc46) + +### No Render + +The charts can be created without opening the PyWry window, and this is the default behaviour when `chart=True`. +With the `charting.show()` and `charting.to_chart()` methods, the default is `render=True`. +Setting as `False` will return the chart to itself, populating the `chart` attribute of OBBject. + +## What Endpoints Have Charts? + +The OpenBB Platform router, open_api.json, function signatures, and documentation are all generated based on your specific configuration. When the `openbb-charting` extension is installed, any function found in the "[charting_router](https://github.com/OpenBB-finance/OpenBBTerminal/blob/develop/openbb_platform/obbject_extensions/charting/openbb_charting/charting_router.py)" adds `chart: bool = False` to the command on build. For example, `obb.index.price.historical?` + +```python +Signature: +obb.index.price.historical( + symbol: Annotated[Union[str, List[str]], OpenBBCustomParameter(description='Symbol to get data for. Multiple comma separated items allowed for provider(s): cboe, fmp, intrinio, polygon, yfinance.')], + ... + chart: typing.Annotated[bool, OpenBBCustomParameter(description='Whether to create a chart or not, by default False.')] = False, + **kwargs, +) -> openbb_core.app.model.obbject.OBBject +``` + +### Charting Functions + +The `charting` attribute of every command output has methods for identifying the charting functions and parameters. +While able to serve JSON-serializable charts, the `openbb-charting` extension is best-suited for use with the Python Interface. Much of the functionality is realized post-request. + +Examine the extension by returning any command at all. + +```python +from openbb import obb + +data = obb.equity.price.historical("SPY,QQQ,XLK,BTC-USD", provider="yfinance") + +data.charting.functions() +``` + +```console +['crypto_price_historical', + 'currency_price_historical', + 'economy_fred_series', + 'equity_price_historical', + 'equity_price_performance', + 'etf_historical', + 'etf_holdings', + 'etf_price_performance', + 'index_price_historical', + 'technical_adx', + 'technical_aroon', + 'technical_cones', + 'technical_ema', + 'technical_hma', + 'technical_macd', + 'technical_rsi', + 'technical_sma', + 'technical_wma', + 'technical_zlma'] +``` + +:::tip +The list above should, as shown here, should not be considered as the source of truth. It's just a sample. +::: + +If the `OBBject` in question has a dedicated charting function associated with it, parameters are detailed by the `get_params()` method. + +```console +EquityPriceHistoricalChartQueryParams + + Parameters + ---------- + + data : Union[Data, list[Data], NoneType] + Filtered versions of the data contained in the original `self.results`. + Columns should be the same as the original data. + Example use is to reduce the number of columns, or the length of data, to plot. + + title : Union[str, NoneType] + Title of the chart. + + target : Union[str, NoneType] + The specific column to target. + If supplied, this will override the candles and volume parameters. + + multi_symbol : bool + Flag to indicate whether the data contains multiple symbols. + This is mostly handled automatically, but if the chart fails to generate try setting this to True. + + same_axis : bool + If True, forces all data to be plotted on the same axis. + + normalize : bool + If True, the data will be normalized and placed on the same axis. + + returns : bool + If True, the cumulative returns for the length of the time series will be calculated and plotted. + + candles : bool + If True, and OHLC exists, and there is only one symbol in the data, candles will be plotted. + + heikin_ashi : bool + If True, and `candles=True`, Heikin Ashi candles will be plotted. + + volume : bool + If True, and volume exists, and `candles=True`, volume will be plotted. + + indicators : Union[ChartIndicators, dict[str, dict[str, Any]], NoneType] + Indicators to be plotted, formatted as a dictionary. + Data containing multiple symbols will ignore indicators. + Example: + indicators = dict( + sma=dict(length=[20,30,50]), + adx=dict(length=14), + rsi=dict(length=14), + ) +``` + +Not all commands will have the same `chart_params`, and some less than others, but it is always possible to redraw the chart with a different combination post-request. Here's what the default chart is from the output of the command above. + +If `chart=True` was not specified, it will need to be created. + +```python +data.charting.to_chart() +``` + +![obb.equity.price.historical()](https://github.com/OpenBB-finance/OpenBBTerminal/assets/85772166/9231c455-ee1b-47a8-a627-b0034ea52ecd) + +The extension recognized that multiple symbols were within the object, and made a determination to display cumulative returns by default. + +A candlestick chart will draw only when there is one symbol in the data. + +```python +obb.equity.price.historical( + symbol="XLK", + start_date="2024-01-01", + provider="yfinance", + chart=True, + chart_params=dict(title="XLK YTD", heikin_ashi=True) +).show() +``` + +![obb.equity.price.historical()](https://github.com/OpenBB-finance/OpenBBTerminal/assets/85772166/13af30b3-7298-402d-ac32-1f7700cd08fd) + +## Endpoints Without Charts + +Most functions do not have dedicated charts. However, it's still possible to generate one automatically. Using the `data` above, we can try passing it through a quantitative analysis command. + +```python +data = obb.equity.price.historical( + symbol="XLK", + start_date="2023-01-01", + provider="yfinance", +) +qa = obb.quantitative.rolling.stdev(data.results, target="close") + +qa.charting.show(title="XLK Rolling 21 Day Standard Deviation") +``` + +![auto chart](https://github.com/OpenBB-finance/OpenBBTerminal/assets/85772166/f87a6648-7365-4529-a254-35897af448ca) + +## Charts From Any Data + +There are methods for creating a generic chart from any external data. +They will bypass any data contained in the parent object, unless specifically fed into itself. + +- charting.create_bar_chart() +- charting.create_line_chart() + +They can also be used as standalone components by initializing an empty instance of the OBBject class. + +```python +from openbb import obb +from openbb_core.app.model.obbject import OBBject +create_bar_chart = OBBject(results=None).charting.create_bar_chart + +create_bar_chart? +```` + +```console +Create a bar chart on a single x-axis with one or more values for the y-axis. + +Parameters +---------- +data : Union[list, dict, pd.DataFrame, List[pd.DataFrame], pd.Series, List[pd.Series], np.ndarray, Data] + Data to plot. +x : str + The x-axis column name. +y : Union[str, List[str]] + The y-axis column name(s). +barmode : Literal["group", "stack", "relative", "overlay"], optional + The bar mode, by default "group". +xtype : Literal["category", "multicategory", "date", "log", "linear"], optional + The x-axis type, by default "category". +title : Optional[str], optional + The title of the chart, by default None. +xtitle : Optional[str], optional + The x-axis title, by default None. +ytitle : Optional[str], optional + The y-axis title, by default None. +orientation : Literal["h", "v"], optional + The orientation of the chart, by default "v". +colors: Optional[List[str]], optional + Manually set the colors to cycle through for each column in 'y', by default None. +layout_kwargs : Optional[Dict[str, Any]], optional + Additional keyword arguments to apply with figure.update_layout(), by default None. + +Returns +------- +OpenBBFigure + The OpenBBFigure object. +``` + +## Tables + +The `openbb-charting` extension is equipped with interactive tables, utilizing the React framework. They are displayed by using the `table` method. + +```python +data = obb.equity.price.quote("AAPL,MSFT,GOOGL,META,TSLA,AMZN", provider="yfinance") +data.charting.table() +``` +![Interactive Tables](https://github.com/OpenBB-finance/OpenBBTerminal/assets/85772166/77f5f812-b933-4ced-929c-c1e39b2a3eed) + +External data can also be supplied, providing an opportunity to filter or apply Pandas operations before display. + +``` +new_df = df.to_df().T +new_df.index.name="metric" +new_df.columns = new_df.loc["symbol"] +new_df.drop("symbol", inplace=True) +data.charting.table(data=new_df) +``` + +![Tables From External Data](https://github.com/OpenBB-finance/OpenBBTerminal/assets/85772166/d02f8c34-e1d1-4001-a73e-d3b948a4c5c1) + +:::important +This does not alter the contents of the original object, the displayed data is a copy. +::: diff --git a/website/content/platform/extensions/charting/indicators.md b/website/content/platform/extensions/charting/indicators.md new file mode 100644 index 00000000000..9966ba4571f --- /dev/null +++ b/website/content/platform/extensions/charting/indicators.md @@ -0,0 +1,384 @@ +--- +title: Indicators +sidebar_position: 2 +description: A tutorial of the technical indicators included with the openbb-charting library, including how to get started using them. +keywords: +- tutorial +- OpenBB Platform +- getting started +- extensions +- charting +- view +- Plotly +- toolkits +- indicators +- Plotly +- OpenBBFigure +- PyWry +--- + +import HeadTitle from '@site/src/components/General/HeadTitle.tsx'; + + + +## Introduction + +Select indicators (technical) can be added to a chart where the data is OHLC+V prices over time, and the data is for one symbol only. +They are meant as quick visualizations, and a way to build more complex charts. +As starting points, they can be refined to perfection by manipulating the figure object directly. + +```python +from datetime import datetime, timedelta +from openbb import obb +data = obb.equity.price.historical( + "TSLA", + provider="yfinance", + interval="15m", + start_date=(datetime.now()-timedelta(days=21)).date(), + chart=True, + chart_params=dict( + heikin_ashi=True, + indicators=(dict( + ema=dict(length=[8,32]), + srlines={}, # For indicators, an empty dictionary implies the default state. + rsi=dict(length=32) + )) + ) +) +data.show() +``` + +![TSLA Intraday With Indicators](https://github.com/OpenBB-finance/OpenBBTerminal/assets/85772166/7d8d95d8-0383-4e9d-9477-7ad2424328df) + +## Available Indicators + +To get all the indicators, use the `charting.indicators()` method. +The object returned is a Pydantic model where each indicator is field. +If you don't catch it, it will print as a docstring to the console. + +:::danger +Some indicators, like RSI and MACD, create subplots. Only 4 subplots (not including the main candles + volume) can be created within the same view. +::: + +```python +data.charting.indicators() +``` + +```console +SMA: + + Parameters + ---------- + + length : Union[int, list[int]] + Window length for the moving average, by default is 50. + The number is relative to the interval of the time series data. + + offset : int + Number of periods to offset for the moving average, by default is 0. + +EMA: + + Parameters + ---------- + + length : Union[int, list[int]] + Window length for the moving average, by default is 50. + The number is relative to the interval of the time series data. + + offset : int + Number of periods to offset for the moving average, by default is 0. + +HMA: + + Parameters + ---------- + + length : Union[int, list[int]] + Window length for the moving average, by default is 50. + The number is relative to the interval of the time series data. + + offset : int + Number of periods to offset for the moving average, by default is 0. + +WMA: + + Parameters + ---------- + + length : Union[int, list[int]] + Window length for the moving average, by default is 50. + The number is relative to the interval of the time series data. + + offset : int + Number of periods to offset for the moving average, by default is 0. + +ZLMA: + + Parameters + ---------- + + length : Union[int, list[int]] + Window length for the moving average, by default is 50. + The number is relative to the interval of the time series data. + + offset : int + Number of periods to offset for the moving average, by default is 0. + +AD: + + Parameters + ---------- + + offset : int + Offset value for the AD, by default is 0. + +AD Oscillator: + + Parameters + ---------- + + fast : int + Number of periods to use for the fast calculation, by default 3. + + slow : int + Number of periods to use for the slow calculation, by default 10. + + offset : int + Offset to be used for the calculation, by default is 0. + +ADX: + + Parameters + ---------- + + length : int + Window length for the ADX, by default is 50. + + scalar : float + Scalar to multiply the ADX by, default is 100. + + drift : int + Drift value for the ADX, by default is 1. + +Aroon: + + Parameters + ---------- + + length : int + Window length for the Aroon, by default is 50. + + scalar : float + Scalar to multiply the Aroon by, default is 100. + +ATR: + + Parameters + ---------- + + length : int + Window length for the ATR, by default is 14. + + mamode : Literal[rma, ema, sma, wma] + The mode to use for the moving average calculation. + + drift : int + The difference period. + + offset : int + Number of periods to offset the result, by default is 0. + +CCI: + + Parameters + ---------- + + length : int + Window length for the CCI, by default is 14. + + scalar : float + Scalar to multiply the CCI by, default is 0.015. + +Clenow: + + Parameters + ---------- + + period : int + The number of periods for the momentum, by default 90. + +Demark: + + Parameters + ---------- + + show_all : bool + Show 1 - 13. + If set to False, show 6 - 9. + + offset : int + Number of periods to offset the result, by default is 0. + +Donchian: + + Parameters + ---------- + + lower : Union[int, NoneType] + Window length for the lower band, by default is 20. + + upper : Union[int, NoneType] + Window length for the upper band, by default is 20. + + offset : Union[int, NoneType] + Number of periods to offset the result, by default is 0. + +Fib: + + Parameters + ---------- + + period : int + The period to calculate the Fibonacci Retracement, by default 120. + + start_date : Union[str, NoneType] + The start date for the Fibonacci Retracement. + + end_date : Union[str, NoneType] + The end date for the Fibonacci Retracement. + +Fisher: + + Parameters + ---------- + + length : int + Window length for the Fisher Transform, by default is 14. + + signal : int + Fisher Signal Period + +Ichimoku: + + Parameters + ---------- + + conversion : int + The conversion line period, by default 9. + + base : int + The base line period, by default 26. + + lagging : int + The lagging line period, by default 52. + + offset : int + The offset period, by default 26. + + lookahead : bool + Drops the Chikou Span Column to prevent potential data leak + +KC: + + Parameters + ---------- + + length : int + Window length for the Keltner Channel, by default is 20. + + scalar : float + Scalar to multiply the ATR, by default is 2. + + mamode : Literal[ema, sma, wma, hna, zlma, rma] + The mode to use for the moving average calculation, by default is ema. + + offset : int + Number of periods to offset the result, by default is 0. + +MACD: + + Parameters + ---------- + + fast : Union[int, NoneType] + Window length for the fast EMA, by default is 12. + + slow : Union[int, NoneType] + Window length for the slow EMA, by default is 26. + + signal : Union[int, NoneType] + Window length for the signal line, by default is 9. + + scalar : Union[float, NoneType] + Scalar to multiply the MACD by, default is 100. + +OBV: + + Parameters + ---------- + + offset : int + Number of periods to offset the result, by default is 0. + +RSI: + + Parameters + ---------- + + length : int + Window length for the RSI, by default is 14. + + scalar : float + Scalar to multiply the RSI by, default is 100. + + drift : int + Drift value for the RSI, by default is 1. + +SRLines: + + Parameters + ---------- + + show : bool + Show the support and resistance lines. + +Stoch: + + Parameters + ---------- + + fast_k : int + The fast K period, by default 14. + + slow_d : int + The slow D period, by default 3. + + slow_k : int + The slow K period, by default 3. +``` + +The model can be converted to a dictionary and then passed through the `indicators` params. + +The chart below is built from the same object as the one above. + +```python +indicators = data.charting.indicators().dict() +macd=indicators.get("macd") +kc=indicators.get("kc") +chart_params=dict( + candles=False, + title="My New Chart", + indicators=(dict( + macd=macd, + kc=kc, + )) +) +data.charting.to_chart(**chart_params) +``` + +![indicators2](https://github.com/OpenBB-finance/OpenBBTerminal/assets/85772166/76c06aff-a568-4b7f-80d4-c58a73c0f1d7) + +:::tip +Data can be exported directly from the chart as a CSV. Use the button at the bottom-right of the mode bar. +::: diff --git a/website/content/platform/extensions/charting/installation.md b/website/content/platform/extensions/charting/installation.md new file mode 100644 index 00000000000..2282d777aeb --- /dev/null +++ b/website/content/platform/extensions/charting/installation.md @@ -0,0 +1,71 @@ +--- +title: Installation +sidebar_position: 1 +description: This page outlines the installation of the openbb-charting extension. +keywords: +- tutorial +- OpenBB Platform +- Installation +- Python client +- Fast API +- getting started +- extensions +- charting +- view +- Plotly +- toolkit +- community +- Plotly +- OpenBBFigure +- PyWry +--- + +import HeadTitle from '@site/src/components/General/HeadTitle.tsx'; + + + +## PyPI + +To install the extension, run the following command in this folder: + +```bash +pip install openbb-charting +``` + +> Find the latest version on [PyPI](https://pypi.org/project/openbb-charting/). + +## Editable Mode + +To install from source in editable mode, navigate into the folder, `~/openbb_platform/extensions/charting`, and enter: + +```console +pip install -e . +``` + +After installation, the Python interface will automatically rebuild on initialization. This process can also be triggered manually with: + +```python +import openbb +openbb.build() +``` + +The Python interpreter may need to be restarted. + +## PyWry Dependency In Linux + +When using Linux distributions, the PyWry dependency requires certain dependencies to be installed first. + +- Debian-based / Ubuntu / Mint: +`sudo apt install libwebkit2gtk-4.0-dev` + +- Arch Linux / Manjaro: +`sudo pacman -S webkit2gtk` + +- Fedora: +`sudo dnf install gtk3-devel webkit2gtk3-devel` + +If Rust (Cargo) is required, install it: + +```console +curl --proto '=https' --tlsv1.3 https://sh.rustup.rs -sSf | sh +``` diff --git a/website/content/platform/extensions/toolkit_extensions.md b/website/content/platform/extensions/toolkit_extensions.md index d3e13b8f738..00ce133e832 100644 --- a/website/content/platform/extensions/toolkit_extensions.md +++ b/website/content/platform/extensions/toolkit_extensions.md @@ -40,14 +40,12 @@ The sections below outline any specific installation considerations for the exte ## Charting -The OpenBB Charting Extension supplies charting infrastructure and services to the OpenBB Platform. Figure objects are served via REST API or Python Client. It utilizes [PyWry](https://github.com/OpenBB-finance/pywry) for handling the display of interactive charts and tables in a separate window, with a Plotly library. The extension framework allows developers to easily insert other Python charting libraries into the router pipeline. +The OpenBB Charting Extension supplies charting infrastructure and services to the OpenBB Platform. Figure objects are served via REST API or Python Client. It utilizes [PyWry](https://github.com/OpenBB-finance/pywry) for handling the display of interactive charts and tables in a separate window, with a Plotly library. -Functions with charting enabled return figures to a field (`chart`) in the `OBBject` response object. They are displayed with the class method, `show()`. - -> Additional Python libraries are installed with this extension: `aiohttp`, `nbformat`, `pandas-ta`, `plotly`, `pywry`, `reportlab`, `scipy`, `statsmodels`, and `svglib`. +Functions with dedicated views return figures to the `chart` attribute of the `OBBject` response object. They are displayed with the class method, `show()`. :::tip -The `openbb-charting` is in fact an [`OBBject` extension](platform/development/how-to/add_obbject_extension.md) which means you'll have the functionality it exposes on every command result. +The `openbb-charting` is an [`OBBject` extension](platform/development/how-to/add_obbject_extension.md), which means the general functionality is exposed in every command result. ::: The following packages are dependencies of the `openbb-charting` extension: @@ -63,47 +61,7 @@ The following packages are dependencies of the `openbb-charting` extension: ### Installation -To install the extension, run the following command in this folder: - -```bash -pip install openbb-charting -``` - -> Find the latest version on [PyPI](https://pypi.org/project/openbb-charting/). - -To install from source in editable mode, navigate into the folder, `~/openbb_platform/extensions/charting`, and enter: - -```console -pip install -e . -``` - -After installation, the Python interface will automatically rebuild on initialization. This process can also be triggered manually with: - -```python -import openbb -openbb.build() -``` - -The Python interpreter may require a restart. - -### PyWry dependency in Linux - -When using Linux distributions, the PyWry dependency requires certain dependencies to be installed first. - -- Debian-based / Ubuntu / Mint: -`sudo apt install libwebkit2gtk-4.0-dev` - -- Arch Linux / Manjaro: -`sudo pacman -S webkit2gtk` - -- Fedora: -`sudo dnf install gtk3-devel webkit2gtk3-devel` - -If Rust (Cargo) is required, install it: - -```console -curl --proto '=https' --tlsv1.3 https://sh.rustup.rs -sSf | sh -``` +See the [charting](charting) section for more details and [installation](charting/installation) instructions. ## Devtools diff --git a/website/content/pro/advanced-search.md b/website/content/pro/advanced-search.md index e6443dda2a2..653c5d03d51 100644 --- a/website/content/pro/advanced-search.md +++ b/website/content/pro/advanced-search.md @@ -1,6 +1,6 @@ --- title: Advanced Search -sidebar_position: 6 +sidebar_position: 7 description: Learn about the functionality of the advanced search in OpenBB Terminal Pro. Discover the six main categories including Securities, Templates, Widgets, Actions, News, and the All option that enhances research and productivity. diff --git a/website/content/pro/getting-started/index.md b/website/content/pro/architecture.md similarity index 96% rename from website/content/pro/getting-started/index.md rename to website/content/pro/architecture.md index 0ad429003d5..660c70b9fff 100644 --- a/website/content/pro/getting-started/index.md +++ b/website/content/pro/architecture.md @@ -1,6 +1,6 @@ --- -title: Getting Started -sidebar_position: 0 +title: Architecture +sidebar_position: 1 description: Get started with OpenBB Terminal Pro, your comprehensive tool for investment research. Understand the layout and powerful features that can enhance your research capabilities. @@ -19,7 +19,7 @@ keywords: import HeadTitle from '@site/src/components/General/HeadTitle.tsx'; - + Welcome to the OpenBB Terminal Pro, your comprehensive tool for investment research. diff --git a/website/content/pro/copilot/index.md b/website/content/pro/copilot/index.md index 5d21786e779..e8b34344e7f 100644 --- a/website/content/pro/copilot/index.md +++ b/website/content/pro/copilot/index.md @@ -1,6 +1,6 @@ --- title: OpenBB Copilot -sidebar_position: 7 +sidebar_position: 8 description: Learn how to use OpenBB Copilot to interact with the OpenBB Terminal Pro keywords: - OpenBB Copilot @@ -108,7 +108,7 @@ Sometimes you may wish to focus your analysis and utilize OpenBB Copilot to anal a specific subset of widgets. For example, you may want to use OpenBB Copilot is assist you in a deep analysis of an earnings transcript in the "Earnings Transcript" widget, without retrieving data from the rest of the dashboard. - + To achieve this, you can chat with specifically selected widgets by clicking on the "Add widgets as context" button on each widget you wish to use while querying OpenBB Copilot. Selecting a widget in this manner will make that @@ -139,4 +139,4 @@ filenames that are descriptive of the data that they contain. For example, given a PDF file containing a technical report from TSLA released in 2024, a good filename would be `tsla_technical_report_2024.pdf`. -::: +::: diff --git a/website/content/pro/dashboards/_category_.json b/website/content/pro/dashboards/_category_.json index c805f86dfa3..ff5b5ec938f 100644 --- a/website/content/pro/dashboards/_category_.json +++ b/website/content/pro/dashboards/_category_.json @@ -1,4 +1,4 @@ { "label": "Dashboards", - "position": 5 -} \ No newline at end of file + "position": 6 +} diff --git a/website/content/pro/data-connectors/_category_.json b/website/content/pro/data-connectors/_category_.json index 50f9cdcbc83..4462097d884 100644 --- a/website/content/pro/data-connectors/_category_.json +++ b/website/content/pro/data-connectors/_category_.json @@ -1,4 +1,4 @@ { "label": "Data Connectors", - "position": 3 + "position": 4 } diff --git a/website/content/pro/data-connectors/single-widget/examples.md b/website/content/pro/data-connectors/single-widget/examples.md new file mode 100644 index 00000000000..bc4ddbebfef --- /dev/null +++ b/website/content/pro/data-connectors/single-widget/examples.md @@ -0,0 +1,23 @@ +--- +title: Endpoint Examples +sidebar_position: 1 +description: Public API endpoints that can be used as single widget for Terminal Pro +keywords: +- Single Widget +- Data Connectors +- API Endpoints +- JSON +- Bring your own data +--- + +import HeadTitle from '@site/src/components/General/HeadTitle.tsx'; + + + +| Widget title | Public URL | Category | Subcategory | Source | Description | +| -------- | ------- | -------- | ------- | -------- | ------- | +| Protocols | https://api.llama.fi/v2/protocols | DeFi | TVL | DefiLLama | List of all protocols on DefiLlama along with their TVL | +| Historical Chain TVL | https://api.llama.fi/v2/historicalChainTvl | DeFi | TVL | DefiLLama | Get historical TVL (excludes liquid staking and double counted tvl) on DeFi on all chains | +| Chains | https://api.llama.fi/v2/chains | DeFi | TVL | DefiLLama | Get current TVL of all chains | +| Stablecoins | https://api.llama.fi/v2/stablecoins | DeFi | coins | DefiLLama | List all stablecoins along with their circulating amounts | +| TAO stats | https://taostats.io/data.json | Crypto | | Tao | Latest $TAO token and subnet information | diff --git a/website/content/pro/data-connectors/single-widget.md b/website/content/pro/data-connectors/single-widget/index.md similarity index 98% rename from website/content/pro/data-connectors/single-widget.md rename to website/content/pro/data-connectors/single-widget/index.md index 815c1029b81..75bf0e6fd84 100644 --- a/website/content/pro/data-connectors/single-widget.md +++ b/website/content/pro/data-connectors/single-widget/index.md @@ -1,6 +1,6 @@ --- title: Single widget -sidebar_position: 1 +sidebar_position: 0 description: Learn how to use the Single Widget of OpenBB Terminal Pro for seamless integration with your API Endpoints, enabling custom data to be fetched and displayed in an accessible format. Includes features like additional headers and addressing diff --git a/website/content/pro/getting-started/_category_.json b/website/content/pro/getting-started/_category_.json deleted file mode 100644 index 446d1af1efe..00000000000 --- a/website/content/pro/getting-started/_category_.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "label": "Getting started", - "position": 0 -} diff --git a/website/content/pro/getting-started/free-trial.md b/website/content/pro/getting-started/free-trial.md deleted file mode 100644 index e2d7a2bb845..00000000000 --- a/website/content/pro/getting-started/free-trial.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -title: Free trial -sidebar_position: 1 -description: The free trial of OpenBB Terminal Pro provides full access to its features - for 2 weeks with a potential 1-week extension. Steps to get early access and personalized - onboarding process are also explained. -keywords: -- Free Trial -- OpenBB Hub account -- early access code -- product development -- free trial extension -- Personalized Onboarding -- investment interests ---- - -import HeadTitle from '@site/src/components/General/HeadTitle.tsx'; - - - -There are 3 main ways to get started: - -1. Join the waitlist at - -2. Get invited by a colleague who already has access - -3. Become a design partner and contribute to our product development - -The free trial of **OpenBB Terminal Pro** grants you full access to all features and data for a period of 2 weeks. - -To continue using the product after the trial period you can reach out to to extend your trial and discuss pricing options. - -As an early adopter, your feedback is invaluable. The OpenBB team may reach out to understand your experience and gather insights for improvement. - -## Personalized Onboarding - -Upon your first login, we'll ask a few questions about your investment interests, background, and workflow. - -Your responses will help us tailor your experience, ensuring a smooth and effective start with the app. - -Note: You can update these responses anytime should your interests evolve. diff --git a/website/content/pro/index.md b/website/content/pro/index.md index ffb7947bd2f..67334e876ac 100644 --- a/website/content/pro/index.md +++ b/website/content/pro/index.md @@ -25,66 +25,27 @@ import HeadTitle from '@site/src/components/General/HeadTitle.tsx'; -Discover the superior investment research capabilities of the OpenBB Terminal Pro. Built on top of the open-source OpenBB Terminal, our platform provides a sleek graphical interface that is intuitive and fully customizable, making it easier for you to access and analyze financial information with ease. +Investment research tech is stuck in the 80s and limits what you can do. With the Terminal Pro, you can bring your own data and use AI to quickly extract insights from it. -Plus, with built-in access to high-quality financial data curated from official partnerships with data providers, you can conduct comprehensive analysis and gain valuable insights that inform your investment decisions. +Gain an edge in the market, start the 3-week free trial now. No credit cards required.
- - ---- - -- **Improved User Experience** - -We've focused on improving the user experience (UX) of the OpenBB Terminal Pro based on feedback from dozens of users. The platform features a better user interface that is visually appealing, while keeping the keyboard-centric workflow of the OpenBB Terminal for quick and efficient information access. - -- **Customizable and Collaborative** - -Unlike traditional investment research dashboards, the OpenBB Terminal Pro is a fully integrated and customizable environment that allows you to optimize your workflow to your preferences. Plus, take advantage of advanced collaboration features to share insights, exchange ideas, and make informed decisions with your team in real time. - -- **Built-in access to high-quality financial data** - -The OpenBB Terminal Pro is powered by an extensive data marketplace that allows you to make use of any dataset that exists. With an abundance of data at your fingertips, you can conduct a comprehensive analysis and gain valuable insights that inform your investment decisions. You can subscribe to only the datasets you need and access the raw data for deeper analysis, whether you're looking for financial, economic, or market data. - ---- - -## Features - -### Bring your own data - -The OpenBB Terminal Pro allows professionals to bring any data into their research environment. Whether that is a .csv file, a private endpoint, a RSS feed or even embed a SEC filing directly. The only limit is the user's creativity. - -### Your terminal, your whiteboard - -The OpenBB Terminal Pro is the most flexible investment research platform. It allows users to create their preferred dashboards with their preferred widgets. Never be limited again by what a platform allows you to create. - -### Generative AI to summarize content - -Our most popular feature includes chatting with financial data through state-of-the-art large language models (LLMs). For instance, instead of spending minutes reading news articles or hours reading earnings transcripts, create a summary in seconds and ask how that impacts your investments. - -### Build investment research reports in seconds - -The OpenBB Terminal Pro allows to add notes next to each widget and render the tab into a custom report that can be used to share with the team or manager., share with team - -### Create charts from raw data - -The OpenBB Terminal Pro allows to create charts directly from raw data in seconds. This effectively increases user efficiency by 10x, as visual insights are much more powerful. diff --git a/website/content/pro/templates/_category_.json b/website/content/pro/templates/_category_.json new file mode 100644 index 00000000000..a74b76d6603 --- /dev/null +++ b/website/content/pro/templates/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Templates", + "position": 3 +} diff --git a/website/content/pro/templates/excel.md b/website/content/pro/templates/excel.md new file mode 100644 index 00000000000..2a2ada7a97f --- /dev/null +++ b/website/content/pro/templates/excel.md @@ -0,0 +1,28 @@ +--- +title: Excel Templates +sidebar_position: 2 +description: Download Excel templates that OpenBB makes available + to your organization so you can fully automate your workflow. +keywords: +- Excel Add-In +- Automation +- Workflow +- Download +- Modeling +--- + +import HeadTitle from '@site/src/components/General/HeadTitle.tsx'; + + + +When navigating to the Templates page and clicking on the Excel tab, this is what the user will be able to see. As you can see from the image below, the user will be able to see a list of Excel templates that have been created by the OpenBB team and that leverage our Add-in for Excel to automate financial workflows. + +charting + +Once clicking on "Download Template" (e.g. for "Equity Analysis"), users will be able to access an Excel spreadsheet like the one shown below. + +If you have your OpenBB Add-in for Excel installed (instructions [here](/excel/getting-started/installation)) you will be able to change a ticker on the spreadsheet and all the values are automatically updated. + +charting + +More templates will be added in the next few weeks. diff --git a/website/content/pro/templates/index.md b/website/content/pro/templates/index.md new file mode 100644 index 00000000000..a959b3dfbc7 --- /dev/null +++ b/website/content/pro/templates/index.md @@ -0,0 +1,34 @@ +--- +title: Templates +sidebar_position: 0 +description: This page allows users to manage their Terminal Pro and Excel templates. +keywords: +- Templates +- Terminal Pro +- Excel Add-in +- Automated +- Download +--- + + +import HeadTitle from '@site/src/components/General/HeadTitle.tsx'; + + + +import NewReferenceCard from "@site/src/components/General/NewReferenceCard"; + +
    + + + + + +
diff --git a/website/content/pro/templates/pro.md b/website/content/pro/templates/pro.md new file mode 100644 index 00000000000..8dfc6a9222d --- /dev/null +++ b/website/content/pro/templates/pro.md @@ -0,0 +1,18 @@ +--- +title: Terminal Pro Templates +sidebar_position: 1 +description: Manage your organization's Terminal Pro templates + from this page. +keywords: +- Terminal Pro +- Templates +- Dashboard +- Widgets +- Sharing +--- + +import HeadTitle from '@site/src/components/General/HeadTitle.tsx'; + + + +Coming soon. diff --git a/website/content/pro/tutorials/_category_.json b/website/content/pro/tutorials/_category_.json index 14856fcd7ce..d7a53ea5983 100644 --- a/website/content/pro/tutorials/_category_.json +++ b/website/content/pro/tutorials/_category_.json @@ -1,4 +1,4 @@ { "label": "Tutorials", - "position": 10 + "position": 0 } diff --git a/website/content/pro/tutorials/index.md b/website/content/pro/tutorials/index.md index 1852df2270b..c19173707ae 100644 --- a/website/content/pro/tutorials/index.md +++ b/website/content/pro/tutorials/index.md @@ -1,6 +1,6 @@ --- title: Tutorials -sidebar_position: 0 +sidebar_position: -1 description: Learn about common workflows that you can do with the OpenBB Terminal Pro. keywords: - workflows diff --git a/website/content/pro/widgets/_category_.json b/website/content/pro/widgets/_category_.json index e76371f2e07..5bca832ff79 100644 --- a/website/content/pro/widgets/_category_.json +++ b/website/content/pro/widgets/_category_.json @@ -1,4 +1,4 @@ { "label": "Widgets", - "position": 4 + "position": 5 } diff --git a/website/generate_excel_markdown.py b/website/generate_excel_markdown.py index 555215edb70..a4405786216 100644 --- a/website/generate_excel_markdown.py +++ b/website/generate_excel_markdown.py @@ -33,14 +33,114 @@ class CommandLib: } API_PREFIX = "/api/v1" - EXAMPLES: Dict[str, Dict] = { + # These examples will be generated in the core, but we keep them here meanwhile + EXAMPLE_PARAMS: Dict[str, Dict] = { "/get": { - "Example 0": '=OBB.GET({"a","b","c";"d","e","f"})', - "Example 1": '=OBB.GET({"a","b","c";"d","e","f"},"d","c")', + "array": '{"a","b","c";"d","e","f"}', + "rows": '"d"', + "columns": '"c"', }, "/byod": { - "Example 0": '=OBB.BYOD("widget_name")', - "Example 1": '=OBB.BYOD("widget_name","backend_name")', + "widget": '"widget_name"', + "backend": '"backend_name"', + }, + "crypto": { + "symbol": '"BTCUSD"', + "start_date": '"2023-01-01"', + "end_date": '"2023-12-31"', + "query": '"coin"', + }, + "currency": { + "symbol": '"EURUSD"', + "start_date": '"2023-01-01"', + "end_date": '"2023-12-31"', + }, + "derivatives": { + "symbol": '"AAPL"', + "start_date": '"2023-01-01"', + "end_date": '"2023-12-31"', + }, + "/derivatives/futures/curve": { + "symbol": '"NG"', + }, + "economy": { + "countries": '"united_states"', + "start_date": '"2023-01-01"', + "end_date": '"2023-12-31"', + "units": '"growth_previous"', + "frequency": '"quarterly"', + "harmonized": "TRUE", + "query": '"gdp"', + "symbol": '"GFDGDPA188S"', + "limit": 5, + "period": '"quarter"', + "type": '"real"', + "adjusted": "TRUE", + }, + "/economy/fred_regional": { + "symbol": '"NYICLAIMS"', + }, + "equity": { + "symbol": '"AAPL"', + "tag": '"ebitda"', + "query": '"ebitda"', + "year": 2022, + "start_date": '"2023-01-01"', + "end_date": '"2023-12-31"', + "limit": 5, + "form_type": '"10-K"', + "period": '"annual"', + "frequency": '"quarterly"', + "type": "", + "sort": '"desc"', + "structure": '"flat"', + "date": '"2023-05-07"', + "page": 1, + "interval": '"1d"', + "is_symbol": "FALSE", + }, + "/equity/fundamental/reported_financials": { + "symbol": '"AAPL"', + "period": '"annual"', + "statement_type": '"balance"', + "limit": 5, + }, + "etf": { + "symbol": '"SPY"', + "start_date": '"2023-01-01"', + "end_date": '"2023-12-31"', + "query": '"global"', + }, + "fixedincome": { + "start_date": '"2023-01-01"', + "end_date": '"2023-12-31"', + "maturity": '"90d"', + "category": '"nonfinancial"', + "grade": '"aa"', + "date": '"2023-05-07"', + "yield_curve": '"spot"', + "index_type": '"yield"', + "inflation_adjusted": "TRUE", + "interest_rate_type": '"deposit"', + }, + "index": { + "symbol": '"^GSPC"', + "start_date": '"2023-01-01"', + "end_date": '"2023-12-31"', + "index": '"sp500"', + }, + "news": { + "symbol": '"AAPL"', + "symbols": '"AAPL,MSFT"', + "start_date": '"2023-01-01"', + "end_date": '"2023-12-31"', + "limit": 5, + }, + "regulators": { + "symbol": '"AAPL"', + "start_date": '"2023-01-01"', + "end_date": '"2023-12-31"', + "query": '"AAPL"', }, } @@ -162,41 +262,35 @@ class CommandLib: return {} def _get_examples( - self, cmd: str, sig_parameters: Dict, sep: str = "," - ) -> Dict[str, str]: + self, cmd: str, signature_: str, parameters: dict, sep: str = "," + ) -> dict: """Get the examples of the command.""" - if cmd in ("/get", "/byod"): - return self.EXAMPLES[cmd] + sig = signature_.split("(")[0] + "(" + category = signature_.split(".")[1].lower() - # API examples - examples = self._traverse( - ["paths", self.API_PREFIX + cmd, "get", "examples"], self.openapi - ) - sig = "=OBB." + self.xl_funcs[cmd].get("name", "") - ex_reference: Dict[str, str] = {} - for i, ex in enumerate(examples): - ex_code = "" - if ex.get("scope") == "api": - ex_code += sig + "(" - ex_parameters = ex.get("parameters", {}) - for p_name, p_info in sig_parameters.items(): - p_type = p_info.get("type", {}) - if p_value := ex_parameters.get(p_name): - if p_type == "Text": - ex_code += f'"{p_value}"{sep}' - elif p_type == "Boolean": - p_type = "TRUE" if bool(p_value) else "FALSE" - ex_code += f"{p_type}{sep}" - else: - ex_code += f"{p_value}{sep}" - else: - ex_code += sep - ex_code = ex_code.strip(sep) - ex_code += ")" - # Some example are repeated, we only want to add them once - if ex_code not in ex_reference.values(): - ex_reference[f"Example {i}"] = ex_code - return ex_reference + def get_p_value(cmd, p_name) -> str: + if cmd in self.EXAMPLE_PARAMS: + return self.EXAMPLE_PARAMS[cmd].get(p_name, "") + return self.EXAMPLE_PARAMS.get(category, {}).get(p_name, "") + + required_eg = sig + for p_name, p_info in parameters.items(): + if p_info["required"]: + p_value = get_p_value(cmd, p_name) + required_eg += f"{p_value}{sep}" + required_eg = required_eg.strip(f"{sep} ") + ")" + + standard_eg = sig + for p_name, p_info in parameters.items(): + if p_name == "provider": + break + p_value = get_p_value(cmd, p_name) + standard_eg += f"{p_value}{sep}" + standard_eg = standard_eg.strip(f"{sep} ") + ")" + + if cmd in ("/get", "/byod"): + return {"Required": required_eg, "Standard": standard_eg} + return {"Required": required_eg} def get_info(self, cmd: str) -> Dict[str, Any]: """Get the info for a command.""" @@ -209,7 +303,7 @@ class CommandLib: signature_ = self._get_signature(cmd, parameters) data = self._get_data(cmd) return_ = self.xl_funcs[cmd].get("result", {}).get("dimensionality", "") - examples = self._get_examples(cmd, parameters) + examples = self._get_examples(cmd, signature_, parameters) return { "name": name, "description": description, @@ -329,7 +423,7 @@ class Editor: def get_examples() -> str: if cmd_examples := cmd_info["examples"]: - examples = "## Examples\n\n" + examples = "### Example\n\n" for _, v in cmd_examples.items(): # examples += f"### {k}\n\n" examples += f"```{self.interface}\n" diff --git a/website/generate_platform_v4_markdown.py b/website/generate_platform_v4_markdown.py index 1a45e7c289e..083d14e0a3e 100644 --- a/website/generate_platform_v4_markdown.py +++ b/website/generate_platform_v4_markdown.py @@ -1,17 +1,15 @@ """Platform V4 Markdown Generator Script.""" -import argparse import json import re import shutil import subprocess from pathlib import Path -from typing import Dict, List, Union +from typing import Dict, List -import toml -from openbb_core.app.static.utils.console import Console from openbb_core.provider import standard_models -from packaging import specifiers +from poetry.core.constraints.version import Version, VersionConstraint, parse_constraint +from poetry.core.pyproject.toml import PyProjectTOML # Number of spaces to substitute tabs for indentation TAB_WIDTH = 4 @@ -19,157 +17,38 @@ TAB_WIDTH = 4 # Maximum number of commands to display on the cards MAX_COMMANDS = 8 -# Path to the Platform directory and the reference.json file +# Input paths PLATFORM_PATH = Path(__file__).parent.parent / "openbb_platform" +PLATFORM_PYPROJECT_PATH = Path(PLATFORM_PATH / "pyproject.toml") REFERENCE_FILE_PATH = Path(PLATFORM_PATH / "openbb/assets/reference.json") -# Paths to use for generating and storing the markdown files +# Output paths WEBSITE_PATH = Path(__file__).parent.absolute() SEO_METADATA_PATH = Path(WEBSITE_PATH / "metadata/platform_v4_seo_metadata.json") PLATFORM_CONTENT_PATH = Path(WEBSITE_PATH / "content/platform") PLATFORM_REFERENCE_PATH = Path(WEBSITE_PATH / "content/platform/reference") PLATFORM_DATA_MODELS_PATH = Path(WEBSITE_PATH / "content/platform/data_models") -# Imports used in the generated markdown files +# Markdown imports and elements PLATFORM_REFERENCE_IMPORT = "import ReferenceCard from '@site/src/components/General/NewReferenceCard';" # fmt: skip PLATFORM_REFERENCE_UL_ELEMENT = '
    ' # noqa: E501 # pylint: disable=redefined-outer-name -def check_installed_packages( - console: Console, - debug: bool, -) -> None: - """Checks if the installed packages are the same as those on the platform pyproject.toml file. - Compares the versions of the installed packages with the versions specified in the pyproject.toml file. - The source of truth for the package versions is the pyproject.toml file, and the installed packages are - checked against the specified versions. If the installed packages do not satisfy the version requirements, - an error is raised. - Parameters - ---------- - console (Console): Console object to display messages and save logs - debug (bool): Flag to enable debug mode - """ +class Console: + """Console class to log messages to the console.""" - def convert_poetry_version_specifier( - poetry_version: Union[str, Dict[str, str]] - ) -> str: - """ - Convert a Poetry version specifier to a format compatible with the packaging library. - Handles both simple string specifiers and dictionary specifiers, extracting only the version value if it's a dict. + def __init__(self, verbose: bool = False): + self.verbose = verbose - Parameters - ---------- - poetry_version (Union[str, Dict[str, str]]): - Poetry version specifier + def log(self, message: str) -> None: + if self.verbose: + print(message) - Returns - ------- - str: - Version specifier compatible with the packaging library - """ - if isinstance(poetry_version, dict): - poetry_version = poetry_version.get("version", "") - if isinstance(poetry_version, str): - if poetry_version.startswith("^"): - base_version = poetry_version[1:] - # Use regex to split the version and convert to integers only if they are purely numeric - parts = re.split(r"\.|\-", base_version) - try: - major, minor = (int(x) for x in parts[:2]) - except ValueError: - # If conversion fails, return the original version specifier - return poetry_version - next_major_version = major + 1 - # Construct a version specifier that represents the range. - return f">={base_version},<{next_major_version}.0.0" - - if poetry_version.startswith("~"): - base_version = poetry_version[1:] - parts = re.split(r"\.|\-", base_version) - try: - major, minor = (int(x) for x in parts[:2]) - except ValueError: - # If conversion fails, return the original version specifier - return poetry_version - next_minor_version = minor + 1 - # Construct a version specifier that represents the range. - return f">={base_version},<{major}.{next_minor_version}.0" - - # No need to modify other specifiers, as they are compatible with packaging library - return poetry_version - - def check_dependency( - package_name: str, version_spec: str, installed_packages_dict: Dict[str, str] - ) -> None: - """ - Check if the installed package version satisfies the required version specifier. - Raises DependencyCheckError if the package is not installed or does not satisfy the version requirements. - - Parameters - ---------- - package_name (str): - Name of the package to check - version_spec (str): - Version specifier to check against - installed_packages_dict (Dict[str, str]): - Dictionary of installed packages and their versions - """ - installed_version = installed_packages_dict.get(package_name.lower()) - if not installed_version: - raise Exception(f"{package_name} is not installed.") - - converted_version_spec = convert_poetry_version_specifier(version_spec) - specifier_set = specifiers.SpecifierSet(converted_version_spec) - - if not specifier_set.contains(installed_version, prereleases=True): - message = f"{package_name} version {installed_version} does not satisfy the specified version {converted_version_spec}." # noqa: E501, pylint: disable=line-too-long - raise Exception(message) - - console.log("\n[CRITICAL] Ensuring all the extensions are installed before the script runs...") # fmt: skip - - # Execute the pip list command once and store the output - pip_list_output = subprocess.run( - "pip list | grep openbb", # noqa: S607 - shell=True, # noqa: S602 - capture_output=True, - text=True, - check=False, - ) - installed_packages = pip_list_output.stdout.splitlines() - installed_packages_dict = { - line.split()[0].lower(): line.split()[1] for line in installed_packages - } - - # Load the pyproject.toml file once - with open(PLATFORM_PATH / "pyproject.toml") as f: - toml_dict = toml.load(f) - - # Extract the openbb dependencies, excluding the python dependency - dependencies = toml_dict["tool"]["poetry"]["dependencies"] - dependencies.pop("python", None) - - # Compare versions and check dependencies - for package, version_spec in dependencies.items(): - normalized_package_name = package.replace("_", "-").lower() - try: - # Convert the version specifier before checking - converted_version_spec = convert_poetry_version_specifier(version_spec) - check_dependency( - normalized_package_name, converted_version_spec, installed_packages_dict - ) - - # Ensure debug_mode output shows the processed version specifier - if debug: - installed_version = installed_packages_dict.get(normalized_package_name) - console.log( - f"{normalized_package_name}: Specified version {converted_version_spec}, Installed version {installed_version}" # noqa: E501, pylint: disable=line-too-long - ) - except Exception as e: - raise e +console = Console(verbose=True) def create_reference_markdown_seo(path: str, description: str) -> str: @@ -177,15 +56,15 @@ def create_reference_markdown_seo(path: str, description: str) -> str: Parameters ---------- - path (str): - Command path relative to the obb class - description (str): - Description of the command + path: str + Command path relative to the obb class + description: str + Description of the command Returns ------- - str: - SEO section for the markdown file + str + SEO section for the markdown file """ with open(SEO_METADATA_PATH) as f: @@ -228,17 +107,17 @@ def create_reference_markdown_intro( Parameters ---------- - path (str): - Command path relative to the obb class - description (str): - Description of the command - deprecated (Dict[str, str]): - Deprecated flag and message + path: str + Command path relative to the obb class + description: str + Description of the command + deprecated: Dict[str, str] + Deprecated flag and message Returns ------- - str: - Introduction section for the markdown file + str + Introduction section for the markdown file """ deprecation_message = ( @@ -268,15 +147,15 @@ def create_reference_markdown_tabular_section( Parameters ---------- - parameters (Dict[str, List[Dict[str, str]]]): - Dictionary of providers and their corresponding parameters - heading (str): - Section heading for the tabular section + parameters: Dict[str, List[Dict[str, str]]] + Dictionary of providers and their corresponding parameters + heading: str + Section heading for the tabular section Returns ------- - str: - Tabular section for the markdown file + str + Tabular section for the markdown file """ standard_params_list = [] @@ -339,14 +218,15 @@ def create_reference_markdown_tabular_section( def create_reference_markdown_returns_section(returns: List[Dict[str, str]]) -> str: """Create the returns section for the markdown file. - Args - ---- - returns (List[Dict[str, str]]): - List of dictionaries containing the name, type and description of the returns + Parameters + ---------- + returns: List[Dict[str, str]] + List of dictionaries containing the name, type and description of the returns + Returns ------- - str: - Returns section for the markdown file + str + Returns section for the markdown file """ returns_str = "" @@ -371,17 +251,17 @@ def create_data_model_markdown(title: str, description: str, model: str) -> str: Parameters ---------- - title (str): - Title of the data model - description (str): - Description of the data model - model (str): - Model name + title: str + Title of the data model + description: str + Description of the data model + model: str + Model name Returns ------- - str: - Basic markdown file content for the data model + str + Basic markdown file content for the data model """ # File name is used in the import statement @@ -431,13 +311,13 @@ def find_data_model_implementation_file(data_model: str) -> str: Parameters ---------- - data_model (str): - Data model name + data_model: str + Data model name Returns ------- - str: - File name containing the data model class + str + File name containing the data model class """ # Function to search for the data model class in the file @@ -465,8 +345,8 @@ def generate_reference_index_files(reference_content: Dict[str, str]) -> None: Parameters ---------- - reference_content (Dict[str, str]): - Endpoints and their corresponding descriptions. + reference_content: Dict[str, str] + Endpoints and their corresponding descriptions. """ def generate_index_and_category( @@ -599,17 +479,17 @@ def create_data_models_index(title: str, description: str, model: str) -> str: Parameters ---------- - title (str): - Title of the data model - description (str): - Description of the data model - model (str): - Model name + title: str + Title of the data model + description: str + Description of the data model + model: str + Model name Returns ------- - str: - Index content for the data models + str + Index content for the data models """ # Get the first sentence of the description @@ -632,8 +512,8 @@ def generate_data_models_index_files(content: str) -> None: Parameters ---------- - content (str): - Content for the data models index file + content: str + Content for the data models index file """ index_content = ( @@ -661,17 +541,17 @@ def generate_markdown_file(path: str, markdown_content: str, directory: str) -> Parameters ---------- - path (str): - Path to the markdown file - markdown_content (str): - Content for the markdown file - directory (str): - Directory to save the markdown file + path: str + Path to the markdown file + markdown_content: str + Content for the markdown file + directory: str + Directory to save the markdown file Raises ------ - ValueError: - If the content type is invalid + ValueError: + If the content type is invalid """ # For reference, split the path to separate the @@ -697,24 +577,12 @@ def generate_markdown_file(path: str, markdown_content: str, directory: str) -> # pylint: disable=redefined-outer-name -def generate_platform_markdown( - console: Console, -) -> None: +def generate_platform_markdown(paths: Dict) -> None: """Generate markdown files for OpenBB Docusaurus website.""" data_models_index_content = [] reference_index_content_dict = {} - console.log(f"\n[INFO] Reading the {REFERENCE_FILE_PATH} file...") - # Load the reference.json file - try: - with open(REFERENCE_FILE_PATH) as f: - reference = json.load(f) - except FileNotFoundError as exc: - raise FileNotFoundError( - "File not found! Please ensure the file exists." - ) from exc - # Clear the platform/reference folder console.log(f"\n[INFO] Clearing the {PLATFORM_REFERENCE_PATH} folder...") shutil.rmtree(PLATFORM_REFERENCE_PATH, ignore_errors=True) @@ -728,7 +596,7 @@ def generate_platform_markdown( ) # noqa: E501 console.log(f"\n[INFO] Generating the markdown files for the {PLATFORM_DATA_MODELS_PATH} directory...") # fmt: skip - for path, path_data in reference.items(): + for path, path_data in paths.items(): reference_markdown_content = "" data_markdown_content = "" @@ -808,28 +676,101 @@ def generate_platform_markdown( console.log("\n[INFO] Markdown files generated successfully!") +def read_reference() -> dict: + """Read the reference.json file.""" + console.log(f"\n[INFO] Reading the {REFERENCE_FILE_PATH} file...") + # Load the reference.json file + try: + with open(REFERENCE_FILE_PATH) as f: + reference = json.load(f) + except FileNotFoundError as exc: + raise FileNotFoundError( + "File not found! Please ensure the file exists." + ) from exc + + return reference + + +def get_openbb_versions() -> Dict[str, VersionConstraint]: + """Get the openbb package version constraints from pyproject.toml.""" + pyproject = PyProjectTOML(PLATFORM_PYPROJECT_PATH) + deps = pyproject.data["tool"]["poetry"]["dependencies"] + dep_spec = {} + for p, v in deps.items(): + if p.startswith("openbb"): + if isinstance(v, str): + dep_spec[p] = parse_constraint(v) + elif isinstance(v, dict): + dep_spec[p] = parse_constraint(v["version"]) + return dep_spec + + +def check_installed(openbb_versions: Dict[str, VersionConstraint]) -> None: + """Check all the openbb packages are installed and have the correct version.""" + console.log("\n[INFO] Ensuring all packages installed...") + pip_list_output = subprocess.run( + "pip list | grep openbb", # noqa: S607 + shell=True, # noqa: S602 + capture_output=True, + text=True, + check=False, + ) + result = pip_list_output.stdout.splitlines() + installed = { + line.split()[0].lower(): Version.parse(line.split()[1]) for line in result + } + + failures = set() + for o, v in openbb_versions.items(): + if o not in installed: + console.log(f"[INFO] Package '{o}' not installed.") + failures.add(o) + elif not v.allows(installed[o]): + console.log( + f"[INFO] Version '{installed[o]}' of '{o}' not compatible. Expected '{v}'." + ) + failures.add(o) + + if failures: + raise ValueError(f"Failures: {failures}") + + +def check_built(openbb_versions: Dict[str, VersionConstraint], reference: dict) -> None: + """Check all the openbb packages installed are in the reference file.""" + console.log("\n[INFO] Ensuring all packages built...") + core_version = reference.get("info", {}).get("core", "") + extensions = reference.get("info", {}).get("extensions", {}) + built = {} + built["openbb-core"] = Version.parse(core_version) + for value in extensions.values(): + for v in value: + name, version = v.split("@") + if name.startswith("openbb_"): + name = name[7:] + name = "openbb-" + name.replace("_", "-") + built[name] = Version.parse(version) + + failures = set() + for o, v in openbb_versions.items(): + if o not in built: + console.log(f"[INFO] Package '{o}' not in reference file.") + failures.add(o) + elif not v.allows(built[o]): + console.log( + f"[INFO] Version '{built[o]}' of '{o}' not compatible. Expected '{v}'." + ) + failures.add(o) + + if failures: + raise ValueError(f"Failures: {failures}") + + if __name__ == "__main__": - parser = argparse.ArgumentParser( - prog="Platform Markdown Generator V2", - description="Generate markdown files for the Platform website docs.", - ) - parser.add_argument( - "-v", - "--verbose", - action="store_true", - help="Enable verbose output for debugging.", - ) + openbb_versions = get_openbb_versions() + check_installed(openbb_versions) - args = parser.parse_args() - console = Console(True) - verbose = False + reference = read_reference() + check_built(openbb_versions, reference) - if args.verbose: - verbose = True - - check_installed_packages( - console=console, - debug=verbose, - ) - generate_platform_markdown(console=console) + generate_platform_markdown(reference.get("paths", {}))