clean up
This commit is contained in:
@@ -236,7 +236,10 @@ impl DiagramRenderer for MermaidRenderer {
|
|||||||
let content = if cross_deps.is_empty() {
|
let content = if cross_deps.is_empty() {
|
||||||
base
|
base
|
||||||
} else {
|
} else {
|
||||||
let src_id = format!("{}_module", module.as_str().to_lowercase().replace('-', "_"));
|
let src_id = format!(
|
||||||
|
"{}_module",
|
||||||
|
module.as_str().to_lowercase().replace('-', "_")
|
||||||
|
);
|
||||||
let mut extra = format!(
|
let mut extra = format!(
|
||||||
" class {src_id}[\"{}\"] {{\n <<module>>\n }}\n",
|
" class {src_id}[\"{}\"] {{\n <<module>>\n }}\n",
|
||||||
module.as_str()
|
module.as_str()
|
||||||
@@ -250,7 +253,11 @@ impl DiagramRenderer for MermaidRenderer {
|
|||||||
" class {dep_id}[\"{}\"] {{\n <<module>>\n }}\n",
|
" class {dep_id}[\"{}\"] {{\n <<module>>\n }}\n",
|
||||||
dep_mod.as_str()
|
dep_mod.as_str()
|
||||||
));
|
));
|
||||||
let label = if *count == 1 { "1 dep".to_string() } else { format!("{count} deps") };
|
let label = if *count == 1 {
|
||||||
|
"1 dep".to_string()
|
||||||
|
} else {
|
||||||
|
format!("{count} deps")
|
||||||
|
};
|
||||||
extra.push_str(&format!(" {src_id} --> {dep_id} : {label}\n"));
|
extra.push_str(&format!(" {src_id} --> {dep_id} : {label}\n"));
|
||||||
}
|
}
|
||||||
format!("{base}\n{extra}")
|
format!("{base}\n{extra}")
|
||||||
|
|||||||
@@ -36,7 +36,8 @@ impl ExtractionContext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_relationship(&mut self, rel: Relationship) {
|
pub fn add_relationship(&mut self, rel: Relationship) {
|
||||||
self.relationships.push(rel.with_source_file(self.file_path.clone()));
|
self.relationships
|
||||||
|
.push(rel.with_source_file(self.file_path.clone()));
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_warning(&mut self, file_path: FilePath, line: usize, message: &str) {
|
pub fn add_warning(&mut self, file_path: FilePath, line: usize, message: &str) {
|
||||||
@@ -51,6 +52,10 @@ impl ExtractionContext {
|
|||||||
|
|
||||||
/// Consumes the context and returns the completed `AnalysisResult`.
|
/// Consumes the context and returns the completed `AnalysisResult`.
|
||||||
pub fn into_result(self) -> Result<AnalysisResult, DomainError> {
|
pub fn into_result(self) -> Result<AnalysisResult, DomainError> {
|
||||||
Ok(AnalysisResult::new(self.elements, self.relationships, self.warnings))
|
Ok(AnalysisResult::new(
|
||||||
|
self.elements,
|
||||||
|
self.relationships,
|
||||||
|
self.warnings,
|
||||||
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -303,7 +303,12 @@ fn extract_python_params(params_node: &Node, source: &str) -> String {
|
|||||||
parts.join(", ")
|
parts.join(", ")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn collect_constructor_params(body: &Node, source: &str, class_name: &str, ctx: &mut ExtractionContext) {
|
fn collect_constructor_params(
|
||||||
|
body: &Node,
|
||||||
|
source: &str,
|
||||||
|
class_name: &str,
|
||||||
|
ctx: &mut ExtractionContext,
|
||||||
|
) {
|
||||||
let mut cursor = body.walk();
|
let mut cursor = body.walk();
|
||||||
for child in body.children(&mut cursor) {
|
for child in body.children(&mut cursor) {
|
||||||
if child.kind() != "function_definition" {
|
if child.kind() != "function_definition" {
|
||||||
@@ -342,7 +347,12 @@ fn collect_typed_fields(body: &Node, source: &str, class_name: &str, ctx: &mut E
|
|||||||
collect_typed_fields_recursive(body, source, class_name, ctx);
|
collect_typed_fields_recursive(body, source, class_name, ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn collect_typed_fields_recursive(node: &Node, source: &str, class_name: &str, ctx: &mut ExtractionContext) {
|
fn collect_typed_fields_recursive(
|
||||||
|
node: &Node,
|
||||||
|
source: &str,
|
||||||
|
class_name: &str,
|
||||||
|
ctx: &mut ExtractionContext,
|
||||||
|
) {
|
||||||
let mut cursor = node.walk();
|
let mut cursor = node.walk();
|
||||||
for child in node.children(&mut cursor) {
|
for child in node.children(&mut cursor) {
|
||||||
if (child.kind() == "assignment" || child.kind() == "typed_assignment")
|
if (child.kind() == "assignment" || child.kind() == "typed_assignment")
|
||||||
|
|||||||
@@ -1,9 +1,38 @@
|
|||||||
use tree_sitter::{Node, Parser};
|
use tree_sitter::{Node, Parser};
|
||||||
|
|
||||||
const RUST_PRIMITIVES: &[&str] = &[
|
const RUST_PRIMITIVES: &[&str] = &[
|
||||||
"bool", "char", "str", "String", "u8", "u16", "u32", "u64", "u128", "usize", "i8", "i16",
|
"bool",
|
||||||
"i32", "i64", "i128", "isize", "f32", "f64", "Vec", "Option", "Result", "Box", "Rc", "Arc",
|
"char",
|
||||||
"HashMap", "HashSet", "BTreeMap", "BTreeSet", "PhantomData", "Pin", "Cow", "Self",
|
"str",
|
||||||
|
"String",
|
||||||
|
"u8",
|
||||||
|
"u16",
|
||||||
|
"u32",
|
||||||
|
"u64",
|
||||||
|
"u128",
|
||||||
|
"usize",
|
||||||
|
"i8",
|
||||||
|
"i16",
|
||||||
|
"i32",
|
||||||
|
"i64",
|
||||||
|
"i128",
|
||||||
|
"isize",
|
||||||
|
"f32",
|
||||||
|
"f64",
|
||||||
|
"Vec",
|
||||||
|
"Option",
|
||||||
|
"Result",
|
||||||
|
"Box",
|
||||||
|
"Rc",
|
||||||
|
"Arc",
|
||||||
|
"HashMap",
|
||||||
|
"HashSet",
|
||||||
|
"BTreeMap",
|
||||||
|
"BTreeSet",
|
||||||
|
"PhantomData",
|
||||||
|
"Pin",
|
||||||
|
"Cow",
|
||||||
|
"Self",
|
||||||
];
|
];
|
||||||
|
|
||||||
use archlens_domain::{
|
use archlens_domain::{
|
||||||
@@ -143,8 +172,12 @@ fn extract_fields(node: &Node, source: &str) -> Vec<String> {
|
|||||||
let mut cursor = body.walk();
|
let mut cursor = body.walk();
|
||||||
for child in body.children(&mut cursor) {
|
for child in body.children(&mut cursor) {
|
||||||
if child.kind() == "field_declaration" {
|
if child.kind() == "field_declaration" {
|
||||||
let name = child.child_by_field_name("name").map(|n| &source[n.byte_range()]);
|
let name = child
|
||||||
let ty = child.child_by_field_name("type").map(|n| extract_base_type(&n, source));
|
.child_by_field_name("name")
|
||||||
|
.map(|n| &source[n.byte_range()]);
|
||||||
|
let ty = child
|
||||||
|
.child_by_field_name("type")
|
||||||
|
.map(|n| extract_base_type(&n, source));
|
||||||
if let (Some(name), Some(ty)) = (name, ty) {
|
if let (Some(name), Some(ty)) = (name, ty) {
|
||||||
fields.push(format!("{name}: {ty}"));
|
fields.push(format!("{name}: {ty}"));
|
||||||
}
|
}
|
||||||
@@ -174,7 +207,11 @@ fn extract_methods(root: &Node, source: &str, type_name: &str) -> Vec<String> {
|
|||||||
&& let Some(name_node) = item.child_by_field_name("name")
|
&& let Some(name_node) = item.child_by_field_name("name")
|
||||||
{
|
{
|
||||||
let fn_name = &source[name_node.byte_range()];
|
let fn_name = &source[name_node.byte_range()];
|
||||||
let vis = if detect_visibility(&item, source) == Visibility::Public { "+" } else { "-" };
|
let vis = if detect_visibility(&item, source) == Visibility::Public {
|
||||||
|
"+"
|
||||||
|
} else {
|
||||||
|
"-"
|
||||||
|
};
|
||||||
let params = extract_fn_params(&item, source);
|
let params = extract_fn_params(&item, source);
|
||||||
let ret = extract_fn_return(&item, source);
|
let ret = extract_fn_return(&item, source);
|
||||||
let sig = if ret.is_empty() {
|
let sig = if ret.is_empty() {
|
||||||
@@ -258,7 +295,11 @@ fn collect_use_imports(node: &Node, source: &str, ctx: &mut ExtractionContext) {
|
|||||||
}
|
}
|
||||||
if let Some(arg) = child.child_by_field_name("argument") {
|
if let Some(arg) = child.child_by_field_name("argument") {
|
||||||
let text = &source[arg.byte_range()];
|
let text = &source[arg.byte_range()];
|
||||||
let path = text.split('{').next().unwrap_or(text).trim_end_matches("::");
|
let path = text
|
||||||
|
.split('{')
|
||||||
|
.next()
|
||||||
|
.unwrap_or(text)
|
||||||
|
.trim_end_matches("::");
|
||||||
|
|
||||||
if (path.starts_with("crate::") || path.starts_with("super::"))
|
if (path.starts_with("crate::") || path.starts_with("super::"))
|
||||||
&& let Ok(rel) = Relationship::new(&file_name, path, RelationshipKind::Import)
|
&& let Ok(rel) = Relationship::new(&file_name, path, RelationshipKind::Import)
|
||||||
|
|||||||
@@ -56,7 +56,11 @@ where
|
|||||||
el
|
el
|
||||||
})
|
})
|
||||||
.collect();
|
.collect();
|
||||||
(elements, result.relationships().to_vec(), result.warnings().to_vec())
|
(
|
||||||
|
elements,
|
||||||
|
result.relationships().to_vec(),
|
||||||
|
result.warnings().to_vec(),
|
||||||
|
)
|
||||||
}
|
}
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
let mut warnings = Vec::new();
|
let mut warnings = Vec::new();
|
||||||
|
|||||||
@@ -1,8 +1,7 @@
|
|||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
||||||
use archlens_domain::{
|
use archlens_domain::{
|
||||||
BoundaryRule, DomainError, NormalizedGraph, RenderedFile, RenderOutput,
|
BoundaryRule, DomainError, NormalizedGraph, RenderOutput, RenderedFile, check_boundary_rules,
|
||||||
check_boundary_rules,
|
|
||||||
ports::DiagramRenderer,
|
ports::DiagramRenderer,
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -72,9 +71,7 @@ pub fn write_split(
|
|||||||
output_dir: &Option<PathBuf>,
|
output_dir: &Option<PathBuf>,
|
||||||
ext: &str,
|
ext: &str,
|
||||||
) -> Result<(), DomainError> {
|
) -> Result<(), DomainError> {
|
||||||
let dir = output_dir
|
let dir = output_dir.clone().unwrap_or_else(|| PathBuf::from("."));
|
||||||
.clone()
|
|
||||||
.unwrap_or_else(|| PathBuf::from("."));
|
|
||||||
|
|
||||||
let overview = renderer.render(graph.as_graph())?;
|
let overview = renderer.render(graph.as_graph())?;
|
||||||
let overview_file = RenderedFile::new(
|
let overview_file = RenderedFile::new(
|
||||||
@@ -89,7 +86,11 @@ pub fn write_split(
|
|||||||
let module_output = renderer.render_for_module(&subgraph, &module, &cross_deps)?;
|
let module_output = renderer.render_for_module(&subgraph, &module, &cross_deps)?;
|
||||||
let module_file = RenderedFile::new(
|
let module_file = RenderedFile::new(
|
||||||
&format!("{}.{ext}", module.as_str().to_lowercase()),
|
&format!("{}.{ext}", module.as_str().to_lowercase()),
|
||||||
module_output.files().first().map(|f| f.content()).unwrap_or(""),
|
module_output
|
||||||
|
.files()
|
||||||
|
.first()
|
||||||
|
.map(|f| f.content())
|
||||||
|
.unwrap_or(""),
|
||||||
)?;
|
)?;
|
||||||
write_file_to_dir(&dir, module_file)?;
|
write_file_to_dir(&dir, module_file)?;
|
||||||
}
|
}
|
||||||
@@ -99,10 +100,8 @@ pub fn write_split(
|
|||||||
|
|
||||||
fn write_file_to_dir(dir: &PathBuf, file: RenderedFile) -> Result<(), DomainError> {
|
fn write_file_to_dir(dir: &PathBuf, file: RenderedFile) -> Result<(), DomainError> {
|
||||||
let path = dir.join(file.name());
|
let path = dir.join(file.name());
|
||||||
std::fs::create_dir_all(dir)
|
std::fs::create_dir_all(dir).map_err(|e| DomainError::IoError(e.to_string()))?;
|
||||||
.map_err(|e| DomainError::IoError(e.to_string()))?;
|
std::fs::write(&path, file.content()).map_err(|e| DomainError::IoError(e.to_string()))?;
|
||||||
std::fs::write(&path, file.content())
|
|
||||||
.map_err(|e| DomainError::IoError(e.to_string()))?;
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,11 +110,9 @@ fn write_to_output(rendered: RenderOutput, output: &Option<PathBuf>) -> Result<(
|
|||||||
match output {
|
match output {
|
||||||
Some(path) => {
|
Some(path) => {
|
||||||
if let Some(parent) = path.parent() {
|
if let Some(parent) = path.parent() {
|
||||||
std::fs::create_dir_all(parent)
|
std::fs::create_dir_all(parent).map_err(|e| DomainError::IoError(e.to_string()))?;
|
||||||
.map_err(|e| DomainError::IoError(e.to_string()))?;
|
|
||||||
}
|
}
|
||||||
std::fs::write(path, content)
|
std::fs::write(path, content).map_err(|e| DomainError::IoError(e.to_string()))
|
||||||
.map_err(|e| DomainError::IoError(e.to_string()))
|
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
print!("{content}");
|
print!("{content}");
|
||||||
|
|||||||
@@ -298,8 +298,11 @@ impl CodeGraph {
|
|||||||
crate_to_module.insert(element.name().to_string(), module);
|
crate_to_module.insert(element.name().to_string(), module);
|
||||||
}
|
}
|
||||||
|
|
||||||
let graph_modules: HashSet<String> =
|
let graph_modules: HashSet<String> = self
|
||||||
self.modules().iter().map(|m| m.as_str().to_string()).collect();
|
.modules()
|
||||||
|
.iter()
|
||||||
|
.map(|m| m.as_str().to_string())
|
||||||
|
.collect();
|
||||||
|
|
||||||
for rel in project_graph.relationships() {
|
for rel in project_graph.relationships() {
|
||||||
let src_module = crate_to_module.get(rel.source());
|
let src_module = crate_to_module.get(rel.source());
|
||||||
@@ -308,8 +311,7 @@ impl CodeGraph {
|
|||||||
&& src != tgt
|
&& src != tgt
|
||||||
&& graph_modules.contains(src)
|
&& graph_modules.contains(src)
|
||||||
&& graph_modules.contains(tgt)
|
&& graph_modules.contains(tgt)
|
||||||
&& let Ok(edge) =
|
&& let Ok(edge) = Relationship::new(src, tgt, RelationshipKind::Composition)
|
||||||
Relationship::new(src, tgt, RelationshipKind::Composition)
|
|
||||||
{
|
{
|
||||||
self.add_relationship(edge);
|
self.add_relationship(edge);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,9 +44,7 @@ impl NormalizedGraph {
|
|||||||
self.0.modules()
|
self.0.modules()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn elements_by_module(
|
pub fn elements_by_module(&self) -> (HashMap<String, Vec<&CodeElement>>, Vec<&CodeElement>) {
|
||||||
&self,
|
|
||||||
) -> (HashMap<String, Vec<&CodeElement>>, Vec<&CodeElement>) {
|
|
||||||
self.0.elements_by_module()
|
self.0.elements_by_module()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,6 @@ pub use value_objects::graph::{CodeElementKind, RelationshipKind, Visibility};
|
|||||||
pub use value_objects::output::{DiagramLevel, OutputConfig, RenderOutput, RenderedFile};
|
pub use value_objects::output::{DiagramLevel, OutputConfig, RenderOutput, RenderedFile};
|
||||||
pub use value_objects::rules::{BoundaryRule, RuleKind, RuleViolation, check_boundary_rules};
|
pub use value_objects::rules::{BoundaryRule, RuleKind, RuleViolation, check_boundary_rules};
|
||||||
pub use value_objects::source::{
|
pub use value_objects::source::{
|
||||||
FilePath, Language, ModuleAssignment, ModuleName, SourceFile,
|
FilePath, Language, ModuleAssignment, ModuleName, SourceFile, normalize_cargo_package,
|
||||||
normalize_cargo_package, normalize_python_package,
|
normalize_python_package,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -353,5 +353,8 @@ fn module_edges_excludes_intra_module_relationships() {
|
|||||||
let graph = graph.qualify();
|
let graph = graph.qualify();
|
||||||
let edges = graph.module_edges();
|
let edges = graph.module_edges();
|
||||||
|
|
||||||
assert!(edges.is_empty(), "intra-module relationships should not produce edges");
|
assert!(
|
||||||
|
edges.is_empty(),
|
||||||
|
"intra-module relationships should not produce edges"
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,7 +89,12 @@ fn merge_project_edges_ignores_crates_with_no_matching_module() {
|
|||||||
.unwrap(),
|
.unwrap(),
|
||||||
);
|
);
|
||||||
project_graph.add_relationship(
|
project_graph.add_relationship(
|
||||||
Relationship::new("external-lib", "myapp-domain", RelationshipKind::Composition).unwrap(),
|
Relationship::new(
|
||||||
|
"external-lib",
|
||||||
|
"myapp-domain",
|
||||||
|
RelationshipKind::Composition,
|
||||||
|
)
|
||||||
|
.unwrap(),
|
||||||
);
|
);
|
||||||
|
|
||||||
graph.merge_project_edges(&project_graph);
|
graph.merge_project_edges(&project_graph);
|
||||||
|
|||||||
@@ -43,13 +43,15 @@ pub fn run(args: Cli) -> Result<()> {
|
|||||||
let renderer = create_renderer(&args.format, level, !args.no_weights)?;
|
let renderer = create_renderer(&args.format, level, !args.no_weights)?;
|
||||||
|
|
||||||
if args.check {
|
if args.check {
|
||||||
let existing_path = args.output.as_ref()
|
let existing_path = args.output.as_ref().ok_or_else(|| {
|
||||||
.ok_or_else(|| anyhow::anyhow!("--check requires --output to specify the file to check against"))?;
|
anyhow::anyhow!("--check requires --output to specify the file to check against")
|
||||||
|
})?;
|
||||||
let up_to_date = CheckFreshness {
|
let up_to_date = CheckFreshness {
|
||||||
graph: &graph,
|
graph: &graph,
|
||||||
renderer: &*renderer,
|
renderer: &*renderer,
|
||||||
existing_path: std::path::Path::new(existing_path),
|
existing_path: std::path::Path::new(existing_path),
|
||||||
}.execute()?;
|
}
|
||||||
|
.execute()?;
|
||||||
if up_to_date {
|
if up_to_date {
|
||||||
println!("Architecture diagram is up to date.");
|
println!("Architecture diagram is up to date.");
|
||||||
} else {
|
} else {
|
||||||
@@ -60,8 +62,14 @@ pub fn run(args: Cli) -> Result<()> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let (raw_allow, raw_deny) = config_loader.load_rules();
|
let (raw_allow, raw_deny) = config_loader.load_rules();
|
||||||
let allow: Vec<BoundaryRule> = raw_allow.iter().filter_map(|s| BoundaryRule::parse(s)).collect();
|
let allow: Vec<BoundaryRule> = raw_allow
|
||||||
let deny: Vec<BoundaryRule> = raw_deny.iter().filter_map(|s| BoundaryRule::parse(s)).collect();
|
.iter()
|
||||||
|
.filter_map(|s| BoundaryRule::parse(s))
|
||||||
|
.collect();
|
||||||
|
let deny: Vec<BoundaryRule> = raw_deny
|
||||||
|
.iter()
|
||||||
|
.filter_map(|s| BoundaryRule::parse(s))
|
||||||
|
.collect();
|
||||||
let output_dir = args.output.as_ref().map(std::path::PathBuf::from);
|
let output_dir = args.output.as_ref().map(std::path::PathBuf::from);
|
||||||
|
|
||||||
let use_case = GenerateDiagram {
|
let use_case = GenerateDiagram {
|
||||||
@@ -76,7 +84,10 @@ pub fn run(args: Cli) -> Result<()> {
|
|||||||
|
|
||||||
let violations = use_case.check_violations_only();
|
let violations = use_case.check_violations_only();
|
||||||
if args.strict && !violations.is_empty() {
|
if args.strict && !violations.is_empty() {
|
||||||
bail!("{} boundary rule violation(s) in strict mode", violations.len());
|
bail!(
|
||||||
|
"{} boundary rule violation(s) in strict mode",
|
||||||
|
violations.len()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
use_case.execute()?;
|
use_case.execute()?;
|
||||||
|
|
||||||
@@ -135,10 +146,18 @@ fn build_graph(args: &Cli, level: DiagramLevel) -> Result<NormalizedGraph> {
|
|||||||
|
|
||||||
if !result.warnings().is_empty() {
|
if !result.warnings().is_empty() {
|
||||||
for warning in result.warnings() {
|
for warning in result.warnings() {
|
||||||
eprintln!("WARNING: {}:{} {}", warning.file_path().as_str(), warning.line(), warning.message());
|
eprintln!(
|
||||||
|
"WARNING: {}:{} {}",
|
||||||
|
warning.file_path().as_str(),
|
||||||
|
warning.line(),
|
||||||
|
warning.message()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
if args.strict {
|
if args.strict {
|
||||||
bail!("analysis produced {} warning(s) in strict mode", result.warnings().len());
|
bail!(
|
||||||
|
"analysis produced {} warning(s) in strict mode",
|
||||||
|
result.warnings().len()
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -165,7 +184,9 @@ fn create_renderer(
|
|||||||
show_weights: bool,
|
show_weights: bool,
|
||||||
) -> Result<Box<dyn archlens_domain::ports::DiagramRenderer>> {
|
) -> Result<Box<dyn archlens_domain::ports::DiagramRenderer>> {
|
||||||
match format {
|
match format {
|
||||||
"mermaid" => Ok(Box::new(MermaidRenderer::with_level(level).with_weights(show_weights))),
|
"mermaid" => Ok(Box::new(
|
||||||
|
MermaidRenderer::with_level(level).with_weights(show_weights),
|
||||||
|
)),
|
||||||
"ascii" => Ok(Box::new(AsciiRenderer::new())),
|
"ascii" => Ok(Box::new(AsciiRenderer::new())),
|
||||||
"d2" => Ok(Box::new(D2Renderer::with_level(level))),
|
"d2" => Ok(Box::new(D2Renderer::with_level(level))),
|
||||||
"html" => Ok(Box::new(HtmlRenderer::new())),
|
"html" => Ok(Box::new(HtmlRenderer::new())),
|
||||||
@@ -193,7 +214,8 @@ fn run_diff(args: &Cli, existing_path: &std::path::Path) -> Result<()> {
|
|||||||
graph: &graph,
|
graph: &graph,
|
||||||
renderer: &*renderer,
|
renderer: &*renderer,
|
||||||
existing_path,
|
existing_path,
|
||||||
}.execute()?;
|
}
|
||||||
|
.execute()?;
|
||||||
|
|
||||||
if diff.is_empty() {
|
if diff.is_empty() {
|
||||||
println!("No changes detected.");
|
println!("No changes detected.");
|
||||||
@@ -206,7 +228,11 @@ fn run_diff(args: &Cli, existing_path: &std::path::Path) -> Result<()> {
|
|||||||
for line in &diff.added {
|
for line in &diff.added {
|
||||||
println!("{line}");
|
println!("{line}");
|
||||||
}
|
}
|
||||||
println!("\n{} added, {} removed", diff.added.len(), diff.removed.len());
|
println!(
|
||||||
|
"\n{} added, {} removed",
|
||||||
|
diff.added.len(),
|
||||||
|
diff.removed.len()
|
||||||
|
);
|
||||||
std::process::exit(1);
|
std::process::exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -286,7 +312,10 @@ fn get_changed_files(
|
|||||||
.map_err(|e| anyhow::anyhow!("git not found: {e}"))?;
|
.map_err(|e| anyhow::anyhow!("git not found: {e}"))?;
|
||||||
|
|
||||||
if !output.status.success() {
|
if !output.status.success() {
|
||||||
bail!("git diff failed: {}", String::from_utf8_lossy(&output.stderr));
|
bail!(
|
||||||
|
"git diff failed: {}",
|
||||||
|
String::from_utf8_lossy(&output.stderr)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
let files = String::from_utf8_lossy(&output.stdout)
|
let files = String::from_utf8_lossy(&output.stdout)
|
||||||
@@ -324,8 +353,14 @@ fn run_watch(args: Cli) -> Result<()> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let (raw_allow, raw_deny) = config_loader.load_rules();
|
let (raw_allow, raw_deny) = config_loader.load_rules();
|
||||||
let allow: Vec<BoundaryRule> = raw_allow.iter().filter_map(|s| BoundaryRule::parse(s)).collect();
|
let allow: Vec<BoundaryRule> = raw_allow
|
||||||
let deny: Vec<BoundaryRule> = raw_deny.iter().filter_map(|s| BoundaryRule::parse(s)).collect();
|
.iter()
|
||||||
|
.filter_map(|s| BoundaryRule::parse(s))
|
||||||
|
.collect();
|
||||||
|
let deny: Vec<BoundaryRule> = raw_deny
|
||||||
|
.iter()
|
||||||
|
.filter_map(|s| BoundaryRule::parse(s))
|
||||||
|
.collect();
|
||||||
if !allow.is_empty() || !deny.is_empty() {
|
if !allow.is_empty() || !deny.is_empty() {
|
||||||
let use_case = GenerateDiagram {
|
let use_case = GenerateDiagram {
|
||||||
graph,
|
graph,
|
||||||
@@ -343,7 +378,10 @@ fn run_watch(args: Cli) -> Result<()> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
};
|
};
|
||||||
|
|
||||||
eprintln!("Watching {} for changes (Ctrl+C to stop)...", args.path.display());
|
eprintln!(
|
||||||
|
"Watching {} for changes (Ctrl+C to stop)...",
|
||||||
|
args.path.display()
|
||||||
|
);
|
||||||
if let Err(e) = run_once(&args) {
|
if let Err(e) = run_once(&args) {
|
||||||
eprintln!("Error: {e}");
|
eprintln!("Error: {e}");
|
||||||
} else {
|
} else {
|
||||||
@@ -351,14 +389,18 @@ fn run_watch(args: Cli) -> Result<()> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let (tx, rx) = mpsc::channel();
|
let (tx, rx) = mpsc::channel();
|
||||||
let mut watcher = recommended_watcher(move |res| { let _ = tx.send(res); })?;
|
let mut watcher = recommended_watcher(move |res| {
|
||||||
|
let _ = tx.send(res);
|
||||||
|
})?;
|
||||||
watcher.watch(&args.path, RecursiveMode::Recursive)?;
|
watcher.watch(&args.path, RecursiveMode::Recursive)?;
|
||||||
|
|
||||||
let mut last_run = Instant::now();
|
let mut last_run = Instant::now();
|
||||||
loop {
|
loop {
|
||||||
match rx.recv() {
|
match rx.recv() {
|
||||||
Ok(_) => {
|
Ok(_) => {
|
||||||
if last_run.elapsed() < debounce { continue; }
|
if last_run.elapsed() < debounce {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
last_run = Instant::now();
|
last_run = Instant::now();
|
||||||
eprintln!("Change detected, regenerating...");
|
eprintln!("Change detected, regenerating...");
|
||||||
if let Err(e) = run_once(&args) {
|
if let Err(e) = run_once(&args) {
|
||||||
@@ -367,7 +409,10 @@ fn run_watch(args: Cli) -> Result<()> {
|
|||||||
eprintln!("Diagram updated.");
|
eprintln!("Diagram updated.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(e) => { eprintln!("Watch error: {e}"); break; }
|
Err(e) => {
|
||||||
|
eprintln!("Watch error: {e}");
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|||||||
@@ -1,144 +0,0 @@
|
|||||||
╔══════════════════════════════════════╗
|
|
||||||
║ Architecture Overview ║
|
|
||||||
╠══════════════════════════════════════╣
|
|
||||||
║ Elements: 61 Modules: 4 ║
|
|
||||||
║ Relationships: 59 ║
|
|
||||||
╚══════════════════════════════════════╝
|
|
||||||
|
|
||||||
┌─ Adapters (30 types)
|
|
||||||
│
|
|
||||||
│ ├── [str] AsciiRenderer
|
|
||||||
│ ├── [str] D2Renderer
|
|
||||||
│ ├── [str] CargoWorkspaceAnalyzer
|
|
||||||
│ ├── [str] WorkspaceToml
|
|
||||||
│ ├── [str] WorkspaceSection
|
|
||||||
│ ├── [str] MemberToml
|
|
||||||
│ ├── [str] PackageSection
|
|
||||||
│ ├── [str] PythonProjectAnalyzer
|
|
||||||
│ ├── [str] ProjectSection
|
|
||||||
│ ├── [str] PoetrySection
|
|
||||||
│ ├── [str] ToolSection
|
|
||||||
│ ├── [str] PyprojectToml
|
|
||||||
│ ├── [str] StdoutOutputWriter
|
|
||||||
│ ├── [str] FileOutputWriter
|
|
||||||
│ ├── [enm] OutputPath
|
|
||||||
│ ├── [str] MermaidRenderer
|
|
||||||
│ ├── [trt] LanguageExtractor
|
|
||||||
│ ├── [str] TreeSitterAnalyzer
|
|
||||||
│ ├── [str] RustExtractor
|
|
||||||
│ ├── [str] PythonExtractor
|
|
||||||
│ ├── [str] WalkdirDiscovery
|
|
||||||
│ ├── [str] HtmlRenderer
|
|
||||||
│ ├── [str] GraphData
|
|
||||||
│ ├── [str] NodeData
|
|
||||||
│ ├── [str] EdgeData
|
|
||||||
│ ├── [str] RawRules
|
|
||||||
│ ├── [str] RawConfig
|
|
||||||
│ ├── [str] RawAnalysis
|
|
||||||
│ ├── [str] RawOutput
|
|
||||||
│ └── [str] TomlConfigLoader
|
|
||||||
└───
|
|
||||||
|
|
||||||
┌─ Application (2 types)
|
|
||||||
│
|
|
||||||
│ ├── [str] AnalyzeCodebase
|
|
||||||
│ └── [str] AnalyzeCodebaseResult
|
|
||||||
└───
|
|
||||||
|
|
||||||
┌─ Domain (27 types)
|
|
||||||
│
|
|
||||||
│ ├── [str] Relationship
|
|
||||||
│ ├── [str] CodeElement
|
|
||||||
│ ├── [enm] DomainError
|
|
||||||
│ ├── [trt] DiagramRenderer
|
|
||||||
│ ├── [trt] SourceAnalyzer
|
|
||||||
│ ├── [trt] ConfigLoader
|
|
||||||
│ ├── [trt] FileDiscovery
|
|
||||||
│ ├── [trt] ProjectAnalyzer
|
|
||||||
│ ├── [trt] OutputWriter
|
|
||||||
│ ├── [str] AnalysisResult
|
|
||||||
│ ├── [str] AnalysisConfig
|
|
||||||
│ ├── [str] AnalysisWarning
|
|
||||||
│ ├── [enm] CodeElementKind
|
|
||||||
│ ├── [enm] RelationshipKind
|
|
||||||
│ ├── [enm] Visibility
|
|
||||||
│ ├── [enm] DiagramLevel
|
|
||||||
│ ├── [str] OutputConfig
|
|
||||||
│ ├── [str] RenderedFile
|
|
||||||
│ ├── [str] RenderOutput
|
|
||||||
│ ├── [str] ModuleName
|
|
||||||
│ ├── [enm] Language
|
|
||||||
│ ├── [str] SourceFile
|
|
||||||
│ ├── [str] FilePath
|
|
||||||
│ ├── [enm] RuleKind
|
|
||||||
│ ├── [str] RuleViolation
|
|
||||||
│ ├── [str] BoundaryRule
|
|
||||||
│ └── [str] CodeGraph
|
|
||||||
└───
|
|
||||||
|
|
||||||
┌─ Presentation (2 types)
|
|
||||||
│
|
|
||||||
│ ├── [str] Cli
|
|
||||||
│ └── [enm] Command
|
|
||||||
└───
|
|
||||||
|
|
||||||
── Relationships ──
|
|
||||||
Adapters::AsciiRenderer ─[extends]─> Domain::DiagramRenderer
|
|
||||||
Adapters::D2Renderer ─[has]─> Domain::DiagramLevel
|
|
||||||
Adapters::D2Renderer ─[extends]─> Domain::DiagramRenderer
|
|
||||||
Adapters::CargoWorkspaceAnalyzer ─[extends]─> Domain::ProjectAnalyzer
|
|
||||||
Adapters::ToolSection ─[has]─> Adapters::PoetrySection
|
|
||||||
Adapters::PyprojectToml ─[has]─> Adapters::ToolSection
|
|
||||||
Adapters::PythonProjectAnalyzer ─[extends]─> Domain::ProjectAnalyzer
|
|
||||||
Adapters::StdoutOutputWriter ─[extends]─> Domain::OutputWriter
|
|
||||||
Adapters::FileOutputWriter ─[has]─> Adapters::OutputPath
|
|
||||||
Adapters::FileOutputWriter ─[extends]─> Domain::OutputWriter
|
|
||||||
Adapters::MermaidRenderer ─[has]─> Domain::DiagramLevel
|
|
||||||
Adapters::MermaidRenderer ─[extends]─> Domain::DiagramRenderer
|
|
||||||
Adapters::TreeSitterAnalyzer ─[has]─> Adapters::RustExtractor
|
|
||||||
Adapters::TreeSitterAnalyzer ─[has]─> Adapters::PythonExtractor
|
|
||||||
Adapters::TreeSitterAnalyzer ─[extends]─> Domain::SourceAnalyzer
|
|
||||||
Adapters::RustExtractor ─[extends]─> Adapters::LanguageExtractor
|
|
||||||
Adapters::PythonExtractor ─[extends]─> Adapters::LanguageExtractor
|
|
||||||
Adapters::WalkdirDiscovery ─[extends]─> Domain::FileDiscovery
|
|
||||||
Adapters::HtmlRenderer ─[extends]─> Domain::DiagramRenderer
|
|
||||||
Adapters::RawConfig ─[has]─> Adapters::RawAnalysis
|
|
||||||
Adapters::RawConfig ─[has]─> Adapters::RawOutput
|
|
||||||
Adapters::RawConfig ─[has]─> Adapters::RawRules
|
|
||||||
Adapters::TomlConfigLoader ─[has]─> Adapters::RawConfig
|
|
||||||
Adapters::TomlConfigLoader ─[extends]─> Domain::ConfigLoader
|
|
||||||
Application::AnalyzeCodebaseResult ─[has]─> Domain::CodeGraph
|
|
||||||
Domain::Relationship ─[has]─> Domain::RelationshipKind
|
|
||||||
Domain::CodeElement ─[has]─> Domain::CodeElementKind
|
|
||||||
Domain::CodeElement ─[has]─> Domain::FilePath
|
|
||||||
Domain::CodeElement ─[has]─> Domain::Visibility
|
|
||||||
Domain::AnalysisConfig ─[has]─> Domain::DiagramLevel
|
|
||||||
Domain::AnalysisWarning ─[has]─> Domain::FilePath
|
|
||||||
Domain::SourceFile ─[has]─> Domain::FilePath
|
|
||||||
Domain::SourceFile ─[has]─> Domain::Language
|
|
||||||
Domain::RuleViolation ─[has]─> Domain::RuleKind
|
|
||||||
Application ─[has]─> Domain
|
|
||||||
Presentation ─[has]─> Adapters
|
|
||||||
Presentation ─[has]─> Adapters
|
|
||||||
Presentation ─[has]─> Adapters
|
|
||||||
Presentation ─[has]─> Adapters
|
|
||||||
Presentation ─[has]─> Domain
|
|
||||||
Presentation ─[has]─> Adapters
|
|
||||||
Presentation ─[has]─> Adapters
|
|
||||||
Presentation ─[has]─> Adapters
|
|
||||||
Presentation ─[has]─> Adapters
|
|
||||||
Presentation ─[has]─> Adapters
|
|
||||||
Presentation ─[has]─> Adapters
|
|
||||||
Presentation ─[has]─> Application
|
|
||||||
Presentation ─[has]─> Adapters
|
|
||||||
Adapters ─[has]─> Domain
|
|
||||||
Adapters ─[has]─> Domain
|
|
||||||
Adapters ─[has]─> Domain
|
|
||||||
Adapters ─[has]─> Domain
|
|
||||||
Adapters ─[has]─> Domain
|
|
||||||
Adapters ─[has]─> Domain
|
|
||||||
Adapters ─[has]─> Domain
|
|
||||||
Adapters ─[has]─> Domain
|
|
||||||
Adapters ─[has]─> Domain
|
|
||||||
Adapters ─[has]─> Domain
|
|
||||||
Adapters ─[has]─> Domain
|
|
||||||
@@ -1,54 +0,0 @@
|
|||||||
╔══════════════════════════════════════╗
|
|
||||||
║ Architecture Overview ║
|
|
||||||
╠══════════════════════════════════════╣
|
|
||||||
║ Elements: 14 Modules: 1 ║
|
|
||||||
║ Relationships: 25 ║
|
|
||||||
╚══════════════════════════════════════╝
|
|
||||||
|
|
||||||
┌─ (ungrouped)
|
|
||||||
│ [prj] archlens-domain
|
|
||||||
│ [prj] archlens-application
|
|
||||||
│ [prj] archlens
|
|
||||||
└───
|
|
||||||
|
|
||||||
┌─ Adapters (11 types)
|
|
||||||
│
|
|
||||||
│ ├── [prj] archlens-tree-sitter
|
|
||||||
│ ├── [prj] archlens-walkdir
|
|
||||||
│ ├── [prj] archlens-mermaid
|
|
||||||
│ ├── [prj] archlens-ascii
|
|
||||||
│ ├── [prj] archlens-file-writer
|
|
||||||
│ ├── [prj] archlens-stdout-writer
|
|
||||||
│ ├── [prj] archlens-toml-config
|
|
||||||
│ ├── [prj] archlens-cargo-workspace
|
|
||||||
│ ├── [prj] archlens-python-project
|
|
||||||
│ ├── [prj] archlens-d2
|
|
||||||
│ └── [prj] archlens-html
|
|
||||||
└───
|
|
||||||
|
|
||||||
── Relationships ──
|
|
||||||
archlens-application ─[has]─> archlens-domain
|
|
||||||
archlens ─[has]─> archlens-tree-sitter
|
|
||||||
archlens ─[has]─> archlens-ascii
|
|
||||||
archlens ─[has]─> archlens-stdout-writer
|
|
||||||
archlens ─[has]─> archlens-application
|
|
||||||
archlens ─[has]─> archlens-walkdir
|
|
||||||
archlens ─[has]─> archlens-d2
|
|
||||||
archlens ─[has]─> archlens-html
|
|
||||||
archlens ─[has]─> archlens-mermaid
|
|
||||||
archlens ─[has]─> archlens-file-writer
|
|
||||||
archlens ─[has]─> archlens-domain
|
|
||||||
archlens ─[has]─> archlens-cargo-workspace
|
|
||||||
archlens ─[has]─> archlens-toml-config
|
|
||||||
archlens ─[has]─> archlens-python-project
|
|
||||||
archlens-tree-sitter ─[has]─> archlens-domain
|
|
||||||
archlens-walkdir ─[has]─> archlens-domain
|
|
||||||
archlens-mermaid ─[has]─> archlens-domain
|
|
||||||
archlens-ascii ─[has]─> archlens-domain
|
|
||||||
archlens-file-writer ─[has]─> archlens-domain
|
|
||||||
archlens-stdout-writer ─[has]─> archlens-domain
|
|
||||||
archlens-toml-config ─[has]─> archlens-domain
|
|
||||||
archlens-cargo-workspace ─[has]─> archlens-domain
|
|
||||||
archlens-python-project ─[has]─> archlens-domain
|
|
||||||
archlens-d2 ─[has]─> archlens-domain
|
|
||||||
archlens-html ─[has]─> archlens-domain
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
Presentation: Presentation
|
|
||||||
Application: Application
|
|
||||||
Adapters: Adapters
|
|
||||||
Domain: Domain
|
|
||||||
Adapters -> Domain
|
|
||||||
Application -> Domain
|
|
||||||
Presentation -> Adapters
|
|
||||||
Presentation -> Domain
|
|
||||||
Presentation -> Application
|
|
||||||
@@ -1,95 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" data-d2-version="0.7.1" preserveAspectRatio="xMinYMin meet" viewBox="0 0 695 434"><svg class="d2-2851621290 d2-svg" width="695" height="434" viewBox="-101 -101 695 434"><rect x="-101.000000" y="-101.000000" width="695.000000" height="434.000000" rx="0.000000" fill="#FFFFFF" class=" fill-N7" stroke-width="0" /><style type="text/css"><![CDATA[
|
|
||||||
.d2-2851621290 .text-bold {
|
|
||||||
font-family: "d2-2851621290-font-bold";
|
|
||||||
}
|
|
||||||
@font-face {
|
|
||||||
font-family: d2-2851621290-font-bold;
|
|
||||||
src: url("data:application/font-woff;base64,d09GRgABAAAAAAp4AAoAAAAAEIgAAguFAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAAA9AAAAGAAAABgXxHXrmNtYXAAAAFUAAAAbQAAAIYCFAJFZ2x5ZgAAAcQAAAR7AAAFuJ1AmSJoZWFkAAAGQAAAADYAAAA2G38e1GhoZWEAAAZ4AAAAJAAAACQKfwXSaG10eAAABpwAAABMAAAATCPwAzFsb2NhAAAG6AAAACgAAAAoDjYPtm1heHAAAAcQAAAAIAAAACAAKwD3bmFtZQAABzAAAAMoAAAIKgjwVkFwb3N0AAAKWAAAAB0AAAAg/9EAMgADAioCvAAFAAACigJYAAAASwKKAlgAAAFeADIBKQAAAgsHAwMEAwICBGAAAvcAAAADAAAAAAAAAABBREJPACAAIP//Au7/BgAAA9gBESAAAZ8AAAAAAfAClAAAACAAA3icXMxNCgEBAIbhZ378DyY3Ug7gCpLFlIVk5SykOIK93OxTFhbe5bt4UKgUaNTOWGhVSksraxs7nYNTwu9tdfaOSd555ZlH7rnlmstX+q9QqtR6+gaGRsYmGlMzcy0fAAAA//8BAAD//+VVGEoAAAB4nGRUS2zTdhj//v8m9hoMxXFsx2ne/8ZO0sVt4tgmtMUNTR9A0qdoYRTCqmljK7QI0rXjsgubtNEJjXKYxrRdNmk77IB2YUjsyia4gcQJiUnTztVU7YDSZHLc8tAO9nfy7/X9PoMbJgHwAr4JbdAOHeAFHkBjY2xCUxRCm5ppErHNVBBLT2Jv44fvlZQrlXKlo19FrlSrqHIG39w+f6qysPBvta+v8e2vdxtfoMt3AXDzOQAewuvQDiwAR2uKLCuEoto4jSMKof/ef61jb+deFyM9f3j74TfJ+0l0tL8/u6TlLzQ+wevbtVu3AAAwVABwGa+Dx1Gm5QSB91EUUbScYeh5WSakcuedG1OT189mggdmVHXmQBCvl65fvHhjdDU5Pz5+MvECpxevAwO+13AIz2o5PW/DPBtbGRmpDU+NrQ32l/C6Mj9RXuh5iqbPaWlHS7q5hR6jOkhAAMS4rOcNU5ZJnKIVw9ByAs8S26OZM0ydonif8Ftp8uoGJqnIYJfes3iw+u6axxUZfUNKcOP9EWbOGj/REVP8/NuhrqVLjb+0ILkkcnOe7pBfBAAEXc0tdA/VIQDgjss2nc0i0jYl7xO0nGGKFIWk4eXi2IcldTQ4TKK6ZfX6Ve5gYpYZWJmeqQ2ExWqoXBys8B1no52OD6W5her4HnAQ3fXRAlZ07RUH8g7NP/PLfdV86oBEbax5XIER7Fe8XLePGD3MtY+mVg4F/eWftoeyAbLmkx549w2NHhkG3NL+J6qDHyKvqbdTp2OCoOVs7W1a3mZBkdFLh4fO942e7nHhxhPPSFY3svKZr39R3owbzKHa9FTNshZLXKLd0GInA2F0MKX3AECzCSYAPMWPsGz3DGjwwuet7IrNLeTF96DDcchq7IvAfi/3bbDtbpryMgnm1DFMtp+IXoQuuGn7O4C2EKpDrNUSUXOS2V0va8ulX8yivc+RrF7kYkezk8c2QtFEr/3qQZuDkUx3Mp5dPN14iGJGsrdxe2c4HBhQfaeJOxy76JQDG63kpo5shKLBpB9tWuHMLpAkNm6Dky+mUR06oPN/+VJKzj4NZ31IsJZLpWXLWiqVlqyMqmbUTGanGwO1memVgdXKYLFsV8TGLTbHsIDqwEEYQHypzr6VuKyIPGdjkzjNC4KtM3REeetcf9WI9gfcE7Ix2532Je/gH7MB8tnl42tWpzTxJeoaKX+aeeDdB453dB3VwftavrT80nlnWeaDHv9eaX9wwIc253JZt/tjlyuVazwDBHxzC32H6qC09qqYdpNa/wFFxXr+JRjvE8Qw5n3Uo+x78uG4FYmFQ2og3Jd8/3hhLnI4kA8UCnJ0IHWOkSPzUqfIsQLnYboKqeFZxX/CJyh+ad8eUlCHTkOrT2xzCy3hGoittHWd6Kap8RpPXjlEmJ8oldkrq6skxEgekTOZD2b/uEBdvXr5fjpBuRYpxsEqAsBjtAltrQzY4gbabOwH1PwZF2AGP4I9AGzrKp3gE6qaSKgqLqQJSdsP/AcAAP//AQAA//9ELCvFAAABAAAAAguF5qpWxV8PPPUAAQPoAAAAANhdoIQAAAAA3WYvNv43/sQIbQPxAAEAAwACAAAAAAAAAAEAAAPY/u8AAAiY/jf+NwhtAAEAAAAAAAAAAAAAAAAAAAATArIAUAI9//oCewBNAlQATQIPACoB0wAkAj0AJwIGACQBFAA3AR4AQQNZAEECPABBAisAJAI9AEEBjgBBAbsAFQF/ABEBFABBAAD/rQAAACwAUAB0AJYAzgD6ASwBYAFsAYgBugHcAggCOAJYApQCugLGAtwAAQAAABMAkAAMAGMABwABAAAAAAAAAAAAAAAAAAQAA3icnJTPbhtVFMZ/TmzTCsECRVW6ie6CRZHo2FRJ1TYrh9SKRRQHjwtCQkgTz/iPMp4ZeSYO4QlY8xa8RVc8BM+BWKP5fOzYBdEmipJ8d+75851zvnOBHf5mm0r1IfBHPTFcYa9+bniLB/UTw9u061uGqzyp/Wm4RlibG67zea1n+CPeVn8z/ID96k+GH7JbbRv+mGfVHcOfbDv+Mvwp+7xd4Aq84FfDFXbJDG+xw4+Gt3mExaxUeUTTcI3P2DNcZw/oM6EgZkLCCMeQCSOumBGR4xMxY8KQiBBHhxYxhb4mBEKO0X9+DfApmBEo4pgCR4xPTEDO2CL+Iq+Uc2Uc6jSzuxYFYwIu5HFJQIIjZURKQsSl4hQUZLyiQYOcgfhmFOR45EyI8UiZMaJBlzan9BkzIcfRVqSSmU/KkIJrAuV3ZlF2ZkBEQm6srkgIxdOJXyTvDqc4umSyXY98uhHhSxzfybvklsr2Kzz9ujVmm3mXbALm6mesrsS6udYEx7ot87b4VrjgFe5e/dlk8v4ehfpfKPIFV5p/qEklYpLg3C4tfCnId49xHOncwVdHvqdDnxO6vKGvc4sePVqc0afDa/l26eH4mi5nHMujI7y4a0sxZ/yA4xs6siljR9afxcQifiYzdefiOFMdUzL1vGTuqdZIFd59wuUOpRvqyOUz0B6Vlk7zS7RnASNTRSaGU/VyqY3c+heaIqaqpZzt7X25DXPbveUW35Bqh0u1LjiVk1swet9UvXc0c60fj4CQlAtZDEiZ0qDgRrzPCbgixnGs7p1oSwpaK58yz41UEjEVgw6J4szI9Dcw3fjGfbChe2dvSSj/kunlqqr7ZHHq1e2M3qh7yzvfuhytTaBhU03X1DQQ18S0H2mn1vn78s31uqU85YiUmPBfL8AzPJrsc8AhY2UY6GZur0NTL0STlxyq+ksiWQ2l58giHODxnAMOeMnzd/q4ZOKMi1txWc/d4pgjuhx+UBUL+y5HvF59+/+sv4tpU7U4nq5OL+49xSd3UOsX2rPb97KniZWTmFu02604I2BacnG76zW5x3j/AAAA//8BAAD///S3T1F4nGJgZgCD/+cYjBiwAAAAAAD//wEAAP//LwECAwAAAA==");
|
|
||||||
}]]></style><style type="text/css"><![CDATA[.shape {
|
|
||||||
shape-rendering: geometricPrecision;
|
|
||||||
stroke-linejoin: round;
|
|
||||||
}
|
|
||||||
.connection {
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-linejoin: round;
|
|
||||||
}
|
|
||||||
.blend {
|
|
||||||
mix-blend-mode: multiply;
|
|
||||||
opacity: 0.5;
|
|
||||||
}
|
|
||||||
|
|
||||||
.d2-2851621290 .fill-N1{fill:#0A0F25;}
|
|
||||||
.d2-2851621290 .fill-N2{fill:#676C7E;}
|
|
||||||
.d2-2851621290 .fill-N3{fill:#9499AB;}
|
|
||||||
.d2-2851621290 .fill-N4{fill:#CFD2DD;}
|
|
||||||
.d2-2851621290 .fill-N5{fill:#DEE1EB;}
|
|
||||||
.d2-2851621290 .fill-N6{fill:#EEF1F8;}
|
|
||||||
.d2-2851621290 .fill-N7{fill:#FFFFFF;}
|
|
||||||
.d2-2851621290 .fill-B1{fill:#0D32B2;}
|
|
||||||
.d2-2851621290 .fill-B2{fill:#0D32B2;}
|
|
||||||
.d2-2851621290 .fill-B3{fill:#E3E9FD;}
|
|
||||||
.d2-2851621290 .fill-B4{fill:#E3E9FD;}
|
|
||||||
.d2-2851621290 .fill-B5{fill:#EDF0FD;}
|
|
||||||
.d2-2851621290 .fill-B6{fill:#F7F8FE;}
|
|
||||||
.d2-2851621290 .fill-AA2{fill:#4A6FF3;}
|
|
||||||
.d2-2851621290 .fill-AA4{fill:#EDF0FD;}
|
|
||||||
.d2-2851621290 .fill-AA5{fill:#F7F8FE;}
|
|
||||||
.d2-2851621290 .fill-AB4{fill:#EDF0FD;}
|
|
||||||
.d2-2851621290 .fill-AB5{fill:#F7F8FE;}
|
|
||||||
.d2-2851621290 .stroke-N1{stroke:#0A0F25;}
|
|
||||||
.d2-2851621290 .stroke-N2{stroke:#676C7E;}
|
|
||||||
.d2-2851621290 .stroke-N3{stroke:#9499AB;}
|
|
||||||
.d2-2851621290 .stroke-N4{stroke:#CFD2DD;}
|
|
||||||
.d2-2851621290 .stroke-N5{stroke:#DEE1EB;}
|
|
||||||
.d2-2851621290 .stroke-N6{stroke:#EEF1F8;}
|
|
||||||
.d2-2851621290 .stroke-N7{stroke:#FFFFFF;}
|
|
||||||
.d2-2851621290 .stroke-B1{stroke:#0D32B2;}
|
|
||||||
.d2-2851621290 .stroke-B2{stroke:#0D32B2;}
|
|
||||||
.d2-2851621290 .stroke-B3{stroke:#E3E9FD;}
|
|
||||||
.d2-2851621290 .stroke-B4{stroke:#E3E9FD;}
|
|
||||||
.d2-2851621290 .stroke-B5{stroke:#EDF0FD;}
|
|
||||||
.d2-2851621290 .stroke-B6{stroke:#F7F8FE;}
|
|
||||||
.d2-2851621290 .stroke-AA2{stroke:#4A6FF3;}
|
|
||||||
.d2-2851621290 .stroke-AA4{stroke:#EDF0FD;}
|
|
||||||
.d2-2851621290 .stroke-AA5{stroke:#F7F8FE;}
|
|
||||||
.d2-2851621290 .stroke-AB4{stroke:#EDF0FD;}
|
|
||||||
.d2-2851621290 .stroke-AB5{stroke:#F7F8FE;}
|
|
||||||
.d2-2851621290 .background-color-N1{background-color:#0A0F25;}
|
|
||||||
.d2-2851621290 .background-color-N2{background-color:#676C7E;}
|
|
||||||
.d2-2851621290 .background-color-N3{background-color:#9499AB;}
|
|
||||||
.d2-2851621290 .background-color-N4{background-color:#CFD2DD;}
|
|
||||||
.d2-2851621290 .background-color-N5{background-color:#DEE1EB;}
|
|
||||||
.d2-2851621290 .background-color-N6{background-color:#EEF1F8;}
|
|
||||||
.d2-2851621290 .background-color-N7{background-color:#FFFFFF;}
|
|
||||||
.d2-2851621290 .background-color-B1{background-color:#0D32B2;}
|
|
||||||
.d2-2851621290 .background-color-B2{background-color:#0D32B2;}
|
|
||||||
.d2-2851621290 .background-color-B3{background-color:#E3E9FD;}
|
|
||||||
.d2-2851621290 .background-color-B4{background-color:#E3E9FD;}
|
|
||||||
.d2-2851621290 .background-color-B5{background-color:#EDF0FD;}
|
|
||||||
.d2-2851621290 .background-color-B6{background-color:#F7F8FE;}
|
|
||||||
.d2-2851621290 .background-color-AA2{background-color:#4A6FF3;}
|
|
||||||
.d2-2851621290 .background-color-AA4{background-color:#EDF0FD;}
|
|
||||||
.d2-2851621290 .background-color-AA5{background-color:#F7F8FE;}
|
|
||||||
.d2-2851621290 .background-color-AB4{background-color:#EDF0FD;}
|
|
||||||
.d2-2851621290 .background-color-AB5{background-color:#F7F8FE;}
|
|
||||||
.d2-2851621290 .color-N1{color:#0A0F25;}
|
|
||||||
.d2-2851621290 .color-N2{color:#676C7E;}
|
|
||||||
.d2-2851621290 .color-N3{color:#9499AB;}
|
|
||||||
.d2-2851621290 .color-N4{color:#CFD2DD;}
|
|
||||||
.d2-2851621290 .color-N5{color:#DEE1EB;}
|
|
||||||
.d2-2851621290 .color-N6{color:#EEF1F8;}
|
|
||||||
.d2-2851621290 .color-N7{color:#FFFFFF;}
|
|
||||||
.d2-2851621290 .color-B1{color:#0D32B2;}
|
|
||||||
.d2-2851621290 .color-B2{color:#0D32B2;}
|
|
||||||
.d2-2851621290 .color-B3{color:#E3E9FD;}
|
|
||||||
.d2-2851621290 .color-B4{color:#E3E9FD;}
|
|
||||||
.d2-2851621290 .color-B5{color:#EDF0FD;}
|
|
||||||
.d2-2851621290 .color-B6{color:#F7F8FE;}
|
|
||||||
.d2-2851621290 .color-AA2{color:#4A6FF3;}
|
|
||||||
.d2-2851621290 .color-AA4{color:#EDF0FD;}
|
|
||||||
.d2-2851621290 .color-AA5{color:#F7F8FE;}
|
|
||||||
.d2-2851621290 .color-AB4{color:#EDF0FD;}
|
|
||||||
.d2-2851621290 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker-d2-2851621290);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker-d2-2851621290);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright-d2-2851621290);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright-d2-2851621290);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright-d2-2851621290);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright-d2-2851621290);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark-d2-2851621290);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright-d2-2851621290);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright-d2-2851621290);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright-d2-2851621290);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright-d2-2851621290);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker-d2-2851621290);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark-d2-2851621290);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal-d2-2851621290);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal-d2-2851621290);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright-d2-2851621290);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright-d2-2851621290);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright-d2-2851621290);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]></style><g class="QWRhcHRlcnM="><g class="shape" ><rect x="187.000000" y="0.000000" width="110.000000" height="66.000000" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="242.000000" y="38.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Adapters</text></g><g class="RG9tYWlu"><g class="shape" ><rect x="103.000000" y="166.000000" width="99.000000" height="66.000000" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="152.500000" y="204.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Domain</text></g><g class="QXBwbGljYXRpb24="><g class="shape" ><rect x="0.000000" y="0.000000" width="127.000000" height="66.000000" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="63.500000" y="38.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Application</text></g><g class="UHJlc2VudGF0aW9u"><g class="shape" ><rect x="357.000000" y="0.000000" width="136.000000" height="66.000000" stroke="#0D32B2" fill="#F7F8FE" class=" stroke-B1 fill-B6" style="stroke-width:2;" /></g><text x="425.000000" y="38.500000" fill="#0A0F25" class="text-bold fill-N1" style="text-anchor:middle;font-size:16px">Presentation</text></g><g class="KEFwcGxpY2F0aW9uIC0mZ3Q7IERvbWFpbilbMF0="><marker id="mk-d2-2851621290-3488378134" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" fill="#0D32B2" class="connection fill-B1" stroke-width="2" /> </marker><path d="M 63.500000 68.000000 C 63.500000 106.000000 74.300003 126.000000 114.564957 163.282368" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-2851621290-3488378134)" mask="url(#d2-2851621290)" /></g><g class="KEFkYXB0ZXJzIC0mZ3Q7IERvbWFpbilbMF0="><path d="M 242.000000 68.000000 C 242.000000 106.000000 231.199997 126.000000 190.935043 163.282368" stroke="#0D32B2" fill="none" class="connection stroke-B1" style="stroke-width:2;" marker-end="url(#mk-d2-2851621290-3488378134)" mask="url(#d2-2851621290)" /></g><mask id="d2-2851621290" maskUnits="userSpaceOnUse" x="-101" y="-101" width="695" height="434">
|
|
||||||
<rect x="-101" y="-101" width="695" height="434" fill="white"></rect>
|
|
||||||
|
|
||||||
</mask></svg></svg>
|
|
||||||
|
Before Width: | Height: | Size: 12 KiB |
@@ -1,41 +0,0 @@
|
|||||||
Adapters: {
|
|
||||||
archlens_tree_sitter: archlens-tree-sitter
|
|
||||||
archlens_walkdir: archlens-walkdir
|
|
||||||
archlens_mermaid: archlens-mermaid
|
|
||||||
archlens_ascii: archlens-ascii
|
|
||||||
archlens_file_writer: archlens-file-writer
|
|
||||||
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
|
|
||||||
}
|
|
||||||
archlens_domain: archlens-domain
|
|
||||||
archlens_application: archlens-application
|
|
||||||
archlens: archlens
|
|
||||||
archlens_application -> archlens_domain
|
|
||||||
archlens -> archlens_walkdir
|
|
||||||
archlens -> archlens_mermaid
|
|
||||||
archlens -> archlens_html
|
|
||||||
archlens -> archlens_domain
|
|
||||||
archlens -> archlens_d2
|
|
||||||
archlens -> archlens_file_writer
|
|
||||||
archlens -> archlens_toml_config
|
|
||||||
archlens -> archlens_application
|
|
||||||
archlens -> archlens_tree_sitter
|
|
||||||
archlens -> archlens_python_project
|
|
||||||
archlens -> archlens_cargo_workspace
|
|
||||||
archlens -> archlens_stdout_writer
|
|
||||||
archlens -> archlens_ascii
|
|
||||||
archlens_tree_sitter -> archlens_domain
|
|
||||||
archlens_walkdir -> archlens_domain
|
|
||||||
archlens_mermaid -> archlens_domain
|
|
||||||
archlens_ascii -> archlens_domain
|
|
||||||
archlens_file_writer -> archlens_domain
|
|
||||||
archlens_stdout_writer -> archlens_domain
|
|
||||||
archlens_toml_config -> archlens_domain
|
|
||||||
archlens_cargo_workspace -> archlens_domain
|
|
||||||
archlens_python_project -> archlens_domain
|
|
||||||
archlens_d2 -> archlens_domain
|
|
||||||
archlens_html -> archlens_domain
|
|
||||||
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 33 KiB |
@@ -1,448 +0,0 @@
|
|||||||
Domain: {
|
|
||||||
Relationship: {
|
|
||||||
shape: class
|
|
||||||
source: String
|
|
||||||
target: String
|
|
||||||
kind: RelationshipKind
|
|
||||||
source_file: Option
|
|
||||||
new()
|
|
||||||
with_source_file()
|
|
||||||
source()
|
|
||||||
target()
|
|
||||||
kind()
|
|
||||||
source_file()
|
|
||||||
}
|
|
||||||
CodeElement: {
|
|
||||||
shape: class
|
|
||||||
name: String
|
|
||||||
qualified_name: Option
|
|
||||||
kind: CodeElementKind
|
|
||||||
file_path: FilePath
|
|
||||||
line: usize
|
|
||||||
visibility: Visibility
|
|
||||||
module: Option
|
|
||||||
generics: Vec
|
|
||||||
attributes: Vec
|
|
||||||
fields: Vec
|
|
||||||
methods: Vec
|
|
||||||
new()
|
|
||||||
with_visibility()
|
|
||||||
with_module()
|
|
||||||
with_generics()
|
|
||||||
with_attributes()
|
|
||||||
with_qualified_name()
|
|
||||||
name()
|
|
||||||
qualified_name()
|
|
||||||
kind()
|
|
||||||
file_path()
|
|
||||||
line()
|
|
||||||
visibility()
|
|
||||||
module()
|
|
||||||
generics()
|
|
||||||
attributes()
|
|
||||||
with_fields()
|
|
||||||
with_methods()
|
|
||||||
fields()
|
|
||||||
methods()
|
|
||||||
}
|
|
||||||
DomainError: {
|
|
||||||
shape: class
|
|
||||||
}
|
|
||||||
DiagramRenderer: {
|
|
||||||
shape: class
|
|
||||||
}
|
|
||||||
SourceAnalyzer: {
|
|
||||||
shape: class
|
|
||||||
}
|
|
||||||
ConfigLoader: {
|
|
||||||
shape: class
|
|
||||||
}
|
|
||||||
FileDiscovery: {
|
|
||||||
shape: class
|
|
||||||
}
|
|
||||||
ProjectAnalyzer: {
|
|
||||||
shape: class
|
|
||||||
}
|
|
||||||
OutputWriter: {
|
|
||||||
shape: class
|
|
||||||
}
|
|
||||||
AnalysisResult: {
|
|
||||||
shape: class
|
|
||||||
elements: Vec
|
|
||||||
relationships: Vec
|
|
||||||
warnings: Vec
|
|
||||||
new()
|
|
||||||
empty()
|
|
||||||
elements()
|
|
||||||
relationships()
|
|
||||||
warnings()
|
|
||||||
}
|
|
||||||
AnalysisConfig: {
|
|
||||||
shape: class
|
|
||||||
excludes: Vec
|
|
||||||
level: DiagramLevel
|
|
||||||
module_mappings: HashMap
|
|
||||||
scope: Option
|
|
||||||
include_tests: bool
|
|
||||||
changed_files: Option
|
|
||||||
with_excludes()
|
|
||||||
with_level()
|
|
||||||
with_module_mappings()
|
|
||||||
excludes()
|
|
||||||
level()
|
|
||||||
with_scope()
|
|
||||||
module_mappings()
|
|
||||||
scope()
|
|
||||||
with_include_tests()
|
|
||||||
include_tests()
|
|
||||||
with_changed_files()
|
|
||||||
changed_files()
|
|
||||||
}
|
|
||||||
AnalysisWarning: {
|
|
||||||
shape: class
|
|
||||||
file_path: FilePath
|
|
||||||
line: usize
|
|
||||||
message: String
|
|
||||||
new()
|
|
||||||
file_path()
|
|
||||||
line()
|
|
||||||
message()
|
|
||||||
}
|
|
||||||
CodeElementKind: {
|
|
||||||
shape: class
|
|
||||||
}
|
|
||||||
RelationshipKind: {
|
|
||||||
shape: class
|
|
||||||
}
|
|
||||||
Visibility: {
|
|
||||||
shape: class
|
|
||||||
}
|
|
||||||
DiagramLevel: {
|
|
||||||
shape: class
|
|
||||||
}
|
|
||||||
OutputConfig: {
|
|
||||||
shape: class
|
|
||||||
split_by_module: bool
|
|
||||||
output_path: Option
|
|
||||||
with_split_by_module()
|
|
||||||
with_output_path()
|
|
||||||
split_by_module()
|
|
||||||
output_path()
|
|
||||||
}
|
|
||||||
RenderedFile: {
|
|
||||||
shape: class
|
|
||||||
name: String
|
|
||||||
content: String
|
|
||||||
new()
|
|
||||||
name()
|
|
||||||
content()
|
|
||||||
}
|
|
||||||
RenderOutput: {
|
|
||||||
shape: class
|
|
||||||
files: Vec
|
|
||||||
new()
|
|
||||||
single()
|
|
||||||
files()
|
|
||||||
}
|
|
||||||
ModuleName: {
|
|
||||||
shape: class
|
|
||||||
new()
|
|
||||||
from_path()
|
|
||||||
from_directory_group()
|
|
||||||
capitalize()
|
|
||||||
as_str()
|
|
||||||
}
|
|
||||||
Language: {
|
|
||||||
shape: class
|
|
||||||
name()
|
|
||||||
}
|
|
||||||
SourceFile: {
|
|
||||||
shape: class
|
|
||||||
path: FilePath
|
|
||||||
language: Language
|
|
||||||
new()
|
|
||||||
path()
|
|
||||||
language()
|
|
||||||
}
|
|
||||||
FilePath: {
|
|
||||||
shape: class
|
|
||||||
new()
|
|
||||||
as_str()
|
|
||||||
}
|
|
||||||
RuleKind: {
|
|
||||||
shape: class
|
|
||||||
}
|
|
||||||
RuleViolation: {
|
|
||||||
shape: class
|
|
||||||
source_module: String
|
|
||||||
target_module: String
|
|
||||||
kind: RuleKind
|
|
||||||
new()
|
|
||||||
source_module()
|
|
||||||
target_module()
|
|
||||||
kind()
|
|
||||||
message()
|
|
||||||
}
|
|
||||||
BoundaryRule: {
|
|
||||||
shape: class
|
|
||||||
source: String
|
|
||||||
target: String
|
|
||||||
parse()
|
|
||||||
source()
|
|
||||||
target()
|
|
||||||
matches()
|
|
||||||
}
|
|
||||||
CodeGraph: {
|
|
||||||
shape: class
|
|
||||||
elements: Vec
|
|
||||||
relationships: Vec
|
|
||||||
new()
|
|
||||||
add_element()
|
|
||||||
add_relationship()
|
|
||||||
elements()
|
|
||||||
relationships()
|
|
||||||
modules()
|
|
||||||
elements_by_module()
|
|
||||||
resolve_relationships()
|
|
||||||
filter_external_imports()
|
|
||||||
qualify()
|
|
||||||
cross_module_deps_for()
|
|
||||||
subgraph_by_module()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Adapters: {
|
|
||||||
AsciiRenderer: {
|
|
||||||
shape: class
|
|
||||||
new()
|
|
||||||
format_kind()
|
|
||||||
}
|
|
||||||
D2Renderer: {
|
|
||||||
shape: class
|
|
||||||
level: DiagramLevel
|
|
||||||
new()
|
|
||||||
with_level()
|
|
||||||
}
|
|
||||||
CargoWorkspaceAnalyzer: {
|
|
||||||
shape: class
|
|
||||||
new()
|
|
||||||
}
|
|
||||||
WorkspaceToml: {
|
|
||||||
shape: class
|
|
||||||
workspace: Option
|
|
||||||
}
|
|
||||||
WorkspaceSection: {
|
|
||||||
shape: class
|
|
||||||
members: Vec
|
|
||||||
}
|
|
||||||
MemberToml: {
|
|
||||||
shape: class
|
|
||||||
package: Option
|
|
||||||
dependencies: HashMap
|
|
||||||
}
|
|
||||||
PackageSection: {
|
|
||||||
shape: class
|
|
||||||
name: String
|
|
||||||
}
|
|
||||||
PythonProjectAnalyzer: {
|
|
||||||
shape: class
|
|
||||||
new()
|
|
||||||
}
|
|
||||||
ProjectSection: {
|
|
||||||
shape: class
|
|
||||||
name: Option
|
|
||||||
dependencies: Vec
|
|
||||||
}
|
|
||||||
PoetrySection: {
|
|
||||||
shape: class
|
|
||||||
name: Option
|
|
||||||
dependencies: HashMap
|
|
||||||
}
|
|
||||||
ToolSection: {
|
|
||||||
shape: class
|
|
||||||
poetry: PoetrySection
|
|
||||||
}
|
|
||||||
PyprojectToml: {
|
|
||||||
shape: class
|
|
||||||
project: Option
|
|
||||||
tool: ToolSection
|
|
||||||
}
|
|
||||||
StdoutOutputWriter: {
|
|
||||||
shape: class
|
|
||||||
new()
|
|
||||||
}
|
|
||||||
FileOutputWriter: {
|
|
||||||
shape: class
|
|
||||||
output_path: OutputPath
|
|
||||||
new()
|
|
||||||
single_file()
|
|
||||||
}
|
|
||||||
OutputPath: {
|
|
||||||
shape: class
|
|
||||||
}
|
|
||||||
MermaidRenderer: {
|
|
||||||
shape: class
|
|
||||||
level: DiagramLevel
|
|
||||||
show_weights: bool
|
|
||||||
new()
|
|
||||||
with_level()
|
|
||||||
with_weights()
|
|
||||||
display_name()
|
|
||||||
format_element_name()
|
|
||||||
format_visibility()
|
|
||||||
render_class_diagram()
|
|
||||||
push_class_lines()
|
|
||||||
render_module_flowchart()
|
|
||||||
render_project_flowchart()
|
|
||||||
sanitize_id()
|
|
||||||
}
|
|
||||||
LanguageExtractor: {
|
|
||||||
shape: class
|
|
||||||
}
|
|
||||||
TreeSitterAnalyzer: {
|
|
||||||
shape: class
|
|
||||||
rust: RustExtractor
|
|
||||||
python: PythonExtractor
|
|
||||||
new()
|
|
||||||
extractor_for()
|
|
||||||
}
|
|
||||||
RustExtractor: {
|
|
||||||
shape: class
|
|
||||||
}
|
|
||||||
PythonExtractor: {
|
|
||||||
shape: class
|
|
||||||
}
|
|
||||||
WalkdirDiscovery: {
|
|
||||||
shape: class
|
|
||||||
new()
|
|
||||||
detect_language()
|
|
||||||
is_test_file()
|
|
||||||
is_excluded()
|
|
||||||
}
|
|
||||||
HtmlRenderer: {
|
|
||||||
shape: class
|
|
||||||
new()
|
|
||||||
}
|
|
||||||
GraphData: {
|
|
||||||
shape: class
|
|
||||||
nodes: Vec
|
|
||||||
edges: Vec
|
|
||||||
}
|
|
||||||
NodeData: {
|
|
||||||
shape: class
|
|
||||||
id: String
|
|
||||||
label: String
|
|
||||||
module: String
|
|
||||||
kind: String
|
|
||||||
fields: Vec
|
|
||||||
methods: Vec
|
|
||||||
}
|
|
||||||
EdgeData: {
|
|
||||||
shape: class
|
|
||||||
source: String
|
|
||||||
target: String
|
|
||||||
kind: String
|
|
||||||
}
|
|
||||||
RawRules: {
|
|
||||||
shape: class
|
|
||||||
allow: Vec
|
|
||||||
deny: Vec
|
|
||||||
}
|
|
||||||
RawConfig: {
|
|
||||||
shape: class
|
|
||||||
analysis: RawAnalysis
|
|
||||||
output: RawOutput
|
|
||||||
modules: HashMap
|
|
||||||
rules: RawRules
|
|
||||||
}
|
|
||||||
RawAnalysis: {
|
|
||||||
shape: class
|
|
||||||
exclude: Vec
|
|
||||||
level: Option
|
|
||||||
}
|
|
||||||
RawOutput: {
|
|
||||||
shape: class
|
|
||||||
format: Option
|
|
||||||
path: Option
|
|
||||||
split_by_module: bool
|
|
||||||
}
|
|
||||||
TomlConfigLoader: {
|
|
||||||
shape: class
|
|
||||||
raw: RawConfig
|
|
||||||
from_path()
|
|
||||||
parse_level()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Application: {
|
|
||||||
AnalyzeCodebase: {
|
|
||||||
shape: class
|
|
||||||
file_discovery: F
|
|
||||||
source_analyzer: S
|
|
||||||
new()
|
|
||||||
execute()
|
|
||||||
}
|
|
||||||
AnalyzeCodebaseResult: {
|
|
||||||
shape: class
|
|
||||||
graph: CodeGraph
|
|
||||||
warnings: Vec
|
|
||||||
graph()
|
|
||||||
warnings()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Presentation: {
|
|
||||||
Cli: {
|
|
||||||
shape: class
|
|
||||||
command: Option
|
|
||||||
path: PathBuf
|
|
||||||
level: String
|
|
||||||
format: String
|
|
||||||
output: Option
|
|
||||||
config: Option
|
|
||||||
scope: Option
|
|
||||||
exclude: Vec
|
|
||||||
include_tests: bool
|
|
||||||
no_weights: bool
|
|
||||||
watch: bool
|
|
||||||
since: Option
|
|
||||||
split_by_module: bool
|
|
||||||
strict: bool
|
|
||||||
check: bool
|
|
||||||
verbose: u8
|
|
||||||
}
|
|
||||||
Command: {
|
|
||||||
shape: class
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Adapters_AsciiRenderer -> Domain_DiagramRenderer: {style.stroke-dash: 0}
|
|
||||||
Adapters_D2Renderer -> Domain_DiagramLevel
|
|
||||||
Adapters_D2Renderer -> Domain_DiagramRenderer: {style.stroke-dash: 0}
|
|
||||||
Adapters_CargoWorkspaceAnalyzer -> Domain_ProjectAnalyzer: {style.stroke-dash: 0}
|
|
||||||
Adapters_ToolSection -> Adapters_PoetrySection
|
|
||||||
Adapters_PyprojectToml -> Adapters_ToolSection
|
|
||||||
Adapters_PythonProjectAnalyzer -> Domain_ProjectAnalyzer: {style.stroke-dash: 0}
|
|
||||||
Adapters_StdoutOutputWriter -> Domain_OutputWriter: {style.stroke-dash: 0}
|
|
||||||
Adapters_FileOutputWriter -> Adapters_OutputPath
|
|
||||||
Adapters_FileOutputWriter -> Domain_OutputWriter: {style.stroke-dash: 0}
|
|
||||||
Adapters_MermaidRenderer -> Domain_DiagramLevel
|
|
||||||
Adapters_MermaidRenderer -> Domain_DiagramRenderer: {style.stroke-dash: 0}
|
|
||||||
Adapters_TreeSitterAnalyzer -> Adapters_RustExtractor
|
|
||||||
Adapters_TreeSitterAnalyzer -> Adapters_PythonExtractor
|
|
||||||
Adapters_TreeSitterAnalyzer -> Domain_SourceAnalyzer: {style.stroke-dash: 0}
|
|
||||||
Adapters_RustExtractor -> Adapters_LanguageExtractor: {style.stroke-dash: 0}
|
|
||||||
Adapters_PythonExtractor -> Adapters_LanguageExtractor: {style.stroke-dash: 0}
|
|
||||||
Adapters_WalkdirDiscovery -> Domain_FileDiscovery: {style.stroke-dash: 0}
|
|
||||||
Adapters_HtmlRenderer -> Domain_DiagramRenderer: {style.stroke-dash: 0}
|
|
||||||
Adapters_RawConfig -> Adapters_RawAnalysis
|
|
||||||
Adapters_RawConfig -> Adapters_RawOutput
|
|
||||||
Adapters_RawConfig -> Adapters_RawRules
|
|
||||||
Adapters_TomlConfigLoader -> Adapters_RawConfig
|
|
||||||
Adapters_TomlConfigLoader -> Domain_ConfigLoader: {style.stroke-dash: 0}
|
|
||||||
Application_AnalyzeCodebaseResult -> Domain_CodeGraph
|
|
||||||
Domain_Relationship -> Domain_RelationshipKind
|
|
||||||
Domain_CodeElement -> Domain_CodeElementKind
|
|
||||||
Domain_CodeElement -> Domain_FilePath
|
|
||||||
Domain_CodeElement -> Domain_Visibility
|
|
||||||
Domain_AnalysisConfig -> Domain_DiagramLevel
|
|
||||||
Domain_AnalysisWarning -> Domain_FilePath
|
|
||||||
Domain_SourceFile -> Domain_FilePath
|
|
||||||
Domain_SourceFile -> Domain_Language
|
|
||||||
Domain_RuleViolation -> Domain_RuleKind
|
|
||||||
File diff suppressed because one or more lines are too long
|
Before Width: | Height: | Size: 179 KiB |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,9 +0,0 @@
|
|||||||
graph TD
|
|
||||||
Aiss_worker[Aiss_worker]
|
|
||||||
class aiss_worker_module["Aiss_worker"] {
|
|
||||||
<<module>>
|
|
||||||
}
|
|
||||||
class commons_module["Commons"] {
|
|
||||||
<<module>>
|
|
||||||
}
|
|
||||||
aiss_worker_module --> commons_module : 1 dep
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
graph TD
|
|
||||||
Api[Api]
|
|
||||||
class api_module["Api"] {
|
|
||||||
<<module>>
|
|
||||||
}
|
|
||||||
class commons_module["Commons"] {
|
|
||||||
<<module>>
|
|
||||||
}
|
|
||||||
api_module --> commons_module : 3 deps
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
graph TD
|
|
||||||
Commons[Commons]
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
graph TD
|
|
||||||
Aiss_worker[Aiss_worker]
|
|
||||||
Api[Api]
|
|
||||||
Worker[Worker]
|
|
||||||
Commons[Commons]
|
|
||||||
Worker -->|1 dep| Api
|
|
||||||
Aiss_worker -->|7 deps| Commons
|
|
||||||
Aiss_worker -->|1 dep| Api
|
|
||||||
Api -->|23 deps| Commons
|
|
||||||
Worker -->|12 deps| Commons
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
graph TD
|
|
||||||
Worker[Worker]
|
|
||||||
class worker_module["Worker"] {
|
|
||||||
<<module>>
|
|
||||||
}
|
|
||||||
class commons_module["Commons"] {
|
|
||||||
<<module>>
|
|
||||||
}
|
|
||||||
worker_module --> commons_module : 2 deps
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
graph TD
|
|
||||||
aiss_worker[aiss-worker]
|
|
||||||
commons[commons]
|
|
||||||
worker[worker]
|
|
||||||
api[api]
|
|
||||||
aiss_worker --> commons
|
|
||||||
worker --> commons
|
|
||||||
api --> commons
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
graph TD
|
|
||||||
Adapters[Adapters]
|
|
||||||
Presentation[Presentation]
|
|
||||||
Application[Application]
|
|
||||||
Domain[Domain]
|
|
||||||
Presentation -->|1 dep| Application
|
|
||||||
Application -->|2 deps| Domain
|
|
||||||
Presentation -->|11 deps| Adapters
|
|
||||||
Presentation -->|1 dep| Domain
|
|
||||||
Adapters -->|24 deps| Domain
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
graph TD
|
|
||||||
archlens_domain[archlens-domain]
|
|
||||||
archlens_application[archlens-application]
|
|
||||||
archlens[archlens]
|
|
||||||
subgraph Adapters
|
|
||||||
archlens_tree_sitter[archlens-tree-sitter]
|
|
||||||
archlens_walkdir[archlens-walkdir]
|
|
||||||
archlens_mermaid[archlens-mermaid]
|
|
||||||
archlens_ascii[archlens-ascii]
|
|
||||||
archlens_file_writer[archlens-file-writer]
|
|
||||||
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_file_writer
|
|
||||||
archlens --> archlens_domain
|
|
||||||
archlens --> archlens_cargo_workspace
|
|
||||||
archlens --> archlens_d2
|
|
||||||
archlens --> archlens_html
|
|
||||||
archlens --> archlens_mermaid
|
|
||||||
archlens --> archlens_toml_config
|
|
||||||
archlens --> archlens_python_project
|
|
||||||
archlens --> archlens_ascii
|
|
||||||
archlens --> archlens_tree_sitter
|
|
||||||
archlens --> archlens_application
|
|
||||||
archlens --> archlens_walkdir
|
|
||||||
archlens --> archlens_stdout_writer
|
|
||||||
archlens_tree_sitter --> archlens_domain
|
|
||||||
archlens_walkdir --> archlens_domain
|
|
||||||
archlens_mermaid --> archlens_domain
|
|
||||||
archlens_ascii --> archlens_domain
|
|
||||||
archlens_file_writer --> archlens_domain
|
|
||||||
archlens_stdout_writer --> archlens_domain
|
|
||||||
archlens_toml_config --> archlens_domain
|
|
||||||
archlens_cargo_workspace --> archlens_domain
|
|
||||||
archlens_python_project --> archlens_domain
|
|
||||||
archlens_d2 --> archlens_domain
|
|
||||||
archlens_html --> archlens_domain
|
|
||||||
@@ -1,137 +0,0 @@
|
|||||||
classDiagram
|
|
||||||
namespace Adapters {
|
|
||||||
class AsciiRenderer
|
|
||||||
class D2Renderer
|
|
||||||
class CargoWorkspaceAnalyzer
|
|
||||||
class WorkspaceToml
|
|
||||||
class WorkspaceSection
|
|
||||||
class MemberToml
|
|
||||||
class PackageSection
|
|
||||||
class PythonProjectAnalyzer
|
|
||||||
class ProjectSection
|
|
||||||
class PoetrySection
|
|
||||||
class ToolSection
|
|
||||||
class PyprojectToml
|
|
||||||
class StdoutOutputWriter
|
|
||||||
class FileOutputWriter
|
|
||||||
class OutputPath
|
|
||||||
class MermaidRenderer
|
|
||||||
class LanguageExtractor
|
|
||||||
class TreeSitterAnalyzer
|
|
||||||
class RustExtractor
|
|
||||||
class PythonExtractor
|
|
||||||
class WalkdirDiscovery
|
|
||||||
class HtmlRenderer
|
|
||||||
class GraphData
|
|
||||||
class NodeData
|
|
||||||
class EdgeData
|
|
||||||
class RawRules
|
|
||||||
class RawConfig
|
|
||||||
class RawAnalysis
|
|
||||||
class RawOutput
|
|
||||||
class TomlConfigLoader
|
|
||||||
}
|
|
||||||
AsciiRenderer : +new() -] Self
|
|
||||||
AsciiRenderer : -format_kind(element CodeElement) -] static str
|
|
||||||
D2Renderer : level DiagramLevel
|
|
||||||
D2Renderer : +new() -] Self
|
|
||||||
D2Renderer : +with_level(level DiagramLevel) -] Self
|
|
||||||
CargoWorkspaceAnalyzer : +new() -] Self
|
|
||||||
<<private>> WorkspaceToml
|
|
||||||
WorkspaceToml : workspace Option
|
|
||||||
<<private>> WorkspaceSection
|
|
||||||
WorkspaceSection : members Vec
|
|
||||||
<<private>> MemberToml
|
|
||||||
MemberToml : package Option
|
|
||||||
MemberToml : dependencies HashMap
|
|
||||||
<<private>> PackageSection
|
|
||||||
PackageSection : name String
|
|
||||||
PythonProjectAnalyzer : +new() -] Self
|
|
||||||
<<private>> ProjectSection
|
|
||||||
ProjectSection : name Option
|
|
||||||
ProjectSection : dependencies Vec
|
|
||||||
<<private>> PoetrySection
|
|
||||||
PoetrySection : name Option
|
|
||||||
PoetrySection : dependencies HashMap
|
|
||||||
<<private>> ToolSection
|
|
||||||
ToolSection : poetry PoetrySection
|
|
||||||
<<private>> PyprojectToml
|
|
||||||
PyprojectToml : project Option
|
|
||||||
PyprojectToml : tool ToolSection
|
|
||||||
StdoutOutputWriter : +new() -] Self
|
|
||||||
FileOutputWriter : output_path OutputPath
|
|
||||||
FileOutputWriter : +new(output_dir PathBuf) -] Self
|
|
||||||
FileOutputWriter : +single_file(path PathBuf) -] Self
|
|
||||||
<<private>> OutputPath
|
|
||||||
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
|
|
||||||
TreeSitterAnalyzer : rust RustExtractor
|
|
||||||
TreeSitterAnalyzer : python PythonExtractor
|
|
||||||
TreeSitterAnalyzer : +new() -] Self
|
|
||||||
TreeSitterAnalyzer : -extractor_for(language Language) -] Option[dyn LanguageExtractor]
|
|
||||||
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
|
|
||||||
HtmlRenderer : +new() -] Self
|
|
||||||
<<private>> GraphData
|
|
||||||
GraphData : nodes Vec
|
|
||||||
GraphData : edges Vec
|
|
||||||
<<private>> NodeData
|
|
||||||
NodeData : id String
|
|
||||||
NodeData : label String
|
|
||||||
NodeData : module String
|
|
||||||
NodeData : kind String
|
|
||||||
NodeData : fields Vec
|
|
||||||
NodeData : methods Vec
|
|
||||||
<<private>> EdgeData
|
|
||||||
EdgeData : source String
|
|
||||||
EdgeData : target String
|
|
||||||
EdgeData : kind String
|
|
||||||
<<private>> RawRules
|
|
||||||
RawRules : allow Vec
|
|
||||||
RawRules : deny Vec
|
|
||||||
<<private>> RawConfig
|
|
||||||
RawConfig : analysis RawAnalysis
|
|
||||||
RawConfig : output RawOutput
|
|
||||||
RawConfig : modules HashMap
|
|
||||||
RawConfig : rules RawRules
|
|
||||||
<<private>> RawAnalysis
|
|
||||||
RawAnalysis : exclude Vec
|
|
||||||
RawAnalysis : level Option
|
|
||||||
<<private>> RawOutput
|
|
||||||
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
|
|
||||||
ToolSection --> PoetrySection
|
|
||||||
PyprojectToml --> ToolSection
|
|
||||||
FileOutputWriter --> OutputPath
|
|
||||||
TreeSitterAnalyzer --> RustExtractor
|
|
||||||
TreeSitterAnalyzer --> PythonExtractor
|
|
||||||
RustExtractor <|-- LanguageExtractor
|
|
||||||
PythonExtractor <|-- LanguageExtractor
|
|
||||||
RawConfig --> RawAnalysis
|
|
||||||
RawConfig --> RawOutput
|
|
||||||
RawConfig --> RawRules
|
|
||||||
TomlConfigLoader --> RawConfig
|
|
||||||
class adapters_module["Adapters"] {
|
|
||||||
<<module>>
|
|
||||||
}
|
|
||||||
class domain_module["Domain"] {
|
|
||||||
<<module>>
|
|
||||||
}
|
|
||||||
adapters_module --> domain_module : 13 deps
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
classDiagram
|
|
||||||
namespace Application {
|
|
||||||
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, DomainError]
|
|
||||||
AnalyzeCodebaseResult : graph CodeGraph
|
|
||||||
AnalyzeCodebaseResult : warnings Vec
|
|
||||||
AnalyzeCodebaseResult : +graph() -] CodeGraph
|
|
||||||
AnalyzeCodebaseResult : +warnings() -] [AnalysisWarning]
|
|
||||||
class application_module["Application"] {
|
|
||||||
<<module>>
|
|
||||||
}
|
|
||||||
class domain_module["Domain"] {
|
|
||||||
<<module>>
|
|
||||||
}
|
|
||||||
application_module --> domain_module : 1 dep
|
|
||||||
@@ -1,168 +0,0 @@
|
|||||||
classDiagram
|
|
||||||
namespace Domain {
|
|
||||||
class Relationship
|
|
||||||
class CodeElement
|
|
||||||
class DomainError
|
|
||||||
class DiagramRenderer
|
|
||||||
class SourceAnalyzer
|
|
||||||
class ConfigLoader
|
|
||||||
class FileDiscovery
|
|
||||||
class ProjectAnalyzer
|
|
||||||
class OutputWriter
|
|
||||||
class AnalysisResult
|
|
||||||
class AnalysisConfig
|
|
||||||
class AnalysisWarning
|
|
||||||
class CodeElementKind
|
|
||||||
class RelationshipKind
|
|
||||||
class Visibility
|
|
||||||
class DiagramLevel
|
|
||||||
class OutputConfig
|
|
||||||
class RenderedFile
|
|
||||||
class RenderOutput
|
|
||||||
class ModuleName
|
|
||||||
class Language
|
|
||||||
class SourceFile
|
|
||||||
class FilePath
|
|
||||||
class RuleKind
|
|
||||||
class RuleViolation
|
|
||||||
class BoundaryRule
|
|
||||||
class CodeGraph
|
|
||||||
}
|
|
||||||
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]
|
|
||||||
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]
|
|
||||||
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]]
|
|
||||||
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
|
|
||||||
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]
|
|
||||||
RenderedFile : name String
|
|
||||||
RenderedFile : content String
|
|
||||||
RenderedFile : +new(name str, content str) -] Result[Self, DomainError]
|
|
||||||
RenderedFile : +name() -] str
|
|
||||||
RenderedFile : +content() -] str
|
|
||||||
RenderOutput : files Vec
|
|
||||||
RenderOutput : +new(files Vec[RenderedFile]) -] Self
|
|
||||||
RenderOutput : +single(file RenderedFile) -] Self
|
|
||||||
RenderOutput : +files() -] [RenderedFile]
|
|
||||||
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
|
|
||||||
SourceFile : path FilePath
|
|
||||||
SourceFile : language Language
|
|
||||||
SourceFile : +new(path FilePath, language Language) -] Self
|
|
||||||
SourceFile : +path() -] FilePath
|
|
||||||
SourceFile : +language() -] Language
|
|
||||||
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
|
|
||||||
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
|
|
||||||
Relationship --> RelationshipKind
|
|
||||||
CodeElement --> CodeElementKind
|
|
||||||
CodeElement --> FilePath
|
|
||||||
CodeElement --> Visibility
|
|
||||||
AnalysisConfig --> DiagramLevel
|
|
||||||
AnalysisWarning --> FilePath
|
|
||||||
SourceFile --> FilePath
|
|
||||||
SourceFile --> Language
|
|
||||||
RuleViolation --> RuleKind
|
|
||||||
@@ -1,343 +0,0 @@
|
|||||||
classDiagram
|
|
||||||
namespace Presentation {
|
|
||||||
class Cli
|
|
||||||
class Command
|
|
||||||
}
|
|
||||||
namespace Application {
|
|
||||||
class AnalyzeCodebase
|
|
||||||
class AnalyzeCodebaseResult
|
|
||||||
}
|
|
||||||
namespace Adapters {
|
|
||||||
class AsciiRenderer
|
|
||||||
class D2Renderer
|
|
||||||
class CargoWorkspaceAnalyzer
|
|
||||||
class WorkspaceToml
|
|
||||||
class WorkspaceSection
|
|
||||||
class MemberToml
|
|
||||||
class PackageSection
|
|
||||||
class PythonProjectAnalyzer
|
|
||||||
class ProjectSection
|
|
||||||
class PoetrySection
|
|
||||||
class ToolSection
|
|
||||||
class PyprojectToml
|
|
||||||
class StdoutOutputWriter
|
|
||||||
class FileOutputWriter
|
|
||||||
class OutputPath
|
|
||||||
class MermaidRenderer
|
|
||||||
class LanguageExtractor
|
|
||||||
class TreeSitterAnalyzer
|
|
||||||
class RustExtractor
|
|
||||||
class PythonExtractor
|
|
||||||
class WalkdirDiscovery
|
|
||||||
class HtmlRenderer
|
|
||||||
class GraphData
|
|
||||||
class NodeData
|
|
||||||
class EdgeData
|
|
||||||
class RawRules
|
|
||||||
class RawConfig
|
|
||||||
class RawAnalysis
|
|
||||||
class RawOutput
|
|
||||||
class TomlConfigLoader
|
|
||||||
}
|
|
||||||
namespace Domain {
|
|
||||||
class Relationship
|
|
||||||
class CodeElement
|
|
||||||
class DomainError
|
|
||||||
class DiagramRenderer
|
|
||||||
class SourceAnalyzer
|
|
||||||
class ConfigLoader
|
|
||||||
class FileDiscovery
|
|
||||||
class ProjectAnalyzer
|
|
||||||
class OutputWriter
|
|
||||||
class AnalysisResult
|
|
||||||
class AnalysisConfig
|
|
||||||
class AnalysisWarning
|
|
||||||
class CodeElementKind
|
|
||||||
class RelationshipKind
|
|
||||||
class Visibility
|
|
||||||
class DiagramLevel
|
|
||||||
class OutputConfig
|
|
||||||
class RenderedFile
|
|
||||||
class RenderOutput
|
|
||||||
class ModuleName
|
|
||||||
class Language
|
|
||||||
class SourceFile
|
|
||||||
class FilePath
|
|
||||||
class RuleKind
|
|
||||||
class RuleViolation
|
|
||||||
class BoundaryRule
|
|
||||||
class CodeGraph
|
|
||||||
}
|
|
||||||
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
|
|
||||||
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]
|
|
||||||
AsciiRenderer : +new() -] Self
|
|
||||||
AsciiRenderer : -format_kind(element CodeElement) -] static str
|
|
||||||
D2Renderer : level DiagramLevel
|
|
||||||
D2Renderer : +new() -] Self
|
|
||||||
D2Renderer : +with_level(level DiagramLevel) -] Self
|
|
||||||
CargoWorkspaceAnalyzer : +new() -] Self
|
|
||||||
<<private>> WorkspaceToml
|
|
||||||
WorkspaceToml : workspace Option
|
|
||||||
<<private>> WorkspaceSection
|
|
||||||
WorkspaceSection : members Vec
|
|
||||||
<<private>> MemberToml
|
|
||||||
MemberToml : package Option
|
|
||||||
MemberToml : dependencies HashMap
|
|
||||||
<<private>> PackageSection
|
|
||||||
PackageSection : name String
|
|
||||||
PythonProjectAnalyzer : +new() -] Self
|
|
||||||
<<private>> ProjectSection
|
|
||||||
ProjectSection : name Option
|
|
||||||
ProjectSection : dependencies Vec
|
|
||||||
<<private>> PoetrySection
|
|
||||||
PoetrySection : name Option
|
|
||||||
PoetrySection : dependencies HashMap
|
|
||||||
<<private>> ToolSection
|
|
||||||
ToolSection : poetry PoetrySection
|
|
||||||
<<private>> PyprojectToml
|
|
||||||
PyprojectToml : project Option
|
|
||||||
PyprojectToml : tool ToolSection
|
|
||||||
StdoutOutputWriter : +new() -] Self
|
|
||||||
FileOutputWriter : output_path OutputPath
|
|
||||||
FileOutputWriter : +new(output_dir PathBuf) -] Self
|
|
||||||
FileOutputWriter : +single_file(path PathBuf) -] Self
|
|
||||||
<<private>> OutputPath
|
|
||||||
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
|
|
||||||
TreeSitterAnalyzer : rust RustExtractor
|
|
||||||
TreeSitterAnalyzer : python PythonExtractor
|
|
||||||
TreeSitterAnalyzer : +new() -] Self
|
|
||||||
TreeSitterAnalyzer : -extractor_for(language Language) -] Option[dyn LanguageExtractor]
|
|
||||||
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
|
|
||||||
HtmlRenderer : +new() -] Self
|
|
||||||
<<private>> GraphData
|
|
||||||
GraphData : nodes Vec
|
|
||||||
GraphData : edges Vec
|
|
||||||
<<private>> NodeData
|
|
||||||
NodeData : id String
|
|
||||||
NodeData : label String
|
|
||||||
NodeData : module String
|
|
||||||
NodeData : kind String
|
|
||||||
NodeData : fields Vec
|
|
||||||
NodeData : methods Vec
|
|
||||||
<<private>> EdgeData
|
|
||||||
EdgeData : source String
|
|
||||||
EdgeData : target String
|
|
||||||
EdgeData : kind String
|
|
||||||
<<private>> RawRules
|
|
||||||
RawRules : allow Vec
|
|
||||||
RawRules : deny Vec
|
|
||||||
<<private>> RawConfig
|
|
||||||
RawConfig : analysis RawAnalysis
|
|
||||||
RawConfig : output RawOutput
|
|
||||||
RawConfig : modules HashMap
|
|
||||||
RawConfig : rules RawRules
|
|
||||||
<<private>> RawAnalysis
|
|
||||||
RawAnalysis : exclude Vec
|
|
||||||
RawAnalysis : level Option
|
|
||||||
<<private>> RawOutput
|
|
||||||
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
|
|
||||||
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]
|
|
||||||
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]
|
|
||||||
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]]
|
|
||||||
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
|
|
||||||
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]
|
|
||||||
RenderedFile : name String
|
|
||||||
RenderedFile : content String
|
|
||||||
RenderedFile : +new(name str, content str) -] Result[Self, DomainError]
|
|
||||||
RenderedFile : +name() -] str
|
|
||||||
RenderedFile : +content() -] str
|
|
||||||
RenderOutput : files Vec
|
|
||||||
RenderOutput : +new(files Vec[RenderedFile]) -] Self
|
|
||||||
RenderOutput : +single(file RenderedFile) -] Self
|
|
||||||
RenderOutput : +files() -] [RenderedFile]
|
|
||||||
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
|
|
||||||
SourceFile : path FilePath
|
|
||||||
SourceFile : language Language
|
|
||||||
SourceFile : +new(path FilePath, language Language) -] Self
|
|
||||||
SourceFile : +path() -] FilePath
|
|
||||||
SourceFile : +language() -] Language
|
|
||||||
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
|
|
||||||
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
|
|
||||||
AsciiRenderer <|-- DiagramRenderer
|
|
||||||
D2Renderer --> DiagramLevel
|
|
||||||
D2Renderer <|-- DiagramRenderer
|
|
||||||
CargoWorkspaceAnalyzer <|-- ProjectAnalyzer
|
|
||||||
ToolSection --> PoetrySection
|
|
||||||
PyprojectToml --> ToolSection
|
|
||||||
PythonProjectAnalyzer <|-- ProjectAnalyzer
|
|
||||||
StdoutOutputWriter <|-- OutputWriter
|
|
||||||
FileOutputWriter --> OutputPath
|
|
||||||
FileOutputWriter <|-- OutputWriter
|
|
||||||
MermaidRenderer --> DiagramLevel
|
|
||||||
MermaidRenderer <|-- DiagramRenderer
|
|
||||||
TreeSitterAnalyzer --> RustExtractor
|
|
||||||
TreeSitterAnalyzer --> PythonExtractor
|
|
||||||
TreeSitterAnalyzer <|-- SourceAnalyzer
|
|
||||||
RustExtractor <|-- LanguageExtractor
|
|
||||||
PythonExtractor <|-- LanguageExtractor
|
|
||||||
WalkdirDiscovery <|-- FileDiscovery
|
|
||||||
HtmlRenderer <|-- DiagramRenderer
|
|
||||||
RawConfig --> RawAnalysis
|
|
||||||
RawConfig --> RawOutput
|
|
||||||
RawConfig --> RawRules
|
|
||||||
TomlConfigLoader --> RawConfig
|
|
||||||
TomlConfigLoader <|-- ConfigLoader
|
|
||||||
AnalyzeCodebaseResult --> CodeGraph
|
|
||||||
Relationship --> RelationshipKind
|
|
||||||
CodeElement --> CodeElementKind
|
|
||||||
CodeElement --> FilePath
|
|
||||||
CodeElement --> Visibility
|
|
||||||
AnalysisConfig --> DiagramLevel
|
|
||||||
AnalysisWarning --> FilePath
|
|
||||||
SourceFile --> FilePath
|
|
||||||
SourceFile --> Language
|
|
||||||
RuleViolation --> RuleKind
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
classDiagram
|
|
||||||
namespace Presentation {
|
|
||||||
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
|
|
||||||
Reference in New Issue
Block a user