diff --git a/docs/architecture/module.mmd b/docs/architecture/module.mmd index 5047c45..1ef0cf5 100644 --- a/docs/architecture/module.mmd +++ b/docs/architecture/module.mmd @@ -1,10 +1,10 @@ graph TD - Adapters[Adapters] - Application[Application] Domain[Domain] + Adapters[Adapters] Presentation[Presentation] - Presentation --> Application - Application --> Domain - Presentation --> Adapters - Adapters --> Domain - Presentation --> Domain \ No newline at end of file + Application[Application] + Adapters --|"24 deps"| Domain + Presentation --|"1 dep"| Application + Application --|"2 deps"| Domain + Presentation --|"11 deps"| Adapters + Presentation --|"1 dep"| Domain \ No newline at end of file diff --git a/docs/architecture/project.mmd b/docs/architecture/project.mmd index 36e10b2..d8c80cc 100644 --- a/docs/architecture/project.mmd +++ b/docs/architecture/project.mmd @@ -11,18 +11,24 @@ graph TD archlens_stdout_writer[archlens-stdout-writer] archlens_toml_config[archlens-toml-config] archlens_cargo_workspace[archlens-cargo-workspace] + archlens_python_project[archlens-python-project] + archlens_d2[archlens-d2] + archlens_html[archlens-html] end archlens_application --> archlens_domain - archlens --> archlens_cargo_workspace - archlens --> archlens_walkdir - archlens --> archlens_ascii - archlens --> archlens_application - archlens --> archlens_domain archlens --> archlens_tree_sitter - archlens --> archlens_mermaid - archlens --> archlens_file_writer - archlens --> archlens_stdout_writer + archlens --> archlens_application archlens --> archlens_toml_config + archlens --> archlens_file_writer + archlens --> archlens_ascii + archlens --> archlens_html + archlens --> archlens_walkdir + archlens --> archlens_d2 + archlens --> archlens_stdout_writer + archlens --> archlens_domain + archlens --> archlens_python_project + archlens --> archlens_mermaid + archlens --> archlens_cargo_workspace archlens_tree_sitter --> archlens_domain archlens_walkdir --> archlens_domain archlens_mermaid --> archlens_domain @@ -30,4 +36,7 @@ graph TD archlens_file_writer --> archlens_domain archlens_stdout_writer --> archlens_domain archlens_toml_config --> archlens_domain - archlens_cargo_workspace --> archlens_domain \ No newline at end of file + archlens_cargo_workspace --> archlens_domain + archlens_python_project --> archlens_domain + archlens_d2 --> archlens_domain + archlens_html --> archlens_domain \ No newline at end of file diff --git a/docs/architecture/type/adapters.mmd b/docs/architecture/type/adapters.mmd index 11c0d57..b254fdb 100644 --- a/docs/architecture/type/adapters.mmd +++ b/docs/architecture/type/adapters.mmd @@ -2,6 +2,11 @@ classDiagram namespace Adapters { class MermaidRenderer class AsciiRenderer + class PythonProjectAnalyzer + class ProjectSection + class PoetrySection + class ToolSection + class PyprojectToml class WalkdirDiscovery class TreeSitterAnalyzer class LanguageExtractor @@ -10,10 +15,16 @@ classDiagram 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 @@ -21,33 +32,53 @@ classDiagram class PackageSection } MermaidRenderer : level: DiagramLevel - MermaidRenderer : +new() - MermaidRenderer : +with_level() - MermaidRenderer : -format_element_name() - MermaidRenderer : -format_visibility() - MermaidRenderer : -render_class_diagram() - MermaidRenderer : -push_class_lines() - MermaidRenderer : -render_module_flowchart() - MermaidRenderer : -render_project_flowchart() - MermaidRenderer : -sanitize_id() - AsciiRenderer : +new() - AsciiRenderer : -format_kind() - WalkdirDiscovery : +new() - WalkdirDiscovery : -detect_language() - WalkdirDiscovery : -is_excluded() + 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 + <> ProjectSection + ProjectSection : name: Option + ProjectSection : dependencies: Vec + <> PoetrySection + PoetrySection : name: Option + PoetrySection : dependencies: HashMap + <> ToolSection + 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() - TreeSitterAnalyzer : -extractor_for() + TreeSitterAnalyzer : +new() -> Self + TreeSitterAnalyzer : -extractor_for(language: Language) -> Option<&dyn LanguageExtractor> FileOutputWriter : output_path: OutputPath - FileOutputWriter : +new() - FileOutputWriter : +single_file() + FileOutputWriter : +new(output_dir: PathBuf) -> Self + FileOutputWriter : +single_file(path: PathBuf) -> Self <> OutputPath - StdoutOutputWriter : +new() + StdoutOutputWriter : +new() -> Self + <> RawRules + RawRules : allow: Vec + RawRules : deny: Vec <> RawConfig RawConfig : analysis: RawAnalysis RawConfig : output: RawOutput RawConfig : modules: HashMap + RawConfig : rules: RawRules <> RawAnalysis RawAnalysis : exclude: Vec RawAnalysis : level: Option @@ -56,9 +87,27 @@ classDiagram RawOutput : path: Option RawOutput : split_by_module: bool TomlConfigLoader : raw: RawConfig - TomlConfigLoader : +from_path() - TomlConfigLoader : -parse_level() - CargoWorkspaceAnalyzer : +new() + 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 + <> GraphData + 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 + <> EdgeData + EdgeData : source: String + EdgeData : target: String + EdgeData : kind: String + CargoWorkspaceAnalyzer : +new() -> Self <> WorkspaceToml WorkspaceToml : workspace: Option <> WorkspaceSection @@ -68,6 +117,8 @@ classDiagram MemberToml : dependencies: HashMap <> PackageSection PackageSection : name: String + ToolSection --> PoetrySection + PyprojectToml --> ToolSection TreeSitterAnalyzer --> RustExtractor TreeSitterAnalyzer --> PythonExtractor RustExtractor <|-- LanguageExtractor @@ -75,4 +126,12 @@ classDiagram FileOutputWriter --> OutputPath RawConfig --> RawAnalysis RawConfig --> RawOutput - TomlConfigLoader --> RawConfig \ No newline at end of file + RawConfig --> RawRules + TomlConfigLoader --> RawConfig + class adapters_module["Adapters"] { + <> + } + class domain_module["Domain"] { + <> + } + adapters_module --> domain_module : 13 deps \ No newline at end of file diff --git a/docs/architecture/type/application.mmd b/docs/architecture/type/application.mmd index b1ca6e5..6c6c07a 100644 --- a/docs/architecture/type/application.mmd +++ b/docs/architecture/type/application.mmd @@ -2,29 +2,19 @@ classDiagram namespace Application { class AnalyzeCodebase class AnalyzeCodebaseResult - class FakeFileDiscovery - class FakeOutputWriter - class FakeDiagramRenderer - class FakeResponse - class FakeSourceAnalyzer } AnalyzeCodebase : file_discovery: F AnalyzeCodebase : source_analyzer: S - AnalyzeCodebase : +new() - AnalyzeCodebase : +execute() + AnalyzeCodebase : +new(file_discovery: F, source_analyzer: S) -> Self + AnalyzeCodebase : +execute(root: &Path, config: &AnalysisConfig) -> Result AnalyzeCodebaseResult : graph: CodeGraph AnalyzeCodebaseResult : warnings: Vec - AnalyzeCodebaseResult : +graph() - AnalyzeCodebaseResult : +warnings() - FakeFileDiscovery : files: Vec - FakeFileDiscovery : +new() - FakeFileDiscovery : +empty() - FakeOutputWriter : written: RefCell - FakeOutputWriter : +new() - FakeOutputWriter : +written_outputs() - FakeDiagramRenderer : +new() - <> FakeResponse - FakeSourceAnalyzer : results: HashMap - FakeSourceAnalyzer : +new() - FakeSourceAnalyzer : +with_result() - FakeSourceAnalyzer : +with_error() \ No newline at end of file + AnalyzeCodebaseResult : +graph() -> &CodeGraph + AnalyzeCodebaseResult : +warnings() -> &[AnalysisWarning] + class application_module["Application"] { + <> + } + class domain_module["Domain"] { + <> + } + application_module --> domain_module : 1 dep \ No newline at end of file diff --git a/docs/architecture/type/domain.mmd b/docs/architecture/type/domain.mmd index ae718a7..d874ae6 100644 --- a/docs/architecture/type/domain.mmd +++ b/docs/architecture/type/domain.mmd @@ -11,6 +11,9 @@ classDiagram class RelationshipKind class Visibility class CodeElementKind + class RuleKind + class RuleViolation + class BoundaryRule class AnalysisConfig class AnalysisResult class AnalysisWarning @@ -27,70 +30,91 @@ classDiagram } OutputConfig : split_by_module: bool OutputConfig : output_path: Option - OutputConfig : +with_split_by_module() - OutputConfig : +with_output_path() - OutputConfig : +split_by_module() - OutputConfig : +output_path() + 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() - RenderOutput : +single() - RenderOutput : +files() + RenderOutput : +new(files: Vec) -> Self + RenderOutput : +single(file: RenderedFile) -> Self + RenderOutput : +files() -> &[RenderedFile] RenderedFile : name: String RenderedFile : content: String - RenderedFile : +new() - RenderedFile : +name() - RenderedFile : +content() + RenderedFile : +new(name: &str, content: &str) -> Result + RenderedFile : +name() -> &str + RenderedFile : +content() -> &str SourceFile : path: FilePath SourceFile : language: Language - SourceFile : +new() - SourceFile : +path() - SourceFile : +language() - ModuleName : +new() - ModuleName : +from_path() - ModuleName : +from_directory_group() - ModuleName : +capitalize() - ModuleName : +as_str() - Language : +name() - FilePath : +new() - FilePath : +as_str() + 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 : +with_excludes() - AnalysisConfig : +with_level() - AnalysisConfig : +with_module_mappings() - AnalysisConfig : +excludes() - AnalysisConfig : +level() - AnalysisConfig : +with_scope() - AnalysisConfig : +module_mappings() - AnalysisConfig : +scope() + 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() - AnalysisResult : +empty() - AnalysisResult : +elements() - AnalysisResult : +relationships() - AnalysisResult : +warnings() + 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() - AnalysisWarning : +file_path() - AnalysisWarning : +line() - AnalysisWarning : +message() + 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() - Relationship : +with_source_file() - Relationship : +source() - Relationship : +target() - Relationship : +kind() - Relationship : +source_file() + 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 @@ -100,37 +124,42 @@ classDiagram CodeElement : attributes: Vec CodeElement : fields: Vec CodeElement : methods: Vec - CodeElement : +new() - CodeElement : +with_visibility() - CodeElement : +with_module() - CodeElement : +with_generics() - CodeElement : +with_attributes() - CodeElement : +name() - CodeElement : +kind() - CodeElement : +file_path() - CodeElement : +line() - CodeElement : +visibility() - CodeElement : +module() - CodeElement : +generics() - CodeElement : +attributes() - CodeElement : +with_fields() - CodeElement : +with_methods() - CodeElement : +fields() - CodeElement : +methods() + 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() - CodeGraph : +add_element() - CodeGraph : +add_relationship() - CodeGraph : +elements() - CodeGraph : +relationships() - CodeGraph : +modules() - CodeGraph : +elements_by_module() - CodeGraph : +resolve_relationships() - CodeGraph : +filter_external_imports() - CodeGraph : +subgraph_by_module() + 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 SourceFile --> FilePath SourceFile --> Language + RuleViolation --> RuleKind AnalysisConfig --> DiagramLevel AnalysisWarning --> FilePath Relationship --> RelationshipKind diff --git a/docs/architecture/type/overview.mmd b/docs/architecture/type/overview.mmd index 39a650c..6576150 100644 --- a/docs/architecture/type/overview.mmd +++ b/docs/architecture/type/overview.mmd @@ -1,4 +1,36 @@ 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 @@ -11,6 +43,9 @@ classDiagram class RelationshipKind class Visibility class CodeElementKind + class RuleKind + class RuleViolation + class BoundaryRule class AnalysisConfig class AnalysisResult class AnalysisWarning @@ -28,189 +63,59 @@ classDiagram namespace Application { class AnalyzeCodebase class AnalyzeCodebaseResult - class FakeFileDiscovery - class FakeOutputWriter - class FakeDiagramRenderer - class FakeResponse - class FakeSourceAnalyzer - } - namespace Adapters { - class MermaidRenderer - class AsciiRenderer - class WalkdirDiscovery - class TreeSitterAnalyzer - class LanguageExtractor - class RustExtractor - class PythonExtractor - class FileOutputWriter - class OutputPath - class StdoutOutputWriter - class RawConfig - class RawAnalysis - class RawOutput - class TomlConfigLoader - class CargoWorkspaceAnalyzer - class WorkspaceToml - class WorkspaceSection - class MemberToml - class PackageSection } namespace Presentation { class Cli class Command } - OutputConfig : split_by_module: bool - OutputConfig : output_path: Option - OutputConfig : +with_split_by_module() - OutputConfig : +with_output_path() - OutputConfig : +split_by_module() - OutputConfig : +output_path() - RenderOutput : files: Vec - RenderOutput : +new() - RenderOutput : +single() - RenderOutput : +files() - RenderedFile : name: String - RenderedFile : content: String - RenderedFile : +new() - RenderedFile : +name() - RenderedFile : +content() - SourceFile : path: FilePath - SourceFile : language: Language - SourceFile : +new() - SourceFile : +path() - SourceFile : +language() - ModuleName : +new() - ModuleName : +from_path() - ModuleName : +from_directory_group() - ModuleName : +capitalize() - ModuleName : +as_str() - Language : +name() - FilePath : +new() - FilePath : +as_str() - AnalysisConfig : excludes: Vec - AnalysisConfig : level: DiagramLevel - AnalysisConfig : module_mappings: HashMap - AnalysisConfig : scope: Option - AnalysisConfig : +with_excludes() - AnalysisConfig : +with_level() - AnalysisConfig : +with_module_mappings() - AnalysisConfig : +excludes() - AnalysisConfig : +level() - AnalysisConfig : +with_scope() - AnalysisConfig : +module_mappings() - AnalysisConfig : +scope() - AnalysisResult : elements: Vec - AnalysisResult : relationships: Vec - AnalysisResult : warnings: Vec - AnalysisResult : +new() - AnalysisResult : +empty() - AnalysisResult : +elements() - AnalysisResult : +relationships() - AnalysisResult : +warnings() - AnalysisWarning : file_path: FilePath - AnalysisWarning : line: usize - AnalysisWarning : message: String - AnalysisWarning : +new() - AnalysisWarning : +file_path() - AnalysisWarning : +line() - AnalysisWarning : +message() - Relationship : source: String - Relationship : target: String - Relationship : kind: RelationshipKind - Relationship : source_file: Option - Relationship : +new() - Relationship : +with_source_file() - Relationship : +source() - Relationship : +target() - Relationship : +kind() - Relationship : +source_file() - CodeElement : name: String - 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() - CodeElement : +with_visibility() - CodeElement : +with_module() - CodeElement : +with_generics() - CodeElement : +with_attributes() - CodeElement : +name() - CodeElement : +kind() - CodeElement : +file_path() - CodeElement : +line() - CodeElement : +visibility() - CodeElement : +module() - CodeElement : +generics() - CodeElement : +attributes() - CodeElement : +with_fields() - CodeElement : +with_methods() - CodeElement : +fields() - CodeElement : +methods() - CodeGraph : elements: Vec - CodeGraph : relationships: Vec - CodeGraph : +new() - CodeGraph : +add_element() - CodeGraph : +add_relationship() - CodeGraph : +elements() - CodeGraph : +relationships() - CodeGraph : +modules() - CodeGraph : +elements_by_module() - CodeGraph : +resolve_relationships() - CodeGraph : +filter_external_imports() - CodeGraph : +subgraph_by_module() - AnalyzeCodebase : file_discovery: F - AnalyzeCodebase : source_analyzer: S - AnalyzeCodebase : +new() - AnalyzeCodebase : +execute() - AnalyzeCodebaseResult : graph: CodeGraph - AnalyzeCodebaseResult : warnings: Vec - AnalyzeCodebaseResult : +graph() - AnalyzeCodebaseResult : +warnings() - FakeFileDiscovery : files: Vec - FakeFileDiscovery : +new() - FakeFileDiscovery : +empty() - FakeOutputWriter : written: RefCell - FakeOutputWriter : +new() - FakeOutputWriter : +written_outputs() - FakeDiagramRenderer : +new() - <> FakeResponse - FakeSourceAnalyzer : results: HashMap - FakeSourceAnalyzer : +new() - FakeSourceAnalyzer : +with_result() - FakeSourceAnalyzer : +with_error() MermaidRenderer : level: DiagramLevel - MermaidRenderer : +new() - MermaidRenderer : +with_level() - MermaidRenderer : -format_element_name() - MermaidRenderer : -format_visibility() - MermaidRenderer : -render_class_diagram() - MermaidRenderer : -push_class_lines() - MermaidRenderer : -render_module_flowchart() - MermaidRenderer : -render_project_flowchart() - MermaidRenderer : -sanitize_id() - AsciiRenderer : +new() - AsciiRenderer : -format_kind() - WalkdirDiscovery : +new() - WalkdirDiscovery : -detect_language() - WalkdirDiscovery : -is_excluded() + 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 + <> ProjectSection + ProjectSection : name: Option + ProjectSection : dependencies: Vec + <> PoetrySection + PoetrySection : name: Option + PoetrySection : dependencies: HashMap + <> ToolSection + 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() - TreeSitterAnalyzer : -extractor_for() + TreeSitterAnalyzer : +new() -> Self + TreeSitterAnalyzer : -extractor_for(language: Language) -> Option<&dyn LanguageExtractor> FileOutputWriter : output_path: OutputPath - FileOutputWriter : +new() - FileOutputWriter : +single_file() + FileOutputWriter : +new(output_dir: PathBuf) -> Self + FileOutputWriter : +single_file(path: PathBuf) -> Self <> OutputPath - StdoutOutputWriter : +new() + StdoutOutputWriter : +new() -> Self + <> RawRules + RawRules : allow: Vec + RawRules : deny: Vec <> RawConfig RawConfig : analysis: RawAnalysis RawConfig : output: RawOutput RawConfig : modules: HashMap + RawConfig : rules: RawRules <> RawAnalysis RawAnalysis : exclude: Vec RawAnalysis : level: Option @@ -219,9 +124,27 @@ classDiagram RawOutput : path: Option RawOutput : split_by_module: bool TomlConfigLoader : raw: RawConfig - TomlConfigLoader : +from_path() - TomlConfigLoader : -parse_level() - CargoWorkspaceAnalyzer : +new() + 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 + <> GraphData + 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 + <> EdgeData + EdgeData : source: String + EdgeData : target: String + EdgeData : kind: String + CargoWorkspaceAnalyzer : +new() -> Self <> WorkspaceToml WorkspaceToml : workspace: Option <> WorkspaceSection @@ -231,6 +154,143 @@ classDiagram 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 @@ -239,12 +299,17 @@ classDiagram 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 AnalysisConfig --> DiagramLevel AnalysisWarning --> FilePath Relationship --> RelationshipKind @@ -254,6 +319,9 @@ classDiagram MermaidRenderer --> DiagramLevel MermaidRenderer <|-- DiagramRenderer AsciiRenderer <|-- DiagramRenderer + ToolSection --> PoetrySection + PyprojectToml --> ToolSection + PythonProjectAnalyzer <|-- ProjectAnalyzer WalkdirDiscovery <|-- FileDiscovery TreeSitterAnalyzer --> RustExtractor TreeSitterAnalyzer --> PythonExtractor @@ -265,11 +333,11 @@ classDiagram StdoutOutputWriter <|-- OutputWriter RawConfig --> RawAnalysis RawConfig --> RawOutput + RawConfig --> RawRules TomlConfigLoader --> RawConfig TomlConfigLoader <|-- ConfigLoader + D2Renderer --> DiagramLevel + D2Renderer <|-- DiagramRenderer + HtmlRenderer <|-- DiagramRenderer CargoWorkspaceAnalyzer <|-- ProjectAnalyzer - AnalyzeCodebaseResult --> CodeGraph - FakeFileDiscovery <|-- FileDiscovery - FakeOutputWriter <|-- OutputWriter - FakeDiagramRenderer <|-- DiagramRenderer - FakeSourceAnalyzer <|-- SourceAnalyzer \ No newline at end of file + AnalyzeCodebaseResult --> CodeGraph \ No newline at end of file diff --git a/docs/architecture/type/presentation.mmd b/docs/architecture/type/presentation.mmd index 53b5416..9781288 100644 --- a/docs/architecture/type/presentation.mmd +++ b/docs/architecture/type/presentation.mmd @@ -11,6 +11,10 @@ classDiagram 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