From f780a66c3a51902306a107d165c8ca9d1ac32e92 Mon Sep 17 00:00:00 2001 From: Archlens Bot Date: Wed, 17 Jun 2026 08:27:43 +0000 Subject: [PATCH] docs: update architecture diagrams --- docs/architecture/module.mmd | 14 +- docs/architecture/project.mmd | 20 +- docs/architecture/type/adapters.mmd | 140 +++---- docs/architecture/type/application.mmd | 16 +- docs/architecture/type/domain.mmd | 258 ++++++------ docs/architecture/type/overview.mmd | 510 ++++++++++++------------ docs/architecture/type/presentation.mmd | 32 +- 7 files changed, 495 insertions(+), 495 deletions(-) diff --git a/docs/architecture/module.mmd b/docs/architecture/module.mmd index f8bb9ec..d0edcc1 100644 --- a/docs/architecture/module.mmd +++ b/docs/architecture/module.mmd @@ -1,10 +1,10 @@ graph TD - Adapters[Adapters] - Presentation[Presentation] - Domain[Domain] Application[Application] - Application -->|2 deps| Domain - Presentation -->|1 dep| Domain - Presentation -->|11 deps| Adapters + Domain[Domain] + Presentation[Presentation] + Adapters[Adapters] Presentation -->|1 dep| Application - Adapters -->|24 deps| Domain \ No newline at end of file + Presentation -->|11 deps| Adapters + Adapters -->|24 deps| Domain + Presentation -->|1 dep| Domain + Application -->|2 deps| Domain \ No newline at end of file diff --git a/docs/architecture/project.mmd b/docs/architecture/project.mmd index 86be3a3..0e614b2 100644 --- a/docs/architecture/project.mmd +++ b/docs/architecture/project.mmd @@ -16,19 +16,19 @@ graph TD archlens_html[archlens-html] end archlens_application --> archlens_domain + archlens --> archlens_application + archlens --> archlens_toml_config + archlens --> archlens_domain + archlens --> archlens_file_writer + archlens --> archlens_tree_sitter + archlens --> archlens_cargo_workspace + archlens --> archlens_mermaid archlens --> archlens_stdout_writer archlens --> archlens_ascii - archlens --> archlens_application - archlens --> archlens_html - archlens --> archlens_domain - archlens --> archlens_tree_sitter - archlens --> archlens_toml_config - archlens --> archlens_d2 - archlens --> archlens_walkdir - archlens --> archlens_file_writer - archlens --> archlens_mermaid - archlens --> archlens_cargo_workspace archlens --> archlens_python_project + archlens --> archlens_walkdir + archlens --> archlens_html + archlens --> archlens_d2 archlens_tree_sitter --> archlens_domain archlens_walkdir --> archlens_domain archlens_mermaid --> archlens_domain diff --git a/docs/architecture/type/adapters.mmd b/docs/architecture/type/adapters.mmd index b254fdb..24fcb03 100644 --- a/docs/architecture/type/adapters.mmd +++ b/docs/architecture/type/adapters.mmd @@ -31,92 +31,92 @@ classDiagram class MemberToml class PackageSection } - MermaidRenderer : level: DiagramLevel - MermaidRenderer : show_weights: bool - MermaidRenderer : +new() -> Self - MermaidRenderer : +with_level(level: DiagramLevel) -> Self - MermaidRenderer : +with_weights(show: bool) -> Self - MermaidRenderer : -display_name(qualified: &str) -> &str - MermaidRenderer : -format_element_name(element: &CodeElement) -> String - MermaidRenderer : -format_visibility(visibility: Visibility) -> &'static str - MermaidRenderer : -render_class_diagram(graph: &CodeGraph) -> String - MermaidRenderer : -push_class_lines(lines: &mut Vec, deferred: &mut Vec, element: &CodeElement, indent: &str, in_namespace: bool) - MermaidRenderer : -render_module_flowchart(graph: &CodeGraph) -> String - MermaidRenderer : -render_project_flowchart(graph: &CodeGraph) -> String - MermaidRenderer : -sanitize_id(name: &str) -> String - AsciiRenderer : +new() -> Self - AsciiRenderer : -format_kind(element: &CodeElement) -> &'static str - PythonProjectAnalyzer : +new() -> Self + MermaidRenderer : level DiagramLevel + MermaidRenderer : show_weights bool + MermaidRenderer : +new() -] Self + MermaidRenderer : +with_level(level DiagramLevel) -] Self + MermaidRenderer : +with_weights(show bool) -] Self + MermaidRenderer : -display_name(qualified str) -] str + MermaidRenderer : -format_element_name(element CodeElement) -] String + MermaidRenderer : -format_visibility(visibility Visibility) -] static str + MermaidRenderer : -render_class_diagram(graph CodeGraph) -] String + MermaidRenderer : -push_class_lines(lines mut Vec[String], deferred mut Vec[String], element CodeElement, indent str, in_namespace bool) + MermaidRenderer : -render_module_flowchart(graph CodeGraph) -] String + MermaidRenderer : -render_project_flowchart(graph CodeGraph) -] String + MermaidRenderer : -sanitize_id(name str) -] String + AsciiRenderer : +new() -] Self + AsciiRenderer : -format_kind(element CodeElement) -] static str + PythonProjectAnalyzer : +new() -] Self <> ProjectSection - ProjectSection : name: Option - ProjectSection : dependencies: Vec + ProjectSection : name Option + ProjectSection : dependencies Vec <> PoetrySection - PoetrySection : name: Option - PoetrySection : dependencies: HashMap + PoetrySection : name Option + PoetrySection : dependencies HashMap <> ToolSection - ToolSection : poetry: PoetrySection + ToolSection : poetry PoetrySection <> PyprojectToml - PyprojectToml : project: Option - PyprojectToml : tool: ToolSection - WalkdirDiscovery : +new() -> Self - WalkdirDiscovery : -detect_language(path: &Path) -> Option - WalkdirDiscovery : -is_test_file(path: &Path, language: Language) -> bool - WalkdirDiscovery : -is_excluded(path: &Path, root: &Path, excludes: &[String]) -> bool - TreeSitterAnalyzer : rust: RustExtractor - TreeSitterAnalyzer : python: PythonExtractor - TreeSitterAnalyzer : +new() -> Self - TreeSitterAnalyzer : -extractor_for(language: Language) -> Option<&dyn LanguageExtractor> - FileOutputWriter : output_path: OutputPath - FileOutputWriter : +new(output_dir: PathBuf) -> Self - FileOutputWriter : +single_file(path: PathBuf) -> Self + PyprojectToml : project Option + PyprojectToml : tool ToolSection + WalkdirDiscovery : +new() -] Self + WalkdirDiscovery : -detect_language(path Path) -] Option[Language] + WalkdirDiscovery : -is_test_file(path Path, language Language) -] bool + WalkdirDiscovery : -is_excluded(path Path, root Path, excludes [String]) -] bool + TreeSitterAnalyzer : rust RustExtractor + TreeSitterAnalyzer : python PythonExtractor + TreeSitterAnalyzer : +new() -] Self + TreeSitterAnalyzer : -extractor_for(language Language) -] Option[dyn LanguageExtractor] + FileOutputWriter : output_path OutputPath + FileOutputWriter : +new(output_dir PathBuf) -] Self + FileOutputWriter : +single_file(path PathBuf) -] Self <> OutputPath - StdoutOutputWriter : +new() -> Self + StdoutOutputWriter : +new() -] Self <> RawRules - RawRules : allow: Vec - RawRules : deny: Vec + RawRules : allow Vec + RawRules : deny Vec <> RawConfig - RawConfig : analysis: RawAnalysis - RawConfig : output: RawOutput - RawConfig : modules: HashMap - RawConfig : rules: RawRules + RawConfig : analysis RawAnalysis + RawConfig : output RawOutput + RawConfig : modules HashMap + RawConfig : rules RawRules <> RawAnalysis - RawAnalysis : exclude: Vec - RawAnalysis : level: Option + RawAnalysis : exclude Vec + RawAnalysis : level Option <> RawOutput - RawOutput : format: Option - RawOutput : path: Option - RawOutput : split_by_module: bool - TomlConfigLoader : raw: RawConfig - TomlConfigLoader : +from_path(path: &Path) -> Result - TomlConfigLoader : -parse_level(level: &Option) -> DiagramLevel - D2Renderer : level: DiagramLevel - D2Renderer : +new() -> Self - D2Renderer : +with_level(level: DiagramLevel) -> Self - HtmlRenderer : +new() -> Self + RawOutput : format Option + RawOutput : path Option + RawOutput : split_by_module bool + TomlConfigLoader : raw RawConfig + TomlConfigLoader : +from_path(path Path) -] Result[Self, DomainError] + TomlConfigLoader : -parse_level(level Option[String]) -] DiagramLevel + D2Renderer : level DiagramLevel + D2Renderer : +new() -] Self + D2Renderer : +with_level(level DiagramLevel) -] Self + HtmlRenderer : +new() -] Self <> GraphData - GraphData : nodes: Vec - GraphData : edges: Vec + GraphData : nodes Vec + GraphData : edges Vec <> NodeData - NodeData : id: String - NodeData : label: String - NodeData : module: String - NodeData : kind: String - NodeData : fields: Vec - NodeData : methods: Vec + NodeData : id String + NodeData : label String + NodeData : module String + NodeData : kind String + NodeData : fields Vec + NodeData : methods Vec <> EdgeData - EdgeData : source: String - EdgeData : target: String - EdgeData : kind: String - CargoWorkspaceAnalyzer : +new() -> Self + EdgeData : source String + EdgeData : target String + EdgeData : kind String + CargoWorkspaceAnalyzer : +new() -] Self <> WorkspaceToml - WorkspaceToml : workspace: Option + WorkspaceToml : workspace Option <> WorkspaceSection - WorkspaceSection : members: Vec + WorkspaceSection : members Vec <> MemberToml - MemberToml : package: Option - MemberToml : dependencies: HashMap + MemberToml : package Option + MemberToml : dependencies HashMap <> PackageSection - PackageSection : name: String + PackageSection : name String ToolSection --> PoetrySection PyprojectToml --> ToolSection TreeSitterAnalyzer --> RustExtractor diff --git a/docs/architecture/type/application.mmd b/docs/architecture/type/application.mmd index 6c6c07a..cb503f6 100644 --- a/docs/architecture/type/application.mmd +++ b/docs/architecture/type/application.mmd @@ -3,14 +3,14 @@ classDiagram class AnalyzeCodebase class AnalyzeCodebaseResult } - AnalyzeCodebase : file_discovery: F - AnalyzeCodebase : source_analyzer: S - AnalyzeCodebase : +new(file_discovery: F, source_analyzer: S) -> Self - AnalyzeCodebase : +execute(root: &Path, config: &AnalysisConfig) -> Result - AnalyzeCodebaseResult : graph: CodeGraph - AnalyzeCodebaseResult : warnings: Vec - AnalyzeCodebaseResult : +graph() -> &CodeGraph - AnalyzeCodebaseResult : +warnings() -> &[AnalysisWarning] + AnalyzeCodebase : file_discovery F + AnalyzeCodebase : source_analyzer S + AnalyzeCodebase : +new(file_discovery F, source_analyzer S) -] Self + AnalyzeCodebase : +execute(root Path, config AnalysisConfig) -] Result[AnalyzeCodebaseResult, DomainError] + AnalyzeCodebaseResult : graph CodeGraph + AnalyzeCodebaseResult : warnings Vec + AnalyzeCodebaseResult : +graph() -] CodeGraph + AnalyzeCodebaseResult : +warnings() -] [AnalysisWarning] class application_module["Application"] { <> } diff --git a/docs/architecture/type/domain.mmd b/docs/architecture/type/domain.mmd index d874ae6..865b88f 100644 --- a/docs/architecture/type/domain.mmd +++ b/docs/architecture/type/domain.mmd @@ -28,135 +28,135 @@ classDiagram class CodeGraph class DomainError } - OutputConfig : split_by_module: bool - OutputConfig : output_path: Option - OutputConfig : +with_split_by_module(split: bool) -> Self - OutputConfig : +with_output_path(path: String) -> Self - OutputConfig : +split_by_module() -> bool - OutputConfig : +output_path() -> Option<&str> - RenderOutput : files: Vec - RenderOutput : +new(files: Vec) -> Self - RenderOutput : +single(file: RenderedFile) -> Self - RenderOutput : +files() -> &[RenderedFile] - RenderedFile : name: String - RenderedFile : content: String - RenderedFile : +new(name: &str, content: &str) -> Result - RenderedFile : +name() -> &str - RenderedFile : +content() -> &str - SourceFile : path: FilePath - SourceFile : language: Language - SourceFile : +new(path: FilePath, language: Language) -> Self - SourceFile : +path() -> &FilePath - SourceFile : +language() -> Language - ModuleName : +new(value: &str) -> Result - ModuleName : +from_path(file_path: &str, root: &Path, module_mappings: &HashMap) -> Option - ModuleName : +from_directory_group(member_path: &str) -> Option - ModuleName : +capitalize(s: &str) -> String - ModuleName : +as_str() -> &str - Language : +name() -> &'static str - FilePath : +new(value: &str) -> Result - FilePath : +as_str() -> &str - RuleViolation : source_module: String - RuleViolation : target_module: String - RuleViolation : kind: RuleKind - RuleViolation : +new(source_module: &str, target_module: &str, kind: RuleKind) -> Self - RuleViolation : +source_module() -> &str - RuleViolation : +target_module() -> &str - RuleViolation : +kind() -> &RuleKind - RuleViolation : +message() -> String - BoundaryRule : source: String - BoundaryRule : target: String - BoundaryRule : +parse(s: &str) -> Option - BoundaryRule : +source() -> &str - BoundaryRule : +target() -> &str - BoundaryRule : +matches(src_module: &str, tgt_module: &str) -> bool - AnalysisConfig : excludes: Vec - AnalysisConfig : level: DiagramLevel - AnalysisConfig : module_mappings: HashMap - AnalysisConfig : scope: Option - AnalysisConfig : include_tests: bool - AnalysisConfig : changed_files: Option - AnalysisConfig : +with_excludes(excludes: Vec) -> Self - AnalysisConfig : +with_level(level: DiagramLevel) -> Self - AnalysisConfig : +with_module_mappings(mappings: HashMap) -> Self - AnalysisConfig : +excludes() -> &[String] - AnalysisConfig : +level() -> DiagramLevel - AnalysisConfig : +with_scope(scope: String) -> Self - AnalysisConfig : +module_mappings() -> &HashMap - AnalysisConfig : +scope() -> Option<&str> - AnalysisConfig : +with_include_tests(include: bool) -> Self - AnalysisConfig : +include_tests() -> bool - AnalysisConfig : +with_changed_files(files: HashSet) -> Self - AnalysisConfig : +changed_files() -> Option<&HashSet> - AnalysisResult : elements: Vec - AnalysisResult : relationships: Vec - AnalysisResult : warnings: Vec - AnalysisResult : +new(elements: Vec, relationships: Vec, warnings: Vec) -> Self - AnalysisResult : +empty() -> Self - AnalysisResult : +elements() -> &[CodeElement] - AnalysisResult : +relationships() -> &[Relationship] - AnalysisResult : +warnings() -> &[AnalysisWarning] - AnalysisWarning : file_path: FilePath - AnalysisWarning : line: usize - AnalysisWarning : message: String - AnalysisWarning : +new(file_path: FilePath, line: usize, message: &str) -> Result - AnalysisWarning : +file_path() -> &FilePath - AnalysisWarning : +line() -> usize - AnalysisWarning : +message() -> &str - Relationship : source: String - Relationship : target: String - Relationship : kind: RelationshipKind - Relationship : source_file: Option - Relationship : +new(source: &str, target: &str, kind: RelationshipKind) -> Result - Relationship : +with_source_file(file: FilePath) -> Self - Relationship : +source() -> &str - Relationship : +target() -> &str - Relationship : +kind() -> RelationshipKind - Relationship : +source_file() -> Option<&FilePath> - CodeElement : name: String - CodeElement : qualified_name: Option - CodeElement : kind: CodeElementKind - CodeElement : file_path: FilePath - CodeElement : line: usize - CodeElement : visibility: Visibility - CodeElement : module: Option - CodeElement : generics: Vec - CodeElement : attributes: Vec - CodeElement : fields: Vec - CodeElement : methods: Vec - CodeElement : +new(name: &str, kind: CodeElementKind, file_path: FilePath, line: usize) -> Result - CodeElement : +with_visibility(visibility: Visibility) -> Self - CodeElement : +with_module(module: ModuleName) -> Self - CodeElement : +with_generics(generics: Vec) -> Self - CodeElement : +with_attributes(attributes: Vec) -> Self - CodeElement : +with_qualified_name(qn: String) -> Self - CodeElement : +name() -> &str - CodeElement : +qualified_name() -> &str - CodeElement : +kind() -> CodeElementKind - CodeElement : +file_path() -> &FilePath - CodeElement : +line() -> usize - CodeElement : +visibility() -> Visibility - CodeElement : +module() -> Option<&ModuleName> - CodeElement : +generics() -> &[String] - CodeElement : +attributes() -> &[String] - CodeElement : +with_fields(fields: Vec) -> Self - CodeElement : +with_methods(methods: Vec) -> Self - CodeElement : +fields() -> &[String] - CodeElement : +methods() -> &[String] - CodeGraph : elements: Vec - CodeGraph : relationships: Vec - CodeGraph : +new() -> Self - CodeGraph : +add_element(element: CodeElement) - CodeGraph : +add_relationship(relationship: Relationship) - CodeGraph : +elements() -> &[CodeElement] - CodeGraph : +relationships() -> &[Relationship] - CodeGraph : +modules() -> Vec - CodeGraph : +elements_by_module() -> (HashMap>, Vec<&CodeElement>) - CodeGraph : +resolve_relationships() -> CodeGraph - CodeGraph : +filter_external_imports(known_modules: &HashSet) -> CodeGraph - CodeGraph : +qualify() -> CodeGraph - CodeGraph : +cross_module_deps_for(module: &ModuleName) -> Vec<(ModuleName, usize)> - CodeGraph : +subgraph_by_module(module: &ModuleName) -> CodeGraph + OutputConfig : split_by_module bool + OutputConfig : output_path Option + OutputConfig : +with_split_by_module(split bool) -] Self + OutputConfig : +with_output_path(path String) -] Self + OutputConfig : +split_by_module() -] bool + OutputConfig : +output_path() -] Option[str] + RenderOutput : files Vec + RenderOutput : +new(files Vec[RenderedFile]) -] Self + RenderOutput : +single(file RenderedFile) -] Self + RenderOutput : +files() -] [RenderedFile] + RenderedFile : name String + RenderedFile : content String + RenderedFile : +new(name str, content str) -] Result[Self, DomainError] + RenderedFile : +name() -] str + RenderedFile : +content() -] str + SourceFile : path FilePath + SourceFile : language Language + SourceFile : +new(path FilePath, language Language) -] Self + SourceFile : +path() -] FilePath + SourceFile : +language() -] Language + ModuleName : +new(value str) -] Result[Self, DomainError] + ModuleName : +from_path(file_path str, root Path, module_mappings HashMap[String, String]) -] Option[Self] + ModuleName : +from_directory_group(member_path str) -] Option[Self] + ModuleName : +capitalize(s str) -] String + ModuleName : +as_str() -] str + Language : +name() -] static str + FilePath : +new(value str) -] Result[Self, DomainError] + FilePath : +as_str() -] str + RuleViolation : source_module String + RuleViolation : target_module String + RuleViolation : kind RuleKind + RuleViolation : +new(source_module str, target_module str, kind RuleKind) -] Self + RuleViolation : +source_module() -] str + RuleViolation : +target_module() -] str + RuleViolation : +kind() -] RuleKind + RuleViolation : +message() -] String + BoundaryRule : source String + BoundaryRule : target String + BoundaryRule : +parse(s str) -] Option[Self] + BoundaryRule : +source() -] str + BoundaryRule : +target() -] str + BoundaryRule : +matches(src_module str, tgt_module str) -] bool + AnalysisConfig : excludes Vec + AnalysisConfig : level DiagramLevel + AnalysisConfig : module_mappings HashMap + AnalysisConfig : scope Option + AnalysisConfig : include_tests bool + AnalysisConfig : changed_files Option + AnalysisConfig : +with_excludes(excludes Vec[String]) -] Self + AnalysisConfig : +with_level(level DiagramLevel) -] Self + AnalysisConfig : +with_module_mappings(mappings HashMap[String, String]) -] Self + AnalysisConfig : +excludes() -] [String] + AnalysisConfig : +level() -] DiagramLevel + AnalysisConfig : +with_scope(scope String) -] Self + AnalysisConfig : +module_mappings() -] HashMap[String, String] + AnalysisConfig : +scope() -] Option[str] + AnalysisConfig : +with_include_tests(include bool) -] Self + AnalysisConfig : +include_tests() -] bool + AnalysisConfig : +with_changed_files(files HashSet[String]) -] Self + AnalysisConfig : +changed_files() -] Option[HashSet[String]] + AnalysisResult : elements Vec + AnalysisResult : relationships Vec + AnalysisResult : warnings Vec + AnalysisResult : +new(elements Vec[CodeElement], relationships Vec[Relationship], warnings Vec[AnalysisWarning]) -] Self + AnalysisResult : +empty() -] Self + AnalysisResult : +elements() -] [CodeElement] + AnalysisResult : +relationships() -] [Relationship] + AnalysisResult : +warnings() -] [AnalysisWarning] + AnalysisWarning : file_path FilePath + AnalysisWarning : line usize + AnalysisWarning : message String + AnalysisWarning : +new(file_path FilePath, line usize, message str) -] Result[Self, DomainError] + AnalysisWarning : +file_path() -] FilePath + AnalysisWarning : +line() -] usize + AnalysisWarning : +message() -] str + Relationship : source String + Relationship : target String + Relationship : kind RelationshipKind + Relationship : source_file Option + Relationship : +new(source str, target str, kind RelationshipKind) -] Result[Self, DomainError] + Relationship : +with_source_file(file FilePath) -] Self + Relationship : +source() -] str + Relationship : +target() -] str + Relationship : +kind() -] RelationshipKind + Relationship : +source_file() -] Option[FilePath] + CodeElement : name String + CodeElement : qualified_name Option + CodeElement : kind CodeElementKind + CodeElement : file_path FilePath + CodeElement : line usize + CodeElement : visibility Visibility + CodeElement : module Option + CodeElement : generics Vec + CodeElement : attributes Vec + CodeElement : fields Vec + CodeElement : methods Vec + CodeElement : +new(name str, kind CodeElementKind, file_path FilePath, line usize) -] Result[Self, DomainError] + CodeElement : +with_visibility(visibility Visibility) -] Self + CodeElement : +with_module(module ModuleName) -] Self + CodeElement : +with_generics(generics Vec[String]) -] Self + CodeElement : +with_attributes(attributes Vec[String]) -] Self + CodeElement : +with_qualified_name(qn String) -] Self + CodeElement : +name() -] str + CodeElement : +qualified_name() -] str + CodeElement : +kind() -] CodeElementKind + CodeElement : +file_path() -] FilePath + CodeElement : +line() -] usize + CodeElement : +visibility() -] Visibility + CodeElement : +module() -] Option[ModuleName] + CodeElement : +generics() -] [String] + CodeElement : +attributes() -] [String] + CodeElement : +with_fields(fields Vec[String]) -] Self + CodeElement : +with_methods(methods Vec[String]) -] Self + CodeElement : +fields() -] [String] + CodeElement : +methods() -] [String] + CodeGraph : elements Vec + CodeGraph : relationships Vec + CodeGraph : +new() -] Self + CodeGraph : +add_element(element CodeElement) + CodeGraph : +add_relationship(relationship Relationship) + CodeGraph : +elements() -] [CodeElement] + CodeGraph : +relationships() -] [Relationship] + CodeGraph : +modules() -] Vec[ModuleName] + CodeGraph : +elements_by_module() -] (HashMap[String, Vec[CodeElement]], Vec[CodeElement]) + CodeGraph : +resolve_relationships() -] CodeGraph + CodeGraph : +filter_external_imports(known_modules HashSet[String]) -] CodeGraph + CodeGraph : +qualify() -] CodeGraph + CodeGraph : +cross_module_deps_for(module ModuleName) -] Vec[(ModuleName, usize)] + CodeGraph : +subgraph_by_module(module ModuleName) -] CodeGraph SourceFile --> FilePath SourceFile --> Language RuleViolation --> RuleKind diff --git a/docs/architecture/type/overview.mmd b/docs/architecture/type/overview.mmd index 6576150..0e32108 100644 --- a/docs/architecture/type/overview.mmd +++ b/docs/architecture/type/overview.mmd @@ -1,36 +1,4 @@ classDiagram - namespace Adapters { - class MermaidRenderer - class AsciiRenderer - class PythonProjectAnalyzer - class ProjectSection - class PoetrySection - class ToolSection - class PyprojectToml - class WalkdirDiscovery - class TreeSitterAnalyzer - class LanguageExtractor - class RustExtractor - class PythonExtractor - class FileOutputWriter - class OutputPath - class StdoutOutputWriter - class RawRules - class RawConfig - class RawAnalysis - class RawOutput - class TomlConfigLoader - class D2Renderer - class HtmlRenderer - class GraphData - class NodeData - class EdgeData - class CargoWorkspaceAnalyzer - class WorkspaceToml - class WorkspaceSection - class MemberToml - class PackageSection - } namespace Domain { class OutputConfig class DiagramLevel @@ -64,249 +32,281 @@ classDiagram class AnalyzeCodebase class AnalyzeCodebaseResult } + namespace Adapters { + class MermaidRenderer + class AsciiRenderer + class PythonProjectAnalyzer + class ProjectSection + class PoetrySection + class ToolSection + class PyprojectToml + class WalkdirDiscovery + class TreeSitterAnalyzer + class LanguageExtractor + class RustExtractor + class PythonExtractor + class FileOutputWriter + class OutputPath + class StdoutOutputWriter + class RawRules + class RawConfig + class RawAnalysis + class RawOutput + class TomlConfigLoader + class D2Renderer + class HtmlRenderer + class GraphData + class NodeData + class EdgeData + class CargoWorkspaceAnalyzer + class WorkspaceToml + class WorkspaceSection + class MemberToml + class PackageSection + } namespace Presentation { class Cli class Command } - MermaidRenderer : level: DiagramLevel - MermaidRenderer : show_weights: bool - MermaidRenderer : +new() -> Self - MermaidRenderer : +with_level(level: DiagramLevel) -> Self - MermaidRenderer : +with_weights(show: bool) -> Self - MermaidRenderer : -display_name(qualified: &str) -> &str - MermaidRenderer : -format_element_name(element: &CodeElement) -> String - MermaidRenderer : -format_visibility(visibility: Visibility) -> &'static str - MermaidRenderer : -render_class_diagram(graph: &CodeGraph) -> String - MermaidRenderer : -push_class_lines(lines: &mut Vec, deferred: &mut Vec, element: &CodeElement, indent: &str, in_namespace: bool) - MermaidRenderer : -render_module_flowchart(graph: &CodeGraph) -> String - MermaidRenderer : -render_project_flowchart(graph: &CodeGraph) -> String - MermaidRenderer : -sanitize_id(name: &str) -> String - AsciiRenderer : +new() -> Self - AsciiRenderer : -format_kind(element: &CodeElement) -> &'static str - PythonProjectAnalyzer : +new() -> Self + OutputConfig : split_by_module bool + OutputConfig : output_path Option + OutputConfig : +with_split_by_module(split bool) -] Self + OutputConfig : +with_output_path(path String) -] Self + OutputConfig : +split_by_module() -] bool + OutputConfig : +output_path() -] Option[str] + RenderOutput : files Vec + RenderOutput : +new(files Vec[RenderedFile]) -] Self + RenderOutput : +single(file RenderedFile) -] Self + RenderOutput : +files() -] [RenderedFile] + RenderedFile : name String + RenderedFile : content String + RenderedFile : +new(name str, content str) -] Result[Self, DomainError] + RenderedFile : +name() -] str + RenderedFile : +content() -] str + SourceFile : path FilePath + SourceFile : language Language + SourceFile : +new(path FilePath, language Language) -] Self + SourceFile : +path() -] FilePath + SourceFile : +language() -] Language + ModuleName : +new(value str) -] Result[Self, DomainError] + ModuleName : +from_path(file_path str, root Path, module_mappings HashMap[String, String]) -] Option[Self] + ModuleName : +from_directory_group(member_path str) -] Option[Self] + ModuleName : +capitalize(s str) -] String + ModuleName : +as_str() -] str + Language : +name() -] static str + FilePath : +new(value str) -] Result[Self, DomainError] + FilePath : +as_str() -] str + RuleViolation : source_module String + RuleViolation : target_module String + RuleViolation : kind RuleKind + RuleViolation : +new(source_module str, target_module str, kind RuleKind) -] Self + RuleViolation : +source_module() -] str + RuleViolation : +target_module() -] str + RuleViolation : +kind() -] RuleKind + RuleViolation : +message() -] String + BoundaryRule : source String + BoundaryRule : target String + BoundaryRule : +parse(s str) -] Option[Self] + BoundaryRule : +source() -] str + BoundaryRule : +target() -] str + BoundaryRule : +matches(src_module str, tgt_module str) -] bool + AnalysisConfig : excludes Vec + AnalysisConfig : level DiagramLevel + AnalysisConfig : module_mappings HashMap + AnalysisConfig : scope Option + AnalysisConfig : include_tests bool + AnalysisConfig : changed_files Option + AnalysisConfig : +with_excludes(excludes Vec[String]) -] Self + AnalysisConfig : +with_level(level DiagramLevel) -] Self + AnalysisConfig : +with_module_mappings(mappings HashMap[String, String]) -] Self + AnalysisConfig : +excludes() -] [String] + AnalysisConfig : +level() -] DiagramLevel + AnalysisConfig : +with_scope(scope String) -] Self + AnalysisConfig : +module_mappings() -] HashMap[String, String] + AnalysisConfig : +scope() -] Option[str] + AnalysisConfig : +with_include_tests(include bool) -] Self + AnalysisConfig : +include_tests() -] bool + AnalysisConfig : +with_changed_files(files HashSet[String]) -] Self + AnalysisConfig : +changed_files() -] Option[HashSet[String]] + AnalysisResult : elements Vec + AnalysisResult : relationships Vec + AnalysisResult : warnings Vec + AnalysisResult : +new(elements Vec[CodeElement], relationships Vec[Relationship], warnings Vec[AnalysisWarning]) -] Self + AnalysisResult : +empty() -] Self + AnalysisResult : +elements() -] [CodeElement] + AnalysisResult : +relationships() -] [Relationship] + AnalysisResult : +warnings() -] [AnalysisWarning] + AnalysisWarning : file_path FilePath + AnalysisWarning : line usize + AnalysisWarning : message String + AnalysisWarning : +new(file_path FilePath, line usize, message str) -] Result[Self, DomainError] + AnalysisWarning : +file_path() -] FilePath + AnalysisWarning : +line() -] usize + AnalysisWarning : +message() -] str + Relationship : source String + Relationship : target String + Relationship : kind RelationshipKind + Relationship : source_file Option + Relationship : +new(source str, target str, kind RelationshipKind) -] Result[Self, DomainError] + Relationship : +with_source_file(file FilePath) -] Self + Relationship : +source() -] str + Relationship : +target() -] str + Relationship : +kind() -] RelationshipKind + Relationship : +source_file() -] Option[FilePath] + CodeElement : name String + CodeElement : qualified_name Option + CodeElement : kind CodeElementKind + CodeElement : file_path FilePath + CodeElement : line usize + CodeElement : visibility Visibility + CodeElement : module Option + CodeElement : generics Vec + CodeElement : attributes Vec + CodeElement : fields Vec + CodeElement : methods Vec + CodeElement : +new(name str, kind CodeElementKind, file_path FilePath, line usize) -] Result[Self, DomainError] + CodeElement : +with_visibility(visibility Visibility) -] Self + CodeElement : +with_module(module ModuleName) -] Self + CodeElement : +with_generics(generics Vec[String]) -] Self + CodeElement : +with_attributes(attributes Vec[String]) -] Self + CodeElement : +with_qualified_name(qn String) -] Self + CodeElement : +name() -] str + CodeElement : +qualified_name() -] str + CodeElement : +kind() -] CodeElementKind + CodeElement : +file_path() -] FilePath + CodeElement : +line() -] usize + CodeElement : +visibility() -] Visibility + CodeElement : +module() -] Option[ModuleName] + CodeElement : +generics() -] [String] + CodeElement : +attributes() -] [String] + CodeElement : +with_fields(fields Vec[String]) -] Self + CodeElement : +with_methods(methods Vec[String]) -] Self + CodeElement : +fields() -] [String] + CodeElement : +methods() -] [String] + CodeGraph : elements Vec + CodeGraph : relationships Vec + CodeGraph : +new() -] Self + CodeGraph : +add_element(element CodeElement) + CodeGraph : +add_relationship(relationship Relationship) + CodeGraph : +elements() -] [CodeElement] + CodeGraph : +relationships() -] [Relationship] + CodeGraph : +modules() -] Vec[ModuleName] + CodeGraph : +elements_by_module() -] (HashMap[String, Vec[CodeElement]], Vec[CodeElement]) + CodeGraph : +resolve_relationships() -] CodeGraph + CodeGraph : +filter_external_imports(known_modules HashSet[String]) -] CodeGraph + CodeGraph : +qualify() -] CodeGraph + CodeGraph : +cross_module_deps_for(module ModuleName) -] Vec[(ModuleName, usize)] + CodeGraph : +subgraph_by_module(module ModuleName) -] CodeGraph + AnalyzeCodebase : file_discovery F + AnalyzeCodebase : source_analyzer S + AnalyzeCodebase : +new(file_discovery F, source_analyzer S) -] Self + AnalyzeCodebase : +execute(root Path, config AnalysisConfig) -] Result[AnalyzeCodebaseResult, DomainError] + AnalyzeCodebaseResult : graph CodeGraph + AnalyzeCodebaseResult : warnings Vec + AnalyzeCodebaseResult : +graph() -] CodeGraph + AnalyzeCodebaseResult : +warnings() -] [AnalysisWarning] + MermaidRenderer : level DiagramLevel + MermaidRenderer : show_weights bool + MermaidRenderer : +new() -] Self + MermaidRenderer : +with_level(level DiagramLevel) -] Self + MermaidRenderer : +with_weights(show bool) -] Self + MermaidRenderer : -display_name(qualified str) -] str + MermaidRenderer : -format_element_name(element CodeElement) -] String + MermaidRenderer : -format_visibility(visibility Visibility) -] static str + MermaidRenderer : -render_class_diagram(graph CodeGraph) -] String + MermaidRenderer : -push_class_lines(lines mut Vec[String], deferred mut Vec[String], element CodeElement, indent str, in_namespace bool) + MermaidRenderer : -render_module_flowchart(graph CodeGraph) -] String + MermaidRenderer : -render_project_flowchart(graph CodeGraph) -] String + MermaidRenderer : -sanitize_id(name str) -] String + AsciiRenderer : +new() -] Self + AsciiRenderer : -format_kind(element CodeElement) -] static str + PythonProjectAnalyzer : +new() -] Self <> ProjectSection - ProjectSection : name: Option - ProjectSection : dependencies: Vec + ProjectSection : name Option + ProjectSection : dependencies Vec <> PoetrySection - PoetrySection : name: Option - PoetrySection : dependencies: HashMap + PoetrySection : name Option + PoetrySection : dependencies HashMap <> ToolSection - ToolSection : poetry: PoetrySection + ToolSection : poetry PoetrySection <> PyprojectToml - PyprojectToml : project: Option - PyprojectToml : tool: ToolSection - WalkdirDiscovery : +new() -> Self - WalkdirDiscovery : -detect_language(path: &Path) -> Option - WalkdirDiscovery : -is_test_file(path: &Path, language: Language) -> bool - WalkdirDiscovery : -is_excluded(path: &Path, root: &Path, excludes: &[String]) -> bool - TreeSitterAnalyzer : rust: RustExtractor - TreeSitterAnalyzer : python: PythonExtractor - TreeSitterAnalyzer : +new() -> Self - TreeSitterAnalyzer : -extractor_for(language: Language) -> Option<&dyn LanguageExtractor> - FileOutputWriter : output_path: OutputPath - FileOutputWriter : +new(output_dir: PathBuf) -> Self - FileOutputWriter : +single_file(path: PathBuf) -> Self + PyprojectToml : project Option + PyprojectToml : tool ToolSection + WalkdirDiscovery : +new() -] Self + WalkdirDiscovery : -detect_language(path Path) -] Option[Language] + WalkdirDiscovery : -is_test_file(path Path, language Language) -] bool + WalkdirDiscovery : -is_excluded(path Path, root Path, excludes [String]) -] bool + TreeSitterAnalyzer : rust RustExtractor + TreeSitterAnalyzer : python PythonExtractor + TreeSitterAnalyzer : +new() -] Self + TreeSitterAnalyzer : -extractor_for(language Language) -] Option[dyn LanguageExtractor] + FileOutputWriter : output_path OutputPath + FileOutputWriter : +new(output_dir PathBuf) -] Self + FileOutputWriter : +single_file(path PathBuf) -] Self <> OutputPath - StdoutOutputWriter : +new() -> Self + StdoutOutputWriter : +new() -] Self <> RawRules - RawRules : allow: Vec - RawRules : deny: Vec + RawRules : allow Vec + RawRules : deny Vec <> RawConfig - RawConfig : analysis: RawAnalysis - RawConfig : output: RawOutput - RawConfig : modules: HashMap - RawConfig : rules: RawRules + RawConfig : analysis RawAnalysis + RawConfig : output RawOutput + RawConfig : modules HashMap + RawConfig : rules RawRules <> RawAnalysis - RawAnalysis : exclude: Vec - RawAnalysis : level: Option + RawAnalysis : exclude Vec + RawAnalysis : level Option <> RawOutput - RawOutput : format: Option - RawOutput : path: Option - RawOutput : split_by_module: bool - TomlConfigLoader : raw: RawConfig - TomlConfigLoader : +from_path(path: &Path) -> Result - TomlConfigLoader : -parse_level(level: &Option) -> DiagramLevel - D2Renderer : level: DiagramLevel - D2Renderer : +new() -> Self - D2Renderer : +with_level(level: DiagramLevel) -> Self - HtmlRenderer : +new() -> Self + RawOutput : format Option + RawOutput : path Option + RawOutput : split_by_module bool + TomlConfigLoader : raw RawConfig + TomlConfigLoader : +from_path(path Path) -] Result[Self, DomainError] + TomlConfigLoader : -parse_level(level Option[String]) -] DiagramLevel + D2Renderer : level DiagramLevel + D2Renderer : +new() -] Self + D2Renderer : +with_level(level DiagramLevel) -] Self + HtmlRenderer : +new() -] Self <> GraphData - GraphData : nodes: Vec - GraphData : edges: Vec + GraphData : nodes Vec + GraphData : edges Vec <> NodeData - NodeData : id: String - NodeData : label: String - NodeData : module: String - NodeData : kind: String - NodeData : fields: Vec - NodeData : methods: Vec + NodeData : id String + NodeData : label String + NodeData : module String + NodeData : kind String + NodeData : fields Vec + NodeData : methods Vec <> EdgeData - EdgeData : source: String - EdgeData : target: String - EdgeData : kind: String - CargoWorkspaceAnalyzer : +new() -> Self + EdgeData : source String + EdgeData : target String + EdgeData : kind String + CargoWorkspaceAnalyzer : +new() -] Self <> WorkspaceToml - WorkspaceToml : workspace: Option + WorkspaceToml : workspace Option <> WorkspaceSection - WorkspaceSection : members: Vec + WorkspaceSection : members Vec <> MemberToml - MemberToml : package: Option - MemberToml : dependencies: HashMap + MemberToml : package Option + MemberToml : dependencies HashMap <> PackageSection - PackageSection : name: String - OutputConfig : split_by_module: bool - OutputConfig : output_path: Option - OutputConfig : +with_split_by_module(split: bool) -> Self - OutputConfig : +with_output_path(path: String) -> Self - OutputConfig : +split_by_module() -> bool - OutputConfig : +output_path() -> Option<&str> - RenderOutput : files: Vec - RenderOutput : +new(files: Vec) -> Self - RenderOutput : +single(file: RenderedFile) -> Self - RenderOutput : +files() -> &[RenderedFile] - RenderedFile : name: String - RenderedFile : content: String - RenderedFile : +new(name: &str, content: &str) -> Result - RenderedFile : +name() -> &str - RenderedFile : +content() -> &str - SourceFile : path: FilePath - SourceFile : language: Language - SourceFile : +new(path: FilePath, language: Language) -> Self - SourceFile : +path() -> &FilePath - SourceFile : +language() -> Language - ModuleName : +new(value: &str) -> Result - ModuleName : +from_path(file_path: &str, root: &Path, module_mappings: &HashMap) -> Option - ModuleName : +from_directory_group(member_path: &str) -> Option - ModuleName : +capitalize(s: &str) -> String - ModuleName : +as_str() -> &str - Language : +name() -> &'static str - FilePath : +new(value: &str) -> Result - FilePath : +as_str() -> &str - RuleViolation : source_module: String - RuleViolation : target_module: String - RuleViolation : kind: RuleKind - RuleViolation : +new(source_module: &str, target_module: &str, kind: RuleKind) -> Self - RuleViolation : +source_module() -> &str - RuleViolation : +target_module() -> &str - RuleViolation : +kind() -> &RuleKind - RuleViolation : +message() -> String - BoundaryRule : source: String - BoundaryRule : target: String - BoundaryRule : +parse(s: &str) -> Option - BoundaryRule : +source() -> &str - BoundaryRule : +target() -> &str - BoundaryRule : +matches(src_module: &str, tgt_module: &str) -> bool - AnalysisConfig : excludes: Vec - AnalysisConfig : level: DiagramLevel - AnalysisConfig : module_mappings: HashMap - AnalysisConfig : scope: Option - AnalysisConfig : include_tests: bool - AnalysisConfig : changed_files: Option - AnalysisConfig : +with_excludes(excludes: Vec) -> Self - AnalysisConfig : +with_level(level: DiagramLevel) -> Self - AnalysisConfig : +with_module_mappings(mappings: HashMap) -> Self - AnalysisConfig : +excludes() -> &[String] - AnalysisConfig : +level() -> DiagramLevel - AnalysisConfig : +with_scope(scope: String) -> Self - AnalysisConfig : +module_mappings() -> &HashMap - AnalysisConfig : +scope() -> Option<&str> - AnalysisConfig : +with_include_tests(include: bool) -> Self - AnalysisConfig : +include_tests() -> bool - AnalysisConfig : +with_changed_files(files: HashSet) -> Self - AnalysisConfig : +changed_files() -> Option<&HashSet> - AnalysisResult : elements: Vec - AnalysisResult : relationships: Vec - AnalysisResult : warnings: Vec - AnalysisResult : +new(elements: Vec, relationships: Vec, warnings: Vec) -> Self - AnalysisResult : +empty() -> Self - AnalysisResult : +elements() -> &[CodeElement] - AnalysisResult : +relationships() -> &[Relationship] - AnalysisResult : +warnings() -> &[AnalysisWarning] - AnalysisWarning : file_path: FilePath - AnalysisWarning : line: usize - AnalysisWarning : message: String - AnalysisWarning : +new(file_path: FilePath, line: usize, message: &str) -> Result - AnalysisWarning : +file_path() -> &FilePath - AnalysisWarning : +line() -> usize - AnalysisWarning : +message() -> &str - Relationship : source: String - Relationship : target: String - Relationship : kind: RelationshipKind - Relationship : source_file: Option - Relationship : +new(source: &str, target: &str, kind: RelationshipKind) -> Result - Relationship : +with_source_file(file: FilePath) -> Self - Relationship : +source() -> &str - Relationship : +target() -> &str - Relationship : +kind() -> RelationshipKind - Relationship : +source_file() -> Option<&FilePath> - CodeElement : name: String - CodeElement : qualified_name: Option - CodeElement : kind: CodeElementKind - CodeElement : file_path: FilePath - CodeElement : line: usize - CodeElement : visibility: Visibility - CodeElement : module: Option - CodeElement : generics: Vec - CodeElement : attributes: Vec - CodeElement : fields: Vec - CodeElement : methods: Vec - CodeElement : +new(name: &str, kind: CodeElementKind, file_path: FilePath, line: usize) -> Result - CodeElement : +with_visibility(visibility: Visibility) -> Self - CodeElement : +with_module(module: ModuleName) -> Self - CodeElement : +with_generics(generics: Vec) -> Self - CodeElement : +with_attributes(attributes: Vec) -> Self - CodeElement : +with_qualified_name(qn: String) -> Self - CodeElement : +name() -> &str - CodeElement : +qualified_name() -> &str - CodeElement : +kind() -> CodeElementKind - CodeElement : +file_path() -> &FilePath - CodeElement : +line() -> usize - CodeElement : +visibility() -> Visibility - CodeElement : +module() -> Option<&ModuleName> - CodeElement : +generics() -> &[String] - CodeElement : +attributes() -> &[String] - CodeElement : +with_fields(fields: Vec) -> Self - CodeElement : +with_methods(methods: Vec) -> Self - CodeElement : +fields() -> &[String] - CodeElement : +methods() -> &[String] - CodeGraph : elements: Vec - CodeGraph : relationships: Vec - CodeGraph : +new() -> Self - CodeGraph : +add_element(element: CodeElement) - CodeGraph : +add_relationship(relationship: Relationship) - CodeGraph : +elements() -> &[CodeElement] - CodeGraph : +relationships() -> &[Relationship] - CodeGraph : +modules() -> Vec - CodeGraph : +elements_by_module() -> (HashMap>, Vec<&CodeElement>) - CodeGraph : +resolve_relationships() -> CodeGraph - CodeGraph : +filter_external_imports(known_modules: &HashSet) -> CodeGraph - CodeGraph : +qualify() -> CodeGraph - CodeGraph : +cross_module_deps_for(module: &ModuleName) -> Vec<(ModuleName, usize)> - CodeGraph : +subgraph_by_module(module: &ModuleName) -> CodeGraph - AnalyzeCodebase : file_discovery: F - AnalyzeCodebase : source_analyzer: S - AnalyzeCodebase : +new(file_discovery: F, source_analyzer: S) -> Self - AnalyzeCodebase : +execute(root: &Path, config: &AnalysisConfig) -> Result - AnalyzeCodebaseResult : graph: CodeGraph - AnalyzeCodebaseResult : warnings: Vec - AnalyzeCodebaseResult : +graph() -> &CodeGraph - AnalyzeCodebaseResult : +warnings() -> &[AnalysisWarning] - Cli : command: Option - Cli : path: PathBuf - Cli : level: String - Cli : format: String - Cli : output: Option - Cli : config: Option - Cli : scope: Option - Cli : exclude: Vec - Cli : include_tests: bool - Cli : no_weights: bool - Cli : watch: bool - Cli : since: Option - Cli : split_by_module: bool - Cli : strict: bool - Cli : check: bool - Cli : verbose: u8 + PackageSection : name String + Cli : command Option + Cli : path PathBuf + Cli : level String + Cli : format String + Cli : output Option + Cli : config Option + Cli : scope Option + Cli : exclude Vec + Cli : include_tests bool + Cli : no_weights bool + Cli : watch bool + Cli : since Option + Cli : split_by_module bool + Cli : strict bool + Cli : check bool + Cli : verbose u8 SourceFile --> FilePath SourceFile --> Language RuleViolation --> RuleKind diff --git a/docs/architecture/type/presentation.mmd b/docs/architecture/type/presentation.mmd index 9781288..567b924 100644 --- a/docs/architecture/type/presentation.mmd +++ b/docs/architecture/type/presentation.mmd @@ -3,19 +3,19 @@ classDiagram class Cli class Command } - Cli : command: Option - Cli : path: PathBuf - Cli : level: String - Cli : format: String - Cli : output: Option - Cli : config: Option - Cli : scope: Option - Cli : exclude: Vec - Cli : include_tests: bool - Cli : no_weights: bool - Cli : watch: bool - Cli : since: Option - Cli : split_by_module: bool - Cli : strict: bool - Cli : check: bool - Cli : verbose: u8 \ No newline at end of file + Cli : command Option + Cli : path PathBuf + Cli : level String + Cli : format String + Cli : output Option + Cli : config Option + Cli : scope Option + Cli : exclude Vec + Cli : include_tests bool + Cli : no_weights bool + Cli : watch bool + Cli : since Option + Cli : split_by_module bool + Cli : strict bool + Cli : check bool + Cli : verbose u8 \ No newline at end of file