/data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/eodhd.py:67: def get_company_profile(self, ticker: str, exchange_mic: Optional[str] = None) -> ProviderCompanyProfile: /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/eodhd.py:80: def get_prices(self, ticker: str, start: date, end: date) -> list[ProviderPriceBar]: /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/eodhd.py:93: "get_company_profile() must succeed before get_prices()." /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/eodhd.py:137: `Code` key — the exact opposite policy to get_prices(), which used to fail the whole batch /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/validation.py.before-sl004-20260910-181036:9:1. `get_prices()` does **no type validation**: a JSON body with `"close": "not-a-number"` is /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/validation.py.before-sl004-20260910-181036:12:2. `get_prices()` fails the **whole batch** on one malformed bar: the list comprehension raises /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/validation.py.before-sl004-20260910-180740:9:1. `get_prices()` does **no type validation**: a JSON body with `"close": "not-a-number"` is /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/validation.py.before-sl004-20260910-180740:12:2. `get_prices()` fails the **whole batch** on one malformed bar: the list comprehension raises /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/validation.py:9:1. `get_prices()` does **no type validation**: a JSON body with `"close": "not-a-number"` is /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/validation.py:12:2. `get_prices()` fails the **whole batch** on one malformed bar: the list comprehension raises /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/base.py:40: def get_company_profile(self, ticker: str, exchange_mic: Optional[str] = None) -> ProviderCompanyProfile: ... /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/base.py:52: def get_prices(self, ticker: str, start: date, end: date) -> list[ProviderPriceBar]: ... /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/demo.py:178: def get_company_profile(self, ticker: str, exchange_mic: Optional[str] = None) -> ProviderCompanyProfile: /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/demo.py:209: def get_prices(self, ticker: str, start: date, end: date) -> list[ProviderPriceBar]: /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/fmp.py:97: def get_company_profile(self, ticker: str, exchange_mic: Optional[str] = None) -> ProviderCompanyProfile: /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/fmp.py:144: def get_prices(self, ticker: str, start: date, end: date) -> list[ProviderPriceBar]: /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/fmp.py:145: """AUDIT FIX (Part D — docs/AUDIT_VALIDATION_D.md): see EODHDAdapter.get_prices() for the /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/adapters/fmp.py:152: "get_company_profile() must succeed before get_prices()." /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/workers/ingest.py.before-sl004-20260910-181036:185: profile = adapter.get_company_profile(ticker) /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/workers/ingest.py.before-sl004-20260910-181036:300:def _ingest_prices( /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/workers/ingest.py.before-sl004-20260910-181036:311: bars = adapter.get_prices(ticker, start, end) /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/workers/ingest.py.before-sl004-20260910-181036:525: prices_written = _ingest_prices(db, adapter, security.id, ticker, source) /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/workers/ingest.py:187: profile = adapter.get_company_profile(ticker) /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/workers/ingest.py:302:def _ingest_prices( /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/workers/ingest.py:313: bars = adapter.get_prices(ticker, start, end) /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/workers/ingest.py:565: prices_written = _ingest_prices(db, adapter, security.id, ticker, source) /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/workers/ingest.py.before-sl004-20260910-180740:185: profile = adapter.get_company_profile(ticker) /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/workers/ingest.py.before-sl004-20260910-180740:300:def _ingest_prices( /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/workers/ingest.py.before-sl004-20260910-180740:311: bars = adapter.get_prices(ticker, start, end) /data/files/bmw/stocklab-audit-remediation-SL006-SL007-SL008-SL009-20260910-224500-FIX2/app/app/workers/ingest.py.before-sl004-20260910-180740:525: prices_written = _ingest_prices(db, adapter, security.id, ticker, source)