Skip to content

Commit

Permalink
Fix XBRL rich display
Browse files Browse the repository at this point in the history
  • Loading branch information
dgunning committed Nov 14, 2024
1 parent 0236a6b commit 16588a0
Show file tree
Hide file tree
Showing 8 changed files with 269 additions and 235 deletions.
2 changes: 1 addition & 1 deletion edgar/company_reports.py
Original file line number Diff line number Diff line change
Expand Up @@ -301,7 +301,7 @@ def __rich__(self):
(f"{self.form}", "bold"),
)
periods = Text.assemble(
(f"Period ending ", "grey70"),
("Period ending ", "grey70"),
(f"{datefmt(self.period_of_report, '%B %d, %Y')}", "bold"),
(" filed on ", "grey70"),
(f"{datefmt(self.filing_date, '%B %d, %Y')}", "bold"),
Expand Down
217 changes: 16 additions & 201 deletions edgar/financials.py

Large diffs are not rendered by default.

26 changes: 10 additions & 16 deletions edgar/xbrl/instance.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,13 @@
from dateutil.relativedelta import relativedelta
from pydantic import BaseModel, Field
from rich import box
from rich.table import Table, Column
from rich.table import Table
from rich.text import Text

from edgar.core import datefmt
from edgar.richtools import repr_rich
from edgar.xmltools import child_text
from edgar.xbrl.dimensions import Dimensions

from edgar.xmltools import child_text


@lru_cache(maxsize=128)
Expand Down Expand Up @@ -348,19 +349,12 @@ def __eq__(self, other):
return self.instance_hash == other.instance_hash

def __rich__(self):
document_period = self.get_document_period()

table = Table(Column("Company"),
Column("Number of Facts"),
title="XBRL Instance Document", box=box.ROUNDED)
if document_period:
table.add_column("Document Period")
table.add_row(self.get_entity_name(),
f"{len(self.facts):,}",
self.get_document_period())
else:
table.add_row(self.get_entity_name(),
f"{len(self.facts):,}")
fields = [('Company', Text(self.get_entity_name(), style="bold deep_sky_blue3")),('Form', self.get_document_type())]
if self.get_document_period():
fields.append(('Period', datefmt(self.get_document_period(), '%B %d, %Y')))
fields.append(('Facts', f"{len(self.facts):,}"))
table = Table(*[field[0] for field in fields], title="XBRL Instance", box=box.SIMPLE_HEAD)
table.add_row(*[field[1] for field in fields])

return table

Expand Down
4 changes: 2 additions & 2 deletions edgar/xbrl/presentation.py
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,7 @@ def _build_rich_tree(self, element: PresentationElement, tree: Tree, detailed: b
for child in sorted(element.children, key=lambda x: x.order):
if detailed:
# Detailed view: show full label, concept, and preferred label
node_text = f"[yellow]{child.label}[/yellow] ([cyan]{child.href.split('#')[-1]}[/cyan])"
node_text = f"[green]{child.label}[/green] ([cyan]{child.href.split('#')[-1]}[/cyan])"
if child.preferred_label:
node_text += f" [magenta]PL: {child.preferred_label.split('/')[-1]}[/magenta]"
else:
Expand All @@ -322,7 +322,7 @@ def _build_rich_tree(self, element: PresentationElement, tree: Tree, detailed: b
namespace, name = concept.split('_', 1)
# Just use the first part of the name .. some have a suffix like _xxx, etc.
name = name.split('_')[0]
node_text = Text.assemble((namespace, "bold yellow"), " ", (name, "bold deep_sky_blue1"))
node_text = Text.assemble((namespace, "bold grey70"), " ", (name, "bold deep_sky_blue1"))

child_tree = tree.add(node_text)
self._build_rich_tree(child, child_tree, detailed)
Expand Down
178 changes: 178 additions & 0 deletions edgar/xbrl/statements.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
from pydantic import BaseModel
from typing import List


class StandardConcept(BaseModel):
concept: str
label: str


class StandardStatement(BaseModel):
statement_name: str
primary_concept: str
display_name: str
concepts: List[StandardConcept]


BalanceSheet = StandardStatement(statement_name="BALANCE_SHEET",
primary_concept="us-gaap_StatementOfFinancialPositionAbstract",
display_name="Consolidated Balance Sheets",
concepts=[
StandardConcept(concept="us-gaap_AssetsAbstract", label="Assets"),
StandardConcept(concept="us-gaap_AssetsCurrentAbstract", label="Current Assets:"),
StandardConcept(concept="us-gaap_CashAndCashEquivalentsAtCarryingValue",
label="Cash & Equivalents"),
StandardConcept(concept="us-gaap_AccountsReceivableNetCurrent",
label="Accounts Receivable"),
StandardConcept(concept="us-gaap_InventoryNet", label="Inventory"),
StandardConcept(concept="us-gaap_AssetsCurrent", label="Total Current Assets"),
StandardConcept(concept="us-gaap_PropertyPlantAndEquipmentNet",
label="Property, Plant and Equipment"),
StandardConcept(concept="us-gaap_Goodwill", label="Goodwill"),
StandardConcept(concept="us-gaap_OtherAssetsNoncurrent", label="Other Assets"),
StandardConcept(concept="us-gaap_Assets", label="Total Assets"),
StandardConcept(concept="us-gaap_LiabilitiesAndStockholdersEquityAbstract",
label="Liabilities & Equity"),
StandardConcept(concept="us-gaap_LiabilitiesCurrentAbstract",
label="Current Liabilities:"),
StandardConcept(concept="us-gaap_AccountsPayableCurrent",
label="Accounts Payable"),
StandardConcept(concept="us-gaap_LiabilitiesCurrent",
label="Total Current Liabilities"),
StandardConcept(concept="us-gaap_OtherLiabilitiesNoncurrent",
label="Long-term Liabilities"),
StandardConcept(concept="us-gaap_Liabilities", label="Total Liabilities"),
StandardConcept(concept="us-gaap_CommitmentsAndContingencies",
label="Commitments & Contingencies"),
StandardConcept(concept="us-gaap_StockholdersEquityAbstract",
label="Stockholders' Equity:"),
StandardConcept(concept="us-gaap_CommonStockValue", label="Common Stock"),
StandardConcept(concept="us-gaap_RetainedEarningsAccumulatedDeficit",
label="Retained Earnings"),
StandardConcept(concept="us-gaap_AccumulatedOtherComprehensiveIncomeLossNetOfTax",
label="Other Comprehensive Income"),
StandardConcept(concept="us-gaap_StockholdersEquity",
label="Total Stockholders' Equity"),
StandardConcept(concept="us-gaap_LiabilitiesAndStockholdersEquity",
label="Total Liabilities & Equity"),
]
)
IncomeStatement = StandardStatement(statement_name="INCOME_STATEMENT",
primary_concept="us-gaap_IncomeStatementAbstract",
display_name="Income Statements",
concepts=[
StandardConcept(concept="us-gaap_IncomeStatementAbstract",
label="Income Statement"),
StandardConcept(
concept="us-gaap_RevenueFromContractWithCustomerExcludingAssessedTax",
label="Revenue"),
StandardConcept(concept="us-gaap_CostOfGoodsAndServicesSold",
label="Cost of Sales"),
StandardConcept(concept="us-gaap_OperatingExpensesAbstract",
label="Operating Expenses"),
StandardConcept(concept="us-gaap_ResearchAndDevelopmentExpense",
label="Research & Development"),
StandardConcept(concept="us-gaap_SellingGeneralAndAdministrativeExpense",
label="Selling, General & Admin"),
StandardConcept(concept="us-gaap_OperatingExpenses",
label="Total Operating Expenses"),

StandardConcept(concept="us-gaap_OperatingIncomeLoss",
label="Operating Income"),
StandardConcept(
concept="us-gaap_IncomeLossFromContinuingOperationsBeforeIncomeTaxesExtraordinaryItemsNoncontrollingInterest",
label="Pre-tax Income"),
StandardConcept(concept="us-gaap_IncomeTaxExpenseBenefit",
label="Income Tax"),
StandardConcept(concept="us-gaap_NetIncomeLoss",
label="Net Income"),
StandardConcept(concept="us-gaap_EarningsPerShareBasic",
label="EPS Basic"),
StandardConcept(concept="us-gaap_EarningsPerShareDiluted",
label="EPS Diluted"),
StandardConcept(
concept="us-gaap_WeightedAverageNumberOfSharesOutstandingBasic",
label="Shares Basic"),
StandardConcept(
concept="us-gaap_WeightedAverageNumberOfDilutedSharesOutstanding",
label="Shares Diluted"),
]
)
CashFlowStatement = StandardStatement(statement_name="CASH_FLOW",
primary_concept="us-gaap_StatementOfCashFlowsAbstract",
display_name="Consolidated Statement of Cash Flows",
concepts=[
StandardConcept(
concept="us-gaap_NetCashProvidedByUsedInOperatingActivitiesAbstract",
label="Operating Activities:"),
StandardConcept(
concept="us-gaap_AdjustmentsToReconcileNetIncomeLossToCashProvidedByUsedInOperatingActivitiesAbstract",
label="Adjustments to Net Income:"),
StandardConcept(concept="us-gaap_ShareBasedCompensation",
label="Stock-based Compensation"),
StandardConcept(concept="us-gaap_IncreaseDecreaseInOperatingCapitalAbstract",
label="Changes in Working Capital:"),
StandardConcept(concept="us-gaap_IncreaseDecreaseInInventories",
label="Inventories"),
StandardConcept(concept="us-gaap_NetCashProvidedByUsedInOperatingActivities",
label="Net Cash from Operations"),
StandardConcept(
concept="us-gaap_NetCashProvidedByUsedInInvestingActivitiesAbstract",
label="Investing Activities:"),
StandardConcept(concept="us-gaap_PaymentsToAcquirePropertyPlantAndEquipment",
label="Capital Expenditures"),
StandardConcept(concept="us-gaap_NetCashProvidedByUsedInInvestingActivities",
label="Net Cash from Investing"),
StandardConcept(
concept="us-gaap_NetCashProvidedByUsedInFinancingActivitiesAbstract",
label="Financing Activities:"),
StandardConcept(concept="us-gaap_PaymentsForRepurchaseOfCommonStock",
label="Stock Repurchases"),
StandardConcept(concept="us-gaap_NetCashProvidedByUsedInFinancingActivities",
label="Net Cash from Financing"),
StandardConcept(
concept="us-gaap_CashCashEquivalentsRestrictedCashAndRestrictedCashEquivalents",
label="Total Cash and Equivalents"),
StandardConcept(
concept="us-gaap_CashCashEquivalentsRestrictedCashAndRestrictedCashEquivalentsPeriodIncreaseDecreaseIncludingExchangeRateEffect",
label="Net Change in Cash"),
]
)
StatementOfChangesInEquity = StandardStatement(statement_name="EQUITY",
primary_concept="us-gaap_StatementOfStockholdersEquityAbstract",
display_name="Consolidated Statement of Shareholders Equity",
concepts=[
StandardConcept(concept="us-gaap_CommonStockMember",
label="Common Stock"),
StandardConcept(concept="us-gaap_AdditionalPaidInCapitalMember",
label="Additional Paid-in Capital"),
StandardConcept(
concept="us-gaap_AccumulatedOtherComprehensiveIncomeMember",
label="Accumulated Other Comprehensive Income (Loss)"),
StandardConcept(concept="us-gaap_RetainedEarningsMember",
label="Retained Earnings"),
StandardConcept(concept="us-gaap_StatementLineItems",
label="Statement [Line Items]"),
StandardConcept(
concept="us-gaap_IncreaseDecreaseInStockholdersEquityRollForward",
label="Increase (Decrease) in Stockholders' Equity [Roll Forward]"),
StandardConcept(
concept="us-gaap_AdjustmentsToAdditionalPaidInCapitalSharebasedCompensationRequisiteServicePeriodRecognitionValue",
label="Stock-based compensation"),
]
)
StatementOfComprehensiveIncome = StandardStatement(statement_name="COMPREHENSIVE_INCOME",
primary_concept="us-gaap_StatementOfIncomeAndComprehensiveIncomeAbstract"
, display_name="Comprehensive Income Statement",
concepts=[
StandardConcept(
concept="us-gaap_StatementOfIncomeAndComprehensiveIncomeAbstract",
label="Statement of Comprehensive Income"),
StandardConcept(concept="us-gaap_ComprehensiveIncomeNetOfTax",
label="Comprehensive income"),
]
)
cover_page = StandardStatement(statement_name="COVER_PAGE",
primary_concept="dei_CoverAbstract",
display_name="Cover Page",
concepts=[])
Loading

0 comments on commit 16588a0

Please sign in to comment.