Skip to content

v5.18.0

Choose a tag to compare

@dgunning dgunning released this 26 Feb 17:15
· 1054 commits to main since this release

[5.18.0] - 2026-02-26

Added

  • FortyF Data Object (40-F Canadian MJDS) — New data object for Form 40-F annual reports filed by ~200 Canadian cross-listed companies (Shopify, Royal Bank, Barrick Gold, etc.). Unlike 10-K filings, the 40-F wrapper is an iXBRL shell — the actual business content lives in the Annual Information Form (AIF) exhibit. FortyF identifies the AIF via a 5-tier priority chain and extracts NI 51-102 sections with regex-based detection and three-layer disambiguation (TOC entries, cross-references, page footers). Validated across 24 Canadian filers with 92% business extraction and 100% items detection.

    • Named section properties: .business, .risk_factors, .corporate_structure, .dividends, .capital_structure, .directors_and_officers, .legal_proceedings
    • Fuzzy section lookup: forty_f["business"] matches "Description Of The Business"
    • Raw document access: .aif_html, .aif_text for downstream rendering and LLM input
    • MD&A exhibit discovery: .mda_attachment, .mda_html, .mda_text for filers that include a separate MD&A (e.g. Manulife)
    • Rich display with NI 51-102 section tree and to_context() for LLM agents
    • Files: edgar/company_reports/forty_f.py
  • EntityFacts Discovery Methods — New search_concepts() and available_periods() methods on EntityFacts let users explore what concepts and periods a company actually has before querying, instead of guessing names and getting silent None returns (20ba29d)

  • Helpful Warnings on Silent None Returns — get_fact(), get_annual_fact(), and get_concept() now emit UserWarning with fuzzy "did you mean?" suggestions via difflib and tips pointing to search_concepts() / available_periods() when they return None (2837d4e)

  • XBRL Notes/Disclosures Access — Five new convenience methods on the XBRL object (.notes, .disclosures, .list_tables(), .get_table(), .get_disclosure()) so users can discover and access all XBRL tables directly without navigating through Statements first (7006bc9)

  • Filing.obj_type Property — Preview what .obj() will return (e.g. 'TenK', 'Form4') without parsing the filing. Returns None for unsupported form types (618519b)

  • get_operating_income() on Financials — XBRL concept-first lookup with label fallback, matching the get_revenue() pattern (#663)

  • cash_flow_statement() Alias — Added cash_flow_statement() as an alias for cashflow_statement() on all surfaces (Company, Financials, XBRL) for discoverability (b8558eb)

  • Period Format Normalization — Either "2023-FY" or "FY 2023" now works everywhere. EntityFacts and MultiPeriodStatement used different formats, causing silent failures when passing periods between APIs. Both formats are now accepted transparently at API boundaries (f33d02a)

Fixed

  • 8-K Parenthesized Negative Values — Fixed negative sign loss when 8-K earnings tables render values like $(0.09) as separate <td> cells for $, (, 0.09, ). The parentheses are now reassembled correctly (26902468)