EVEMISSTechnology

Repository guide · architecture · v1

Textualize / rich · Architecture

The analyzed tree holds 553 files; rich/ (101 files) is the library package, with tests (68), benchmarks (182) and docs as sibling subsystems. The reconstruction counts 63 entrypoints and 612 bounded execution paths; all ten listed paths start at examples/attrs.py:__main__ and end at local leaf classes or unresolved boundaries. rich/text.py, rich/style.py and rich/console.py carry the highest static call degrees.

Original repository
Textualize/rich
License
MIT · open-source license
Analyzed revision · last verified
9d8f9a372cc5916fd4781fec207ced7ddac2f08f ·

Textualize/rich Architecture: Shape and Control Flow

Terms used on this page
Entrypoint record
A file the analyzer marks as a place where execution can start. When it carries a __main__ guard excerpt, the file contains an if __name__ == "__main__": block and the excerpt shows what that block calls; without an excerpt, the file was flagged by its name only.
Bounded static execution path
A call chain reconstructed from the source code without running it, stopped after a fixed number of steps. It shows how far the code can be followed on paper, not what happens at run time.
Unresolved boundary
Where a static path stops because the next call goes into an external library or cannot be resolved without running the code. It marks the edge of this analysis, not a defect in the repository.
Static relations
Calls and imports found in the source. "External or unresolved" relations point outside the analyzed files.
Module role
The analyzer's label for a file, inferred from how many calls go in and out (for example core, entry/orchestration, leaf). It describes a position in the call graph, not the authors' design.
Test-like files
Files whose names or locations look like tests. This analysis counts them; it does not run them.
Observed · inferred · author-claimed · unresolved
How each statement is supported: read directly from the analyzed files; derived by the analyzer from them; stated by the repository's authors (metadata, README); or not established by this analysis.
Verified
Two uses on these pages. In an analyzer record ("verified provenance", "a verified entrypoint") it means the record was read directly from the analyzed files, which these guides call observed; for an entrypoint, the __main__ guard text is present. Since the analyzer fix of 2026-10-04, a file that only has an entrypoint-like name such as cli.py or main.py is recorded as inferred; guides analyzed before that still call such a file verified, and it is still only a guess about how the file is used. It does not mean the code was run or tested. "Last verified" is the date the guide last passed the lab's checks against the analysis record of the stated revision; it is not a review of the repository itself.

Shape at a glance

At the top level the tree holds 553 analyzed files, and the largest directories are benchmarks (182 files), rich (101), tests (68) and docs (69). The analyzer treats benchmarks, docs, rich and tests as candidate subsystems. Smaller top-level locations include examples with 37 files, a 39-file root, imgs with 22, .github with 11, questions with 11, tools with 8, assets with 3 and .faq with 2. The inventory counts 68 test-like files, so tests appears to hold the test suite. The shipping package appears to be the rich directory, matching the package name passed to setuptools.setup in setup.py. Repository metadata describes the project as a Python library for rich text and terminal formatting.

Entry points and control flow

The architecture reconstruction counts 63 entrypoints and 612 bounded execution paths. Listed entrypoint records include setup.py, whose __main__ guard calls setuptools.setup with the name 'rich'. Package modules also carry demo guards: the records for rich/abc.py, rich/align.py, rich/console.py and rich/table.py show __main__ guards marked '# pragma: no cover'. All ten listed bounded execution paths start at examples/attrs.py:__main__, and each consists of a single recorded step. Five of them end at a local leaf — Model, Triangle or Point3D in examples/attrs.py. The other five end at external or unresolved targets — print (twice), SystemExit, attr.Factory and Console — with terminal reason 'unresolved_boundary'. No listed path steps into the rich package, and none of the ten is truncated or marked as containing a cycle. The packet separately reports one bounded path with a detected static call cycle and marks that finding unresolved; it is not among the ten listed.

Core modules and roles

These role labels are the analyzer's inference from static resolved call degree and entrypoint membership, not from runtime behavior. rich/text.py carries the highest incoming degree among the listed roles: 707 incoming and 44 outgoing calls, labeled an entry/orchestration candidate. rich/style.py (474 incoming, 26 outgoing) is labeled a service/core candidate, and rich/console.py (416 incoming, 78 outgoing) an entry/orchestration candidate. rich/segment.py (337 incoming, 7 outgoing) and rich/pretty.py (149 incoming, 71 outgoing) are also labeled entry/orchestration candidates. rich/default_styles.py shows the largest outgoing degree among the listed rich modules: 154 outgoing calls against 1 incoming. Test modules appear as orchestration candidates; for example tests/test_text.py records 0 incoming and 329 outgoing calls.

Boundaries: where static paths stop

Of 11,248 recorded static relations, 6,703 remain external or unresolved and 4,545 resolve to local targets. A step marked external_or_unresolved records a call the analyzer could not tie to analyzed code. In the listed paths, the five unresolved-boundary paths stop at Console, print, SystemExit or attr.Factory reached from examples/attrs.py. Past those targets the paths record no further steps, so control flow beyond the boundary is not reconstructed.

Dependencies between parts

The parsed dependency records are four runtime-scoped entries from docs/requirements.txt: alabaster ==1.0.0, Sphinx ==8.2.3, sphinx-rtd-theme ==3.0.2 and sphinx-copybutton ==0.5.2. Their names suggest the docs subsystem carries Sphinx-based documentation tooling. Dependency coverage is partial: the analyzer parses only requirements-style manifests, and pyproject.toml dependency tables are not parsed. Across the analyzed set the resolver recorded 9,630 call relations and 1,618 import relations. Because 6,703 relations stay external or unresolved, the picture of which parts depend on which is incomplete.

What static analysis cannot show

The analysis is static only: reflection, runtime dependency injection, dynamic imports, monkey-patching, generated code, framework runtime wiring and dynamic dispatch are not resolved. Install, run and build inference is partial, and installation commands are not verified. README claim extraction is line-based and may capture code lines instead of prose, so README-derived statements are author_claimed at best. Bounded analysis caps relation extraction at 2,500 relations per file and 150,000 per repository, and files over 400 kB, minified bundles and vendored directories are inventoried but not parsed. The manifest's capability fields describe the analyzer itself, not this repository, and are excluded from repository evidence. The tree includes 68 test-like files, but the analysis does not execute them, so behavior encoded in tests is not established.

A reading order for the architecture

README.md, pyproject.toml, setup.py and LICENSE are classified as project-level important files. The suggested path is to start with manifests and important symbols, trace the bounded execution paths, and inspect unresolved boundaries before changing code; the analyzer flags README.md, pyproject.toml and setup.py as early reads. Within the package, the role table points to rich/text.py, rich/style.py and rich/console.py as the most connected modules to read first.

What this analysis could not establish

The writing model's own notes on the analysis record. Identifiers such as lim_3, exec_* or claim_… name records of that analysis; the claims table cites the same records.

  • Only 10 of the 612 bounded execution paths are listed, all from examples/attrs.py; control flow from the other entrypoints is not shown in the packet.
  • One reported static call cycle is marked unresolved and cannot be matched to any listed path.
  • 6,703 of 11,248 static relations remain external or unresolved, so cross-module dependency edges are incomplete.
  • Dependency records cover only docs/requirements.txt; pyproject.toml dependency tables were not parsed.
  • Runtime wiring, dynamic imports, reflection, dynamic dispatch and generated code are outside the static analysis (lim_1).
  • The analyzer did not establish a reliable modification starting point (claim_e8e705dd2dec).
Claims and evidence — 39 claims, 39 supported by an independent verifier

Every substantive statement above is a claim bound to grounding IDs of the analyzed revision. Global grounding IDs are namespaced by the analysis run.

Claim Epistemic status Verifier Grounding (global IDs)
c1 The analyzed inventory holds 553 files, including 68 test-like files; the largest top-level directories are benchmarks with 182 files, rich with 101, tests with 68 and docs with 69. inferred supported analysis_7a8a98c4ba2ee6a1:summary_repository
c2 The analyzer treats the top-level directories benchmarks, docs, rich and tests as candidate subsystems. inferred supported analysis_7a8a98c4ba2ee6a1:subsys_1, analysis_7a8a98c4ba2ee6a1:subsys_2, analysis_7a8a98c4ba2ee6a1:subsys_3, analysis_7a8a98c4ba2ee6a1:subsys_4
c3 Smaller top-level locations include examples with 37 files, a 39-file root, imgs with 22, .github with 11, questions with 11, tools with 8, assets with 3 and .faq with 2. inferred supported analysis_7a8a98c4ba2ee6a1:summary_repository
c4 The shipping package appears to be the rich directory, matching the package name 'rich' passed to setuptools.setup in the setup.py entrypoint guard. inferred supported analysis_7a8a98c4ba2ee6a1:summary_repository, analysis_7a8a98c4ba2ee6a1:py_entry_822c30480df2
c5 Repository metadata describes the project as a Python library for rich text and terminal formatting. author_claimed supported analysis_7a8a98c4ba2ee6a1:meta_description
c6 The architecture reconstruction counts 553 analyzed files, 63 entrypoints, 3,692 resolved static call relations and 612 bounded execution paths. inferred supported analysis_7a8a98c4ba2ee6a1:architecture_reconstruction, analysis_7a8a98c4ba2ee6a1:claim_20d39516a0c9
c7 The listed entrypoint records include setup.py, whose __main__ guard calls setuptools.setup with the name 'rich'. observed supported analysis_7a8a98c4ba2ee6a1:py_entry_822c30480df2
c8 The entrypoint records for rich/abc.py, rich/align.py, rich/console.py and rich/table.py show __main__ demo guards marked '# pragma: no cover'. observed supported analysis_7a8a98c4ba2ee6a1:py_entry_83173aec99cd, analysis_7a8a98c4ba2ee6a1:py_entry_7da402a50727, analysis_7a8a98c4ba2ee6a1:py_entry_f7ba4b240341, analysis_7a8a98c4ba2ee6a1:py_entry_2cf90bfd2d32
c9 All ten listed bounded execution paths start at examples/attrs.py:__main__, and each consists of a single recorded step. inferred supported analysis_7a8a98c4ba2ee6a1:exec_befd398f8d93, analysis_7a8a98c4ba2ee6a1:exec_72a232bac152, analysis_7a8a98c4ba2ee6a1:exec_becc91576f8c, analysis_7a8a98c4ba2ee6a1:exec_c46953a9686b, analysis_7a8a98c4ba2ee6a1:exec_04be04b62de5, analysis_7a8a98c4ba2ee6a1:exec_37bf047ba181, analysis_7a8a98c4ba2ee6a1:exec_d9f4bf1b6ffb, analysis_7a8a98c4ba2ee6a1:exec_90f8a7476fbd, analysis_7a8a98c4ba2ee6a1:exec_7a6b86762c85, analysis_7a8a98c4ba2ee6a1:exec_09a18199d9e4
c10 Five of the ten listed paths end at a local leaf — Model, Triangle or Point3D in examples/attrs.py — with terminal reason 'leaf'. inferred supported analysis_7a8a98c4ba2ee6a1:exec_04be04b62de5, analysis_7a8a98c4ba2ee6a1:exec_37bf047ba181, analysis_7a8a98c4ba2ee6a1:exec_d9f4bf1b6ffb, analysis_7a8a98c4ba2ee6a1:exec_90f8a7476fbd, analysis_7a8a98c4ba2ee6a1:exec_7a6b86762c85
c11 The other five listed paths end at external or unresolved targets — print (twice), SystemExit, attr.Factory and Console — with terminal reason 'unresolved_boundary'. inferred supported analysis_7a8a98c4ba2ee6a1:exec_befd398f8d93, analysis_7a8a98c4ba2ee6a1:exec_72a232bac152, analysis_7a8a98c4ba2ee6a1:exec_becc91576f8c, analysis_7a8a98c4ba2ee6a1:exec_c46953a9686b, analysis_7a8a98c4ba2ee6a1:exec_09a18199d9e4
c12 None of the ten listed paths is truncated or marked as containing a cycle. inferred supported analysis_7a8a98c4ba2ee6a1:exec_befd398f8d93, analysis_7a8a98c4ba2ee6a1:exec_72a232bac152, analysis_7a8a98c4ba2ee6a1:exec_becc91576f8c, analysis_7a8a98c4ba2ee6a1:exec_c46953a9686b, analysis_7a8a98c4ba2ee6a1:exec_04be04b62de5, analysis_7a8a98c4ba2ee6a1:exec_37bf047ba181, analysis_7a8a98c4ba2ee6a1:exec_d9f4bf1b6ffb, analysis_7a8a98c4ba2ee6a1:exec_90f8a7476fbd, analysis_7a8a98c4ba2ee6a1:exec_7a6b86762c85, analysis_7a8a98c4ba2ee6a1:exec_09a18199d9e4
c13 No listed path steps into the rich package: each recorded step stays inside examples/attrs.py or stops at an unresolved name. inferred supported analysis_7a8a98c4ba2ee6a1:exec_befd398f8d93, analysis_7a8a98c4ba2ee6a1:exec_72a232bac152, analysis_7a8a98c4ba2ee6a1:exec_becc91576f8c, analysis_7a8a98c4ba2ee6a1:exec_c46953a9686b, analysis_7a8a98c4ba2ee6a1:exec_04be04b62de5, analysis_7a8a98c4ba2ee6a1:exec_37bf047ba181, analysis_7a8a98c4ba2ee6a1:exec_d9f4bf1b6ffb, analysis_7a8a98c4ba2ee6a1:exec_90f8a7476fbd, analysis_7a8a98c4ba2ee6a1:exec_7a6b86762c85, analysis_7a8a98c4ba2ee6a1:exec_09a18199d9e4
c14 The packet reports one execution path with a detected static call cycle and marks that finding unresolved. unresolved supported analysis_7a8a98c4ba2ee6a1:claim_d159136010a2
c15 The role labels are derived from static resolved call degree and entrypoint membership, so every role statement in this section is inferred from call counts, not from runtime behavior. inferred supported analysis_7a8a98c4ba2ee6a1:role_129, analysis_7a8a98c4ba2ee6a1:role_124, analysis_7a8a98c4ba2ee6a1:role_87, analysis_7a8a98c4ba2ee6a1:role_121, analysis_7a8a98c4ba2ee6a1:role_111, analysis_7a8a98c4ba2ee6a1:role_91, analysis_7a8a98c4ba2ee6a1:role_191
c16 rich/text.py carries the highest incoming degree among the listed roles: 707 incoming and 44 outgoing calls, labeled an entry/orchestration candidate. inferred supported analysis_7a8a98c4ba2ee6a1:role_129
c17 rich/style.py (474 incoming, 26 outgoing) is labeled a service/core candidate, and rich/console.py (416 incoming, 78 outgoing) an entry/orchestration candidate. inferred supported analysis_7a8a98c4ba2ee6a1:role_124, analysis_7a8a98c4ba2ee6a1:role_87
c18 rich/segment.py (337 incoming, 7 outgoing) and rich/pretty.py (149 incoming, 71 outgoing) are also labeled entry/orchestration candidates. inferred supported analysis_7a8a98c4ba2ee6a1:role_121, analysis_7a8a98c4ba2ee6a1:role_111
c19 rich/default_styles.py shows the largest outgoing degree among the listed rich modules: 154 outgoing calls against 1 incoming. inferred supported analysis_7a8a98c4ba2ee6a1:role_91
c20 Test modules appear as orchestration candidates; for example tests/test_text.py records 0 incoming and 329 outgoing calls. inferred supported analysis_7a8a98c4ba2ee6a1:role_191
c21 Of 11,248 recorded static relations, 6,703 remain external or unresolved and 4,545 resolve to local targets. observed supported analysis_7a8a98c4ba2ee6a1:relation_counts
c22 A step marked external_or_unresolved records a call the analyzer could not tie to analyzed code, which is why those paths terminate there. inferred supported analysis_7a8a98c4ba2ee6a1:exec_befd398f8d93, analysis_7a8a98c4ba2ee6a1:exec_72a232bac152, analysis_7a8a98c4ba2ee6a1:exec_becc91576f8c, analysis_7a8a98c4ba2ee6a1:exec_c46953a9686b, analysis_7a8a98c4ba2ee6a1:exec_09a18199d9e4
c23 In the listed paths, the five unresolved-boundary paths stop at Console, print, SystemExit or attr.Factory reached from examples/attrs.py. inferred supported analysis_7a8a98c4ba2ee6a1:exec_befd398f8d93, analysis_7a8a98c4ba2ee6a1:exec_72a232bac152, analysis_7a8a98c4ba2ee6a1:exec_becc91576f8c, analysis_7a8a98c4ba2ee6a1:exec_c46953a9686b, analysis_7a8a98c4ba2ee6a1:exec_09a18199d9e4
c24 Past those unresolved targets the listed paths record no further steps, so control flow beyond the boundary is not reconstructed. inferred supported analysis_7a8a98c4ba2ee6a1:exec_befd398f8d93, analysis_7a8a98c4ba2ee6a1:exec_72a232bac152, analysis_7a8a98c4ba2ee6a1:exec_becc91576f8c, analysis_7a8a98c4ba2ee6a1:exec_c46953a9686b, analysis_7a8a98c4ba2ee6a1:exec_09a18199d9e4
c25 The parsed dependency records are four runtime-scoped entries from docs/requirements.txt: alabaster ==1.0.0, Sphinx ==8.2.3, sphinx-rtd-theme ==3.0.2 and sphinx-copybutton ==0.5.2. observed supported analysis_7a8a98c4ba2ee6a1:dep_1, analysis_7a8a98c4ba2ee6a1:dep_2, analysis_7a8a98c4ba2ee6a1:dep_3, analysis_7a8a98c4ba2ee6a1:dep_4
c26 All four parsed dependency records come from docs/requirements.txt; the pinned Sphinx-related names suggest the docs subsystem carries documentation build tooling. inferred supported analysis_7a8a98c4ba2ee6a1:dep_1, analysis_7a8a98c4ba2ee6a1:dep_2, analysis_7a8a98c4ba2ee6a1:dep_3, analysis_7a8a98c4ba2ee6a1:dep_4
c27 Dependency coverage is partial: the analyzer parses only requirements-style manifests, and pyproject.toml dependency tables are not parsed. observed supported analysis_7a8a98c4ba2ee6a1:lim_3
c28 Across the analyzed set the resolver recorded 9,630 call relations and 1,618 import relations. observed supported analysis_7a8a98c4ba2ee6a1:relation_counts
c29 Because 6,703 relations stay external or unresolved, the picture of which parts depend on which is incomplete. inferred supported analysis_7a8a98c4ba2ee6a1:relation_counts
c30 The analysis is static only: reflection, runtime dependency injection, dynamic imports, monkey-patching, generated code, framework runtime wiring and dynamic dispatch are not resolved. observed supported analysis_7a8a98c4ba2ee6a1:lim_1
c31 Install, run and build inference is partial, and installation commands are not verified. observed supported analysis_7a8a98c4ba2ee6a1:lim_2
c32 README claim extraction is line-based and may capture code lines instead of prose, so README-derived statements are author_claimed at best. observed supported analysis_7a8a98c4ba2ee6a1:lim_4
c33 Bounded analysis caps relation extraction at 2,500 relations per file and 150,000 per repository, and files over 400 kB, minified bundles and vendored directories are inventoried but not parsed. observed supported analysis_7a8a98c4ba2ee6a1:lim_6
c34 The manifest's capability fields describe the analyzer itself, not the analyzed repository, and are excluded from repository evidence. observed supported analysis_7a8a98c4ba2ee6a1:lim_5
c35 The tree includes 68 test-like files, but the analysis does not execute them, so behavior encoded in tests is not established. inferred supported analysis_7a8a98c4ba2ee6a1:summary_repository, analysis_7a8a98c4ba2ee6a1:lim_1
c36 README.md, pyproject.toml, setup.py and LICENSE are classified as project-level important files. observed supported analysis_7a8a98c4ba2ee6a1:important_1, analysis_7a8a98c4ba2ee6a1:important_3, analysis_7a8a98c4ba2ee6a1:important_4, analysis_7a8a98c4ba2ee6a1:important_5
c37 The suggested learning path is to start with manifests and important symbols, trace the bounded execution paths, and inspect unresolved boundaries before changing code. inferred supported analysis_7a8a98c4ba2ee6a1:claim_e56db45165bf
c38 The analyzer flags README.md, pyproject.toml and setup.py as files to read early. inferred supported analysis_7a8a98c4ba2ee6a1:claim_5e040738cac5, analysis_7a8a98c4ba2ee6a1:claim_0419236c594f, analysis_7a8a98c4ba2ee6a1:claim_fdd5776d5faf
c39 Within the package, the role table points to rich/text.py, rich/style.py and rich/console.py as the most connected modules to read first. inferred supported analysis_7a8a98c4ba2ee6a1:role_129, analysis_7a8a98c4ba2ee6a1:role_124, analysis_7a8a98c4ba2ee6a1:role_87

Sources, rights and disclosure · attribution-license-templates/v0.1

Rights notice. Original repository hosted on GitHub. Repository source code, documentation, names, media, and related project materials remain subject to the rights of their respective authors, contributors, and other rights holders and to applicable repository license terms.

Platform notice. GitHub is the source hosting platform for the linked repository. GitHub and related marks are trademarks of GitHub, Inc. EVEMISS Technology is not affiliated with or endorsed by GitHub unless explicitly stated otherwise.

How this page is produced. This page was produced using revision-aware repository analysis and AI-assisted editorial tooling. Technical claims are tied to the analyzed repository revision and may be revalidated when the source repository changes.

AI-assisted analysis. Reviewed by EVEMISS Technology through human–AI collaborative review. · Report a rights concern · Back to the overview