You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs(changelog): backfill missing entries since 5.36.0
Three user-facing fixes shipped since v5.36.0 lacked changelog entries:
document search snippet offsets (#860/#862), XBRL-absent warnings
downgraded to debug (#857), and reverse_name suffix handling.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: CHANGELOG.md
+3Lines changed: 3 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -14,16 +14,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
14
14
### Fixed
15
15
16
16
-**Form 4/5 transaction footnotes are now attributed per transaction** — footnote references attach to many transaction sub-elements (security title, transaction date, shares, price, post-transaction amounts), but the extractor previously collected them only from `<transactionCoding>`, so `TransactionActivity.footnote_ids` / `.footnotes_text` came through empty for most filings. The extractor now gathers footnote IDs from the whole transaction (deduplicated), so per-transaction footnote reasoning — including `is_10b5_1_plan` — works directly rather than relying on the filing-wide fallback.
17
+
-**Document search snippets highlight the correct characters** — `SearchResult.snippet` highlights `context[start_offset:end_offset]`, but text, whole-word, and regex search stored absolute text offsets against a context string that was truncated (with `…` markers) around the match, so any match after the leading context window highlighted the wrong characters. Offsets are now computed relative to the returned context. ([#860](https://github.com/dgunning/edgartools/pull/860), [#862](https://github.com/dgunning/edgartools/pull/862))
17
18
-**Table search snippets highlight the match, not the whole table** — the semantic `table:<term>` search built a result whose end offset was the full table length against a context truncated to ~200 chars, so `SearchResult.snippet` wrapped the entire truncated context in `**…**` for any table longer than 200 characters. The match is now located within the table and a correct context window is produced, consistent with text and regex search.
18
19
-**Rule 10b5-1 plan detection now uses the official Form 4/5 checkbox when present** — ownership summaries honor the structured `aff10b5One` value before falling back to footnote text. When the checkbox is absent (e.g. pre-2023 filings), `has_10b5_1_plan` now scans the filing's full footnote set instead of relying solely on per-transaction footnote attribution, which is frequently empty. The fallback matcher no longer confuses the separate anti-fraud Rule 10b-5 with Rule 10b5-1 trading plans while recognizing common spacing and dash variants. ([#863](https://github.com/dgunning/edgartools/issues/863))
19
20
-**`edgar` package logger no longer leaks log output in unconfigured applications** — the package-root logger had no `NullHandler`, so when an application had not configured logging itself, edgartools warnings fell back to Python's `logging.lastResort` handler and were written to stderr. This was especially harmful in MCP / stdio environments, where stray stderr output corrupts the protocol stream. A `NullHandler` is now attached to the `edgar` logger per the Python logging HOWTO for libraries, keeping edgartools silent until the application opts into logging. ([#856](https://github.com/dgunning/edgartools/issues/856))
21
+
-**XBRL-absent log messages downgraded from warning to debug** — amended filings (`/A`) and filings with no XBRL attachments are normal, expected cases; the "no XBRL data" messages they produced are now logged at `DEBUG` rather than `WARNING`, so they no longer alarm users during routine processing. ([#857](https://github.com/dgunning/edgartools/issues/857))
20
22
-**BDC data sets download again after SEC URL move** — the SEC relocated the DERA BDC data-set files from `/files/structureddata/data/` to `/files/datastandardsinnovation/data/`, which made `fetch_bdc_dataset()` and related functions fail with 404; the base URL now points to the new location.
21
23
-**`FormC.filer_information.ccc` no longer duplicates the CIK** — the Form C parser read the `filerCik` element into both `cik` and `ccc`; `ccc` now reads the actual `filerCcc` element (always redacted to `XXXXXXXX` in disseminated filings) and is `Optional`, returning `None` when absent.
22
24
-**`FormC.filer_information.live_or_test` is no longer always `False`** — the parser looked for a `testOrLive` element under `filer`, but the schema places `liveTestFlag` under `filerInfo`; LIVE filings now correctly report `True` (older `testOrLive` documents remain supported).
23
25
-**TTM Q4 derivation no longer produces wrong/negative values for discrete-quarter reporters** — when a concept is reported as discrete quarters with no cumulative 9-month YTD fact (common for BDCs and investment companies), `TTMCalculator` derives Q4 as `FY - (Q1+Q2+Q3)`. It previously selected the three input quarters by their `fiscal_period` label, but the SEC tags comparative facts in re-filings with the *filing's* fiscal period, so the same calendar quarter could appear labeled Q1, Q2 and Q3 across successive 10-Qs — producing a wrong, often negative Q4 (e.g. GAIN `InvestmentCompanyDividendDistribution`: `57.2M - 3×28.8M = -29.2M`). Quarters are now selected by distinct calendar period (dedup by `period_end`, latest periodic filing wins), and derivation is skipped when a discrete Q4 is already reported. This affects `quarterize()`, TTM calculations, and quarterly statement views. ([#848](https://github.com/dgunning/edgartools/issues/848))
24
26
-**`format_currency_short` rolls up to the next unit at magnitude boundaries** — a value just under 1B (>= ~999.95M) rounded to `1,000.0` within the millions bucket and rendered as the nonsensical `$1,000.0M` instead of `$1.0B`; it now promotes to the billions unit when the millions mantissa rounds up to 1,000.
25
27
-**`datefmt` no longer crashes on `None` or non-date values** — the display-only date helper called `value.strftime` on its non-string branch unconditionally, so a `None` (e.g. a former name's open-ended `to` date, or a missing `date_of_change`) raised `AttributeError` and took down the whole header/former-name table render. It now returns `""` for `None`, formats `date`/`datetime` objects, and degrades to `str(value)` for anything unexpected. (Complements the unrecognized-string pass-through fix in #859.)
26
28
-**`datefmt` no longer crashes on unrecognized date strings** — the helper parsed only `YYYYMMDD`, `YYYYMMDDHHMMSS` and `YYYY-MM-DD` strings and called `str.strftime` on everything else, raising `AttributeError: 'str' object has no attribute 'strftime'` for any other value (e.g. `2022/03/04`, a non-zero-padded date, or an empty string). Unrecognized strings are now returned unchanged so date display in filing-header and former-name tables degrades gracefully instead of crashing.
29
+
-**`reverse_name` handles a generational suffix between surname and given name** — SEC's `LAST SUFFIX FIRST` ordering can place a suffix (`III`, `Jr`, …) immediately after the surname and before the given name (e.g. the PPG insider `ROBERTS III CHRIS`); `reverse_name()` treated it as part of the given name and produced `Iii Chris Roberts`. Leading suffix tokens are now pulled out of the given-name parts, so the name renders as `Chris Roberts III`.
0 commit comments