docs: update architecture diagrams

This commit is contained in:
Archlens Bot
2026-06-17 08:27:43 +00:00
parent 84e5cc4f7e
commit f780a66c3a
7 changed files with 495 additions and 495 deletions

View File

@@ -1,10 +1,10 @@
graph TD graph TD
Adapters[Adapters]
Presentation[Presentation]
Domain[Domain]
Application[Application] Application[Application]
Application -->|2 deps| Domain Domain[Domain]
Presentation -->|1 dep| Domain Presentation[Presentation]
Presentation -->|11 deps| Adapters Adapters[Adapters]
Presentation -->|1 dep| Application Presentation -->|1 dep| Application
Presentation -->|11 deps| Adapters
Adapters -->|24 deps| Domain Adapters -->|24 deps| Domain
Presentation -->|1 dep| Domain
Application -->|2 deps| Domain

View File

@@ -16,19 +16,19 @@ graph TD
archlens_html[archlens-html] archlens_html[archlens-html]
end end
archlens_application --> archlens_domain 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_stdout_writer
archlens --> archlens_ascii 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_python_project
archlens --> archlens_walkdir
archlens --> archlens_html
archlens --> archlens_d2
archlens_tree_sitter --> archlens_domain archlens_tree_sitter --> archlens_domain
archlens_walkdir --> archlens_domain archlens_walkdir --> archlens_domain
archlens_mermaid --> archlens_domain archlens_mermaid --> archlens_domain

View File

@@ -31,92 +31,92 @@ classDiagram
class MemberToml class MemberToml
class PackageSection class PackageSection
} }
MermaidRenderer : level: DiagramLevel MermaidRenderer : level DiagramLevel
MermaidRenderer : show_weights: bool MermaidRenderer : show_weights bool
MermaidRenderer : +new() -> Self MermaidRenderer : +new() -] Self
MermaidRenderer : +with_level(level: DiagramLevel) -> Self MermaidRenderer : +with_level(level DiagramLevel) -] Self
MermaidRenderer : +with_weights(show: bool) -> Self MermaidRenderer : +with_weights(show bool) -] Self
MermaidRenderer : -display_name(qualified: &str) -> &str MermaidRenderer : -display_name(qualified str) -] str
MermaidRenderer : -format_element_name(element: &CodeElement) -> String MermaidRenderer : -format_element_name(element CodeElement) -] String
MermaidRenderer : -format_visibility(visibility: Visibility) -> &'static str MermaidRenderer : -format_visibility(visibility Visibility) -] static str
MermaidRenderer : -render_class_diagram(graph: &CodeGraph) -> String 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 : -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_module_flowchart(graph CodeGraph) -] String
MermaidRenderer : -render_project_flowchart(graph: &CodeGraph) -> String MermaidRenderer : -render_project_flowchart(graph CodeGraph) -] String
MermaidRenderer : -sanitize_id(name: &str) -> String MermaidRenderer : -sanitize_id(name str) -] String
AsciiRenderer : +new() -> Self AsciiRenderer : +new() -] Self
AsciiRenderer : -format_kind(element: &CodeElement) -> &'static str AsciiRenderer : -format_kind(element CodeElement) -] static str
PythonProjectAnalyzer : +new() -> Self PythonProjectAnalyzer : +new() -] Self
<<private>> ProjectSection <<private>> ProjectSection
ProjectSection : name: Option ProjectSection : name Option
ProjectSection : dependencies: Vec ProjectSection : dependencies Vec
<<private>> PoetrySection <<private>> PoetrySection
PoetrySection : name: Option PoetrySection : name Option
PoetrySection : dependencies: HashMap PoetrySection : dependencies HashMap
<<private>> ToolSection <<private>> ToolSection
ToolSection : poetry: PoetrySection ToolSection : poetry PoetrySection
<<private>> PyprojectToml <<private>> PyprojectToml
PyprojectToml : project: Option PyprojectToml : project Option
PyprojectToml : tool: ToolSection PyprojectToml : tool ToolSection
WalkdirDiscovery : +new() -> Self WalkdirDiscovery : +new() -] Self
WalkdirDiscovery : -detect_language(path: &Path) -> Option<Language> WalkdirDiscovery : -detect_language(path Path) -] Option[Language]
WalkdirDiscovery : -is_test_file(path: &Path, language: Language) -> bool WalkdirDiscovery : -is_test_file(path Path, language Language) -] bool
WalkdirDiscovery : -is_excluded(path: &Path, root: &Path, excludes: &[String]) -> bool WalkdirDiscovery : -is_excluded(path Path, root Path, excludes [String]) -] bool
TreeSitterAnalyzer : rust: RustExtractor TreeSitterAnalyzer : rust RustExtractor
TreeSitterAnalyzer : python: PythonExtractor TreeSitterAnalyzer : python PythonExtractor
TreeSitterAnalyzer : +new() -> Self TreeSitterAnalyzer : +new() -] Self
TreeSitterAnalyzer : -extractor_for(language: Language) -> Option<&dyn LanguageExtractor> TreeSitterAnalyzer : -extractor_for(language Language) -] Option[dyn LanguageExtractor]
FileOutputWriter : output_path: OutputPath FileOutputWriter : output_path OutputPath
FileOutputWriter : +new(output_dir: PathBuf) -> Self FileOutputWriter : +new(output_dir PathBuf) -] Self
FileOutputWriter : +single_file(path: PathBuf) -> Self FileOutputWriter : +single_file(path PathBuf) -] Self
<<private>> OutputPath <<private>> OutputPath
StdoutOutputWriter : +new() -> Self StdoutOutputWriter : +new() -] Self
<<private>> RawRules <<private>> RawRules
RawRules : allow: Vec RawRules : allow Vec
RawRules : deny: Vec RawRules : deny Vec
<<private>> RawConfig <<private>> RawConfig
RawConfig : analysis: RawAnalysis RawConfig : analysis RawAnalysis
RawConfig : output: RawOutput RawConfig : output RawOutput
RawConfig : modules: HashMap RawConfig : modules HashMap
RawConfig : rules: RawRules RawConfig : rules RawRules
<<private>> RawAnalysis <<private>> RawAnalysis
RawAnalysis : exclude: Vec RawAnalysis : exclude Vec
RawAnalysis : level: Option RawAnalysis : level Option
<<private>> RawOutput <<private>> RawOutput
RawOutput : format: Option RawOutput : format Option
RawOutput : path: Option RawOutput : path Option
RawOutput : split_by_module: bool RawOutput : split_by_module bool
TomlConfigLoader : raw: RawConfig TomlConfigLoader : raw RawConfig
TomlConfigLoader : +from_path(path: &Path) -> Result<Self, DomainError> TomlConfigLoader : +from_path(path Path) -] Result[Self, DomainError]
TomlConfigLoader : -parse_level(level: &Option<String>) -> DiagramLevel TomlConfigLoader : -parse_level(level Option[String]) -] DiagramLevel
D2Renderer : level: DiagramLevel D2Renderer : level DiagramLevel
D2Renderer : +new() -> Self D2Renderer : +new() -] Self
D2Renderer : +with_level(level: DiagramLevel) -> Self D2Renderer : +with_level(level DiagramLevel) -] Self
HtmlRenderer : +new() -> Self HtmlRenderer : +new() -] Self
<<private>> GraphData <<private>> GraphData
GraphData : nodes: Vec GraphData : nodes Vec
GraphData : edges: Vec GraphData : edges Vec
<<private>> NodeData <<private>> NodeData
NodeData : id: String NodeData : id String
NodeData : label: String NodeData : label String
NodeData : module: String NodeData : module String
NodeData : kind: String NodeData : kind String
NodeData : fields: Vec NodeData : fields Vec
NodeData : methods: Vec NodeData : methods Vec
<<private>> EdgeData <<private>> EdgeData
EdgeData : source: String EdgeData : source String
EdgeData : target: String EdgeData : target String
EdgeData : kind: String EdgeData : kind String
CargoWorkspaceAnalyzer : +new() -> Self CargoWorkspaceAnalyzer : +new() -] Self
<<private>> WorkspaceToml <<private>> WorkspaceToml
WorkspaceToml : workspace: Option WorkspaceToml : workspace Option
<<private>> WorkspaceSection <<private>> WorkspaceSection
WorkspaceSection : members: Vec WorkspaceSection : members Vec
<<private>> MemberToml <<private>> MemberToml
MemberToml : package: Option MemberToml : package Option
MemberToml : dependencies: HashMap MemberToml : dependencies HashMap
<<private>> PackageSection <<private>> PackageSection
PackageSection : name: String PackageSection : name String
ToolSection --> PoetrySection ToolSection --> PoetrySection
PyprojectToml --> ToolSection PyprojectToml --> ToolSection
TreeSitterAnalyzer --> RustExtractor TreeSitterAnalyzer --> RustExtractor

View File

@@ -3,14 +3,14 @@ classDiagram
class AnalyzeCodebase class AnalyzeCodebase
class AnalyzeCodebaseResult class AnalyzeCodebaseResult
} }
AnalyzeCodebase : file_discovery: F AnalyzeCodebase : file_discovery F
AnalyzeCodebase : source_analyzer: S AnalyzeCodebase : source_analyzer S
AnalyzeCodebase : +new(file_discovery: F, source_analyzer: S) -> Self AnalyzeCodebase : +new(file_discovery F, source_analyzer S) -] Self
AnalyzeCodebase : +execute(root: &Path, config: &AnalysisConfig) -> Result<AnalyzeCodebaseResult, DomainError> AnalyzeCodebase : +execute(root Path, config AnalysisConfig) -] Result[AnalyzeCodebaseResult, DomainError]
AnalyzeCodebaseResult : graph: CodeGraph AnalyzeCodebaseResult : graph CodeGraph
AnalyzeCodebaseResult : warnings: Vec AnalyzeCodebaseResult : warnings Vec
AnalyzeCodebaseResult : +graph() -> &CodeGraph AnalyzeCodebaseResult : +graph() -] CodeGraph
AnalyzeCodebaseResult : +warnings() -> &[AnalysisWarning] AnalyzeCodebaseResult : +warnings() -] [AnalysisWarning]
class application_module["Application"] { class application_module["Application"] {
<<module>> <<module>>
} }

View File

@@ -28,135 +28,135 @@ classDiagram
class CodeGraph class CodeGraph
class DomainError class DomainError
} }
OutputConfig : split_by_module: bool OutputConfig : split_by_module bool
OutputConfig : output_path: Option OutputConfig : output_path Option
OutputConfig : +with_split_by_module(split: bool) -> Self OutputConfig : +with_split_by_module(split bool) -] Self
OutputConfig : +with_output_path(path: String) -> Self OutputConfig : +with_output_path(path String) -] Self
OutputConfig : +split_by_module() -> bool OutputConfig : +split_by_module() -] bool
OutputConfig : +output_path() -> Option<&str> OutputConfig : +output_path() -] Option[str]
RenderOutput : files: Vec RenderOutput : files Vec
RenderOutput : +new(files: Vec<RenderedFile>) -> Self RenderOutput : +new(files Vec[RenderedFile]) -] Self
RenderOutput : +single(file: RenderedFile) -> Self RenderOutput : +single(file RenderedFile) -] Self
RenderOutput : +files() -> &[RenderedFile] RenderOutput : +files() -] [RenderedFile]
RenderedFile : name: String RenderedFile : name String
RenderedFile : content: String RenderedFile : content String
RenderedFile : +new(name: &str, content: &str) -> Result<Self, DomainError> RenderedFile : +new(name str, content str) -] Result[Self, DomainError]
RenderedFile : +name() -> &str RenderedFile : +name() -] str
RenderedFile : +content() -> &str RenderedFile : +content() -] str
SourceFile : path: FilePath SourceFile : path FilePath
SourceFile : language: Language SourceFile : language Language
SourceFile : +new(path: FilePath, language: Language) -> Self SourceFile : +new(path FilePath, language Language) -] Self
SourceFile : +path() -> &FilePath SourceFile : +path() -] FilePath
SourceFile : +language() -> Language SourceFile : +language() -] Language
ModuleName : +new(value: &str) -> Result<Self, DomainError> ModuleName : +new(value str) -] Result[Self, DomainError]
ModuleName : +from_path(file_path: &str, root: &Path, module_mappings: &HashMap<String, String>) -> Option<Self> 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 : +from_directory_group(member_path str) -] Option[Self]
ModuleName : +capitalize(s: &str) -> String ModuleName : +capitalize(s str) -] String
ModuleName : +as_str() -> &str ModuleName : +as_str() -] str
Language : +name() -> &'static str Language : +name() -] static str
FilePath : +new(value: &str) -> Result<Self, DomainError> FilePath : +new(value str) -] Result[Self, DomainError]
FilePath : +as_str() -> &str FilePath : +as_str() -] str
RuleViolation : source_module: String RuleViolation : source_module String
RuleViolation : target_module: String RuleViolation : target_module String
RuleViolation : kind: RuleKind RuleViolation : kind RuleKind
RuleViolation : +new(source_module: &str, target_module: &str, kind: RuleKind) -> Self RuleViolation : +new(source_module str, target_module str, kind RuleKind) -] Self
RuleViolation : +source_module() -> &str RuleViolation : +source_module() -] str
RuleViolation : +target_module() -> &str RuleViolation : +target_module() -] str
RuleViolation : +kind() -> &RuleKind RuleViolation : +kind() -] RuleKind
RuleViolation : +message() -> String RuleViolation : +message() -] String
BoundaryRule : source: String BoundaryRule : source String
BoundaryRule : target: String BoundaryRule : target String
BoundaryRule : +parse(s: &str) -> Option<Self> BoundaryRule : +parse(s str) -] Option[Self]
BoundaryRule : +source() -> &str BoundaryRule : +source() -] str
BoundaryRule : +target() -> &str BoundaryRule : +target() -] str
BoundaryRule : +matches(src_module: &str, tgt_module: &str) -> bool BoundaryRule : +matches(src_module str, tgt_module str) -] bool
AnalysisConfig : excludes: Vec AnalysisConfig : excludes Vec
AnalysisConfig : level: DiagramLevel AnalysisConfig : level DiagramLevel
AnalysisConfig : module_mappings: HashMap AnalysisConfig : module_mappings HashMap
AnalysisConfig : scope: Option AnalysisConfig : scope Option
AnalysisConfig : include_tests: bool AnalysisConfig : include_tests bool
AnalysisConfig : changed_files: Option AnalysisConfig : changed_files Option
AnalysisConfig : +with_excludes(excludes: Vec<String>) -> Self AnalysisConfig : +with_excludes(excludes Vec[String]) -] Self
AnalysisConfig : +with_level(level: DiagramLevel) -> Self AnalysisConfig : +with_level(level DiagramLevel) -] Self
AnalysisConfig : +with_module_mappings(mappings: HashMap<String, String>) -> Self AnalysisConfig : +with_module_mappings(mappings HashMap[String, String]) -] Self
AnalysisConfig : +excludes() -> &[String] AnalysisConfig : +excludes() -] [String]
AnalysisConfig : +level() -> DiagramLevel AnalysisConfig : +level() -] DiagramLevel
AnalysisConfig : +with_scope(scope: String) -> Self AnalysisConfig : +with_scope(scope String) -] Self
AnalysisConfig : +module_mappings() -> &HashMap<String, String> AnalysisConfig : +module_mappings() -] HashMap[String, String]
AnalysisConfig : +scope() -> Option<&str> AnalysisConfig : +scope() -] Option[str]
AnalysisConfig : +with_include_tests(include: bool) -> Self AnalysisConfig : +with_include_tests(include bool) -] Self
AnalysisConfig : +include_tests() -> bool AnalysisConfig : +include_tests() -] bool
AnalysisConfig : +with_changed_files(files: HashSet<String>) -> Self AnalysisConfig : +with_changed_files(files HashSet[String]) -] Self
AnalysisConfig : +changed_files() -> Option<&HashSet<String>> AnalysisConfig : +changed_files() -] Option[HashSet[String]]
AnalysisResult : elements: Vec AnalysisResult : elements Vec
AnalysisResult : relationships: Vec AnalysisResult : relationships Vec
AnalysisResult : warnings: Vec AnalysisResult : warnings Vec
AnalysisResult : +new(elements: Vec<CodeElement>, relationships: Vec<Relationship>, warnings: Vec<AnalysisWarning>) -> Self AnalysisResult : +new(elements Vec[CodeElement], relationships Vec[Relationship], warnings Vec[AnalysisWarning]) -] Self
AnalysisResult : +empty() -> Self AnalysisResult : +empty() -] Self
AnalysisResult : +elements() -> &[CodeElement] AnalysisResult : +elements() -] [CodeElement]
AnalysisResult : +relationships() -> &[Relationship] AnalysisResult : +relationships() -] [Relationship]
AnalysisResult : +warnings() -> &[AnalysisWarning] AnalysisResult : +warnings() -] [AnalysisWarning]
AnalysisWarning : file_path: FilePath AnalysisWarning : file_path FilePath
AnalysisWarning : line: usize AnalysisWarning : line usize
AnalysisWarning : message: String AnalysisWarning : message String
AnalysisWarning : +new(file_path: FilePath, line: usize, message: &str) -> Result<Self, DomainError> AnalysisWarning : +new(file_path FilePath, line usize, message str) -] Result[Self, DomainError]
AnalysisWarning : +file_path() -> &FilePath AnalysisWarning : +file_path() -] FilePath
AnalysisWarning : +line() -> usize AnalysisWarning : +line() -] usize
AnalysisWarning : +message() -> &str AnalysisWarning : +message() -] str
Relationship : source: String Relationship : source String
Relationship : target: String Relationship : target String
Relationship : kind: RelationshipKind Relationship : kind RelationshipKind
Relationship : source_file: Option Relationship : source_file Option
Relationship : +new(source: &str, target: &str, kind: RelationshipKind) -> Result<Self, DomainError> Relationship : +new(source str, target str, kind RelationshipKind) -] Result[Self, DomainError]
Relationship : +with_source_file(file: FilePath) -> Self Relationship : +with_source_file(file FilePath) -] Self
Relationship : +source() -> &str Relationship : +source() -] str
Relationship : +target() -> &str Relationship : +target() -] str
Relationship : +kind() -> RelationshipKind Relationship : +kind() -] RelationshipKind
Relationship : +source_file() -> Option<&FilePath> Relationship : +source_file() -] Option[FilePath]
CodeElement : name: String CodeElement : name String
CodeElement : qualified_name: Option CodeElement : qualified_name Option
CodeElement : kind: CodeElementKind CodeElement : kind CodeElementKind
CodeElement : file_path: FilePath CodeElement : file_path FilePath
CodeElement : line: usize CodeElement : line usize
CodeElement : visibility: Visibility CodeElement : visibility Visibility
CodeElement : module: Option CodeElement : module Option
CodeElement : generics: Vec CodeElement : generics Vec
CodeElement : attributes: Vec CodeElement : attributes Vec
CodeElement : fields: Vec CodeElement : fields Vec
CodeElement : methods: Vec CodeElement : methods Vec
CodeElement : +new(name: &str, kind: CodeElementKind, file_path: FilePath, line: usize) -> Result<Self, DomainError> CodeElement : +new(name str, kind CodeElementKind, file_path FilePath, line usize) -] Result[Self, DomainError]
CodeElement : +with_visibility(visibility: Visibility) -> Self CodeElement : +with_visibility(visibility Visibility) -] Self
CodeElement : +with_module(module: ModuleName) -> Self CodeElement : +with_module(module ModuleName) -] Self
CodeElement : +with_generics(generics: Vec<String>) -> Self CodeElement : +with_generics(generics Vec[String]) -] Self
CodeElement : +with_attributes(attributes: Vec<String>) -> Self CodeElement : +with_attributes(attributes Vec[String]) -] Self
CodeElement : +with_qualified_name(qn: String) -> Self CodeElement : +with_qualified_name(qn String) -] Self
CodeElement : +name() -> &str CodeElement : +name() -] str
CodeElement : +qualified_name() -> &str CodeElement : +qualified_name() -] str
CodeElement : +kind() -> CodeElementKind CodeElement : +kind() -] CodeElementKind
CodeElement : +file_path() -> &FilePath CodeElement : +file_path() -] FilePath
CodeElement : +line() -> usize CodeElement : +line() -] usize
CodeElement : +visibility() -> Visibility CodeElement : +visibility() -] Visibility
CodeElement : +module() -> Option<&ModuleName> CodeElement : +module() -] Option[ModuleName]
CodeElement : +generics() -> &[String] CodeElement : +generics() -] [String]
CodeElement : +attributes() -> &[String] CodeElement : +attributes() -] [String]
CodeElement : +with_fields(fields: Vec<String>) -> Self CodeElement : +with_fields(fields Vec[String]) -] Self
CodeElement : +with_methods(methods: Vec<String>) -> Self CodeElement : +with_methods(methods Vec[String]) -] Self
CodeElement : +fields() -> &[String] CodeElement : +fields() -] [String]
CodeElement : +methods() -> &[String] CodeElement : +methods() -] [String]
CodeGraph : elements: Vec CodeGraph : elements Vec
CodeGraph : relationships: Vec CodeGraph : relationships Vec
CodeGraph : +new() -> Self CodeGraph : +new() -] Self
CodeGraph : +add_element(element: CodeElement) CodeGraph : +add_element(element CodeElement)
CodeGraph : +add_relationship(relationship: Relationship) CodeGraph : +add_relationship(relationship Relationship)
CodeGraph : +elements() -> &[CodeElement] CodeGraph : +elements() -] [CodeElement]
CodeGraph : +relationships() -> &[Relationship] CodeGraph : +relationships() -] [Relationship]
CodeGraph : +modules() -> Vec<ModuleName> CodeGraph : +modules() -] Vec[ModuleName]
CodeGraph : +elements_by_module() -> (HashMap<String, Vec<&CodeElement>>, Vec<&CodeElement>) CodeGraph : +elements_by_module() -] (HashMap[String, Vec[CodeElement]], Vec[CodeElement])
CodeGraph : +resolve_relationships() -> CodeGraph CodeGraph : +resolve_relationships() -] CodeGraph
CodeGraph : +filter_external_imports(known_modules: &HashSet<String>) -> CodeGraph CodeGraph : +filter_external_imports(known_modules HashSet[String]) -] CodeGraph
CodeGraph : +qualify() -> CodeGraph CodeGraph : +qualify() -] CodeGraph
CodeGraph : +cross_module_deps_for(module: &ModuleName) -> Vec<(ModuleName, usize)> CodeGraph : +cross_module_deps_for(module ModuleName) -] Vec[(ModuleName, usize)]
CodeGraph : +subgraph_by_module(module: &ModuleName) -> CodeGraph CodeGraph : +subgraph_by_module(module ModuleName) -] CodeGraph
SourceFile --> FilePath SourceFile --> FilePath
SourceFile --> Language SourceFile --> Language
RuleViolation --> RuleKind RuleViolation --> RuleKind

View File

@@ -1,36 +1,4 @@
classDiagram 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 { namespace Domain {
class OutputConfig class OutputConfig
class DiagramLevel class DiagramLevel
@@ -64,249 +32,281 @@ classDiagram
class AnalyzeCodebase class AnalyzeCodebase
class AnalyzeCodebaseResult 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 { namespace Presentation {
class Cli class Cli
class Command class Command
} }
MermaidRenderer : level: DiagramLevel OutputConfig : split_by_module bool
MermaidRenderer : show_weights: bool OutputConfig : output_path Option
MermaidRenderer : +new() -> Self OutputConfig : +with_split_by_module(split bool) -] Self
MermaidRenderer : +with_level(level: DiagramLevel) -> Self OutputConfig : +with_output_path(path String) -] Self
MermaidRenderer : +with_weights(show: bool) -> Self OutputConfig : +split_by_module() -] bool
MermaidRenderer : -display_name(qualified: &str) -> &str OutputConfig : +output_path() -] Option[str]
MermaidRenderer : -format_element_name(element: &CodeElement) -> String RenderOutput : files Vec
MermaidRenderer : -format_visibility(visibility: Visibility) -> &'static str RenderOutput : +new(files Vec[RenderedFile]) -] Self
MermaidRenderer : -render_class_diagram(graph: &CodeGraph) -> String RenderOutput : +single(file RenderedFile) -] Self
MermaidRenderer : -push_class_lines(lines: &mut Vec<String>, deferred: &mut Vec<String>, element: &CodeElement, indent: &str, in_namespace: bool) RenderOutput : +files() -] [RenderedFile]
MermaidRenderer : -render_module_flowchart(graph: &CodeGraph) -> String RenderedFile : name String
MermaidRenderer : -render_project_flowchart(graph: &CodeGraph) -> String RenderedFile : content String
MermaidRenderer : -sanitize_id(name: &str) -> String RenderedFile : +new(name str, content str) -] Result[Self, DomainError]
AsciiRenderer : +new() -> Self RenderedFile : +name() -] str
AsciiRenderer : -format_kind(element: &CodeElement) -> &'static str RenderedFile : +content() -] str
PythonProjectAnalyzer : +new() -> Self 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
<<private>> ProjectSection <<private>> ProjectSection
ProjectSection : name: Option ProjectSection : name Option
ProjectSection : dependencies: Vec ProjectSection : dependencies Vec
<<private>> PoetrySection <<private>> PoetrySection
PoetrySection : name: Option PoetrySection : name Option
PoetrySection : dependencies: HashMap PoetrySection : dependencies HashMap
<<private>> ToolSection <<private>> ToolSection
ToolSection : poetry: PoetrySection ToolSection : poetry PoetrySection
<<private>> PyprojectToml <<private>> PyprojectToml
PyprojectToml : project: Option PyprojectToml : project Option
PyprojectToml : tool: ToolSection PyprojectToml : tool ToolSection
WalkdirDiscovery : +new() -> Self WalkdirDiscovery : +new() -] Self
WalkdirDiscovery : -detect_language(path: &Path) -> Option<Language> WalkdirDiscovery : -detect_language(path Path) -] Option[Language]
WalkdirDiscovery : -is_test_file(path: &Path, language: Language) -> bool WalkdirDiscovery : -is_test_file(path Path, language Language) -] bool
WalkdirDiscovery : -is_excluded(path: &Path, root: &Path, excludes: &[String]) -> bool WalkdirDiscovery : -is_excluded(path Path, root Path, excludes [String]) -] bool
TreeSitterAnalyzer : rust: RustExtractor TreeSitterAnalyzer : rust RustExtractor
TreeSitterAnalyzer : python: PythonExtractor TreeSitterAnalyzer : python PythonExtractor
TreeSitterAnalyzer : +new() -> Self TreeSitterAnalyzer : +new() -] Self
TreeSitterAnalyzer : -extractor_for(language: Language) -> Option<&dyn LanguageExtractor> TreeSitterAnalyzer : -extractor_for(language Language) -] Option[dyn LanguageExtractor]
FileOutputWriter : output_path: OutputPath FileOutputWriter : output_path OutputPath
FileOutputWriter : +new(output_dir: PathBuf) -> Self FileOutputWriter : +new(output_dir PathBuf) -] Self
FileOutputWriter : +single_file(path: PathBuf) -> Self FileOutputWriter : +single_file(path PathBuf) -] Self
<<private>> OutputPath <<private>> OutputPath
StdoutOutputWriter : +new() -> Self StdoutOutputWriter : +new() -] Self
<<private>> RawRules <<private>> RawRules
RawRules : allow: Vec RawRules : allow Vec
RawRules : deny: Vec RawRules : deny Vec
<<private>> RawConfig <<private>> RawConfig
RawConfig : analysis: RawAnalysis RawConfig : analysis RawAnalysis
RawConfig : output: RawOutput RawConfig : output RawOutput
RawConfig : modules: HashMap RawConfig : modules HashMap
RawConfig : rules: RawRules RawConfig : rules RawRules
<<private>> RawAnalysis <<private>> RawAnalysis
RawAnalysis : exclude: Vec RawAnalysis : exclude Vec
RawAnalysis : level: Option RawAnalysis : level Option
<<private>> RawOutput <<private>> RawOutput
RawOutput : format: Option RawOutput : format Option
RawOutput : path: Option RawOutput : path Option
RawOutput : split_by_module: bool RawOutput : split_by_module bool
TomlConfigLoader : raw: RawConfig TomlConfigLoader : raw RawConfig
TomlConfigLoader : +from_path(path: &Path) -> Result<Self, DomainError> TomlConfigLoader : +from_path(path Path) -] Result[Self, DomainError]
TomlConfigLoader : -parse_level(level: &Option<String>) -> DiagramLevel TomlConfigLoader : -parse_level(level Option[String]) -] DiagramLevel
D2Renderer : level: DiagramLevel D2Renderer : level DiagramLevel
D2Renderer : +new() -> Self D2Renderer : +new() -] Self
D2Renderer : +with_level(level: DiagramLevel) -> Self D2Renderer : +with_level(level DiagramLevel) -] Self
HtmlRenderer : +new() -> Self HtmlRenderer : +new() -] Self
<<private>> GraphData <<private>> GraphData
GraphData : nodes: Vec GraphData : nodes Vec
GraphData : edges: Vec GraphData : edges Vec
<<private>> NodeData <<private>> NodeData
NodeData : id: String NodeData : id String
NodeData : label: String NodeData : label String
NodeData : module: String NodeData : module String
NodeData : kind: String NodeData : kind String
NodeData : fields: Vec NodeData : fields Vec
NodeData : methods: Vec NodeData : methods Vec
<<private>> EdgeData <<private>> EdgeData
EdgeData : source: String EdgeData : source String
EdgeData : target: String EdgeData : target String
EdgeData : kind: String EdgeData : kind String
CargoWorkspaceAnalyzer : +new() -> Self CargoWorkspaceAnalyzer : +new() -] Self
<<private>> WorkspaceToml <<private>> WorkspaceToml
WorkspaceToml : workspace: Option WorkspaceToml : workspace Option
<<private>> WorkspaceSection <<private>> WorkspaceSection
WorkspaceSection : members: Vec WorkspaceSection : members Vec
<<private>> MemberToml <<private>> MemberToml
MemberToml : package: Option MemberToml : package Option
MemberToml : dependencies: HashMap MemberToml : dependencies HashMap
<<private>> PackageSection <<private>> PackageSection
PackageSection : name: String PackageSection : name String
OutputConfig : split_by_module: bool Cli : command Option
OutputConfig : output_path: Option Cli : path PathBuf
OutputConfig : +with_split_by_module(split: bool) -> Self Cli : level String
OutputConfig : +with_output_path(path: String) -> Self Cli : format String
OutputConfig : +split_by_module() -> bool Cli : output Option
OutputConfig : +output_path() -> Option<&str> Cli : config Option
RenderOutput : files: Vec Cli : scope Option
RenderOutput : +new(files: Vec<RenderedFile>) -> Self Cli : exclude Vec
RenderOutput : +single(file: RenderedFile) -> Self Cli : include_tests bool
RenderOutput : +files() -> &[RenderedFile] Cli : no_weights bool
RenderedFile : name: String Cli : watch bool
RenderedFile : content: String Cli : since Option
RenderedFile : +new(name: &str, content: &str) -> Result<Self, DomainError> Cli : split_by_module bool
RenderedFile : +name() -> &str Cli : strict bool
RenderedFile : +content() -> &str Cli : check bool
SourceFile : path: FilePath Cli : verbose u8
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]
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 --> FilePath
SourceFile --> Language SourceFile --> Language
RuleViolation --> RuleKind RuleViolation --> RuleKind

View File

@@ -3,19 +3,19 @@ classDiagram
class Cli class Cli
class Command class Command
} }
Cli : command: Option Cli : command Option
Cli : path: PathBuf Cli : path PathBuf
Cli : level: String Cli : level String
Cli : format: String Cli : format String
Cli : output: Option Cli : output Option
Cli : config: Option Cli : config Option
Cli : scope: Option Cli : scope Option
Cli : exclude: Vec Cli : exclude Vec
Cli : include_tests: bool Cli : include_tests bool
Cli : no_weights: bool Cli : no_weights bool
Cli : watch: bool Cli : watch bool
Cli : since: Option Cli : since Option
Cli : split_by_module: bool Cli : split_by_module bool
Cli : strict: bool Cli : strict bool
Cli : check: bool Cli : check bool
Cli : verbose: u8 Cli : verbose u8