* stash some changes
* add more robust testing
* mypy
* point PR at V5
* introduce spec file
* codespell
* test fix
* fix workflow environment setup
* fix workflow environment setup
* fix workflow environment setup
* add pyyaml to dependencies
* split lint jobs
* fix workflow environment setup
* fix workflow environment setup
* workflow env setup
* workflow env setup
* clean up code comments
* add auth hook entrypoints
* codespell
* add codegen feature
* codespell
* move _unpack into dispatchers for consistency with codegen packages
* surface nested models in the response
* fix missing coverage in CI
* socrata updates
* test fix
* detect plotly output
* add --include and --exclude flags from generate-extension command
* refactor openbb-platform-api for V5 operations and spec file handling
* delete poetry.lock
* add test workflow
* add temp branch id for test workflow
* add httpx to dev dependencies
* add a conftest.py
* tweak conftest
* tweak conftest
* python 3.10 issues
* more python 3.10
* more python 3.10
* more python 3.10
* more python 3.10
* fix url template resolution
* multi-spec support
* fix a windows path issue
* merge branch develop
* table builder, integration tests, and more
* linting
* merge branch develop
* bit of cleanup
* some more updates, cleanup, and apps.json
* codespell
* black
* integration test params and linting
* mypy
* pylint
* black
* more pylint
* recapture teest cassettes
* black again
* more linting
* table presentation choices
* black
* fix merge conflict
* split up metadata module and reformat cache to use msgpack
* mypy
* regenerate lock file
* use json and include dependencies to make openbb-oecd a standalone install
* pylint
* more linting
* serve metadata as dependency instead of assign and initialize
* fix integration_tests_testers to not count dependency injections as paramters
* add assets to git ignore
* ruff
* v5 refactor and publish workflow
* test coverage and ty fixes
* codespell
* update lock file
* workflow setup
* ty check
* workflow setup
* Scope PR to OECD changes only
Restore non-OECD files in the diff against v5 to their v5 state. The
branch was originally created off feature/cli-2 and inherited 186 files
of unrelated changes (cli, agent_server, mcp_server, platform_api,
core/, .github/workflows/* not oecd). Those have nothing to do with the
openbb-oecd v5 refactor and were polluting the PR diff.
* scope cleanup: include leaked v5-resident files (general-linting workflow, platform_api test fixtures)
---------
Co-authored-by: deeleeramone <>
Co-authored-by: Copilot <copilot@github.com>
* add standardized financial statements to sec provider
* codespell
* add type annotation to json_schema_extra dict
* test params
* mypy
* pylint
* if no actual quarterly data is reported by 20/40-F, raise an error when requesting it
* Fix D&A parent double count rollups
* some updates
* codespell
* breakout statement_schema into smaller files
* balance sheet ordering
* reorganize the results metadata output to OBBject
* unused import
* restore sec_filing.py file - not in scope
* organize imports
* AdjustmentsNoncashItemsToReconcileNetIncomeLossToCashProvidedByUsedInOperatingActivitiesOther
* fix docstring
* linter
---------
Co-authored-by: Theodore Aptekarev <aptekarev@gmail.com>
* fix(core): invoke linters via `python -m` so PATH state can't silently skip them
`Linters.run()` used `shutil.which(linter)` which resolves the binary against
the process `PATH`. When users run `.venv/bin/python` directly — as
`dev_install.py` itself does, and as common IDE configurations do — the venv's
`bin/` directory is not on `PATH`, so `which("ruff")` returned `None` and the
linter step silently no-op'd.
That mattered because `ImportDefinition.build` emits speculative type imports
(e.g. `OBBject_EquityInfo`) by design and relies on `ruff --fix` to strip the
unused ones. Without the cleanup, those imports remained in generated files
and produced `ImportError` on first import — the symptom many users have hit.
This change resolves the linter through `sys.executable -m <linter>` so it
always resolves against the running Python's environment, independent of
`PATH`. A pre-check via `importlib.util.find_spec` preserves the
"linter not found" path for environments where the package genuinely isn't
installed. A second guard skips invocation when the target directory has no
`*.py` files, which prevents the linter from falling back to its default
working-directory scan.
Adds two regression tests:
- `test_ruff_strips_unused_imports_via_module_invocation` simulates the
failing scenario by clearing `PATH` and asserts ruff still removes an
unused import.
- `test_run_logs_not_found_when_module_missing` exercises the missing-module
branch with a known-bogus linter name.
* style(linters): collapse subprocess.run call to satisfy black
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* fix(linters): keep command list[str] to satisfy mypy
Glob produces Path objects; concatenating with the str command list
tripped mypy's "list[str] + list[Path]" check. Stringify the file
paths up-front so the assembled command is uniformly list[str].
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
* increase test coverage to exercise 100% of the testable code path in openbb-core
* model_fields syntax cleanup
* set the environment variable for CI runs
* run codeql on v5 branch
* more CI env setup
* cleanup redundant files
* ruff
* dedupe workflow trigger
* some windows coverage missing
* ubuntu integration test job
* more windows coverage
* test_reference_generator
* test_docstring_generator
* remove line no references from test function docstrings
* clean useless comments from test files
* fix polars type check
* fix test_obbject
* fix test_obbject
* initial refactor
* ruff does not dictate style
* unresolved imports in test action
* fix general linting
* resolve pandas imports for actions run
* httpx in test workflow
* pytest-asyncio in test workflow
* pandas.Index(...)
* max version for windows CI is 3.14
* remove temp refactor files that shouldn't have been committed:
* use ruff format instead of black
* formatting and typing
* tab space helper
* test fixtures..
* ty check
* update openssl in cargo.toml, and remove dll and dylibs from repo
* cargo fmt
* cargo clippy
* cargo fmt again
* unused-mut
* adjust build.rs for test container
* windows runner setup
* fix masos linking
* same treatment for sbom files
* improve cftc endpoints and make a standalone workspace app
* mypy
* forgot couple of files to commit
* test params
* integration test param name
* fix sec-sic-search
* fill some contracts missing category and subcategory, add a workspace workchoices endpoint
* linter
* integration test for cot_choices
* fix(finra): use persistent session to prevent TooManyRedirects
Resolves#6972.
The FINRA OTC data fetching functions (get_finra_weeks, get_finra_data,
get_full_data) previously created new HTTP sessions for each request.
When making dozens of sequential API calls to aggregate weekly data,
this caused Cloudflare's bot protection on api.finra.org to trigger
redirect loops, resulting in a TooManyRedirects error.
Changes:
- Refactored get_finra_weeks and get_finra_data to accept an optional
session parameter via kwargs.
- Updated get_full_data to create a single requests.Session and perform
a pre-flight GET to finra.org to establish Cloudflare cookies before
making API calls.
- The session is reused across all requests within a single data fetch
operation, preventing the redirect loop.
- Removed hardcoded User-Agent from get_finra_data in favor of the
platform's standard user agent set by get_requests_session.
- Increased timeout for weeklyDownloadDetails from 3s to 20s for
consistency and reliability.
* Apply Black Formatting
* perf(finra): use async requests for concurrent weekly data fetching
Addresses reviewer feedback on PR #7443.
The get_full_data function previously made up to 52 sequential POST
requests to fetch weekly OTC data, resulting in poor performance.
This commit adds async equivalents (aget_finra_weeks, aget_finra_data,
aget_full_data) that use the platform's amake_request utility and
asyncio.gather to fetch all weeks concurrently through a shared
aiohttp session.
The FinraOTCAggregateFetcher now uses aextract_data, which is natively
supported by the platform's Fetcher base class.
The pre-flight GET to finra.org for Cloudflare cookie establishment
is preserved in the async path.
* fix(finra): return all rows from data fetching instead of just the first one
* run black, add symbol field to data model, and recapture test cassette
* mypy
---------
Co-authored-by: Danglewood <85772166+deeleeramone@users.noreply.github.com>
* add amendments and committees endpoints to congress_gov and migrate all items into the parent congress_gov folder
* codespell
* fix tests
* no-redef
* linting