Skip to content

Commit dba7811

Browse files
feat: enhance project type detection for Terraform and Ansible
- Added support for detecting Terraform projects based on main.tf and related files. - Implemented detection for Ansible projects by checking for YAML playbooks in an 'ansible' directory. - Updated tests to verify detection functionality for both project types.
1 parent 27a0daf commit dba7811

4 files changed

Lines changed: 72 additions & 4 deletions

File tree

Cargo.lock

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/indexer/src/detect.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ pub enum ProjectType {
99
Go,
1010
Java,
1111
DotNet,
12+
Terraform,
13+
Ansible,
1214
Other,
1315
}
1416

@@ -21,6 +23,8 @@ impl ProjectType {
2123
ProjectType::Go => "go",
2224
ProjectType::Java => "java",
2325
ProjectType::DotNet => ".net",
26+
ProjectType::Terraform => "terraform",
27+
ProjectType::Ansible => "ansible",
2428
ProjectType::Other => "other",
2529
}
2630
}
@@ -35,6 +39,8 @@ pub fn detect_project_type(dir: &Path) -> Option<ProjectType> {
3539
(ProjectType::Go, &["go.mod"][..]),
3640
(ProjectType::Java, &["pom.xml", "build.gradle", "gradlew"]),
3741
(ProjectType::DotNet, &["global.json"][..]),
42+
(ProjectType::Terraform, &["main.tf", "variables.tf", "outputs.tf"][..]),
43+
(ProjectType::Ansible, &[]), // Special case - handled below
3844
];
3945

4046
for (ptype, files) in candidates.iter() {
@@ -54,6 +60,21 @@ pub fn detect_project_type(dir: &Path) -> Option<ProjectType> {
5460
}
5561
}
5662
}
63+
64+
// Special detection for Ansible
65+
let ansible_dir = dir.join("ansible");
66+
if ansible_dir.is_dir() {
67+
if let Ok(entries) = fs::read_dir(&ansible_dir) {
68+
for entry in entries.flatten() {
69+
if let Some(ext) = entry.path().extension() {
70+
if ext == "yml" || ext == "yaml" {
71+
return Some(ProjectType::Ansible);
72+
}
73+
}
74+
}
75+
}
76+
}
77+
5778
None
5879
}
5980

crates/indexer/tests/basic.rs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use indexer::{scan_roots, AppConfig, Db, ScanOptions};
1+
use indexer::{scan_roots, AppConfig, Db, ScanOptions, detect::{detect_project_type, ProjectType}};
22
use std::fs;
33
use std::io::Write;
44

@@ -29,3 +29,30 @@ fn scans_minimal_node_project() {
2929
assert_eq!(rows[0].project_type.as_deref(), Some("node"));
3030
assert!(rows[0].size_bytes.unwrap_or(0) > 0);
3131
}
32+
33+
#[test]
34+
fn detects_terraform_project() {
35+
let dir = tempfile::tempdir().unwrap();
36+
let proj = dir.path().join("terraform-project");
37+
fs::create_dir_all(&proj).unwrap();
38+
39+
// Create a main.tf file
40+
fs::write(proj.join("main.tf"), "resource \"aws_instance\" \"example\" {}").unwrap();
41+
42+
let project_type = detect_project_type(&proj);
43+
assert_eq!(project_type, Some(ProjectType::Terraform));
44+
}
45+
46+
#[test]
47+
fn detects_ansible_project() {
48+
let dir = tempfile::tempdir().unwrap();
49+
let proj = dir.path().join("ansible-project");
50+
fs::create_dir_all(&proj).unwrap();
51+
52+
// Create an ansible directory with a playbook
53+
fs::create_dir_all(proj.join("ansible")).unwrap();
54+
fs::write(proj.join("ansible").join("playbook.yml"), "- hosts: all\n tasks:\n - debug: msg=hello").unwrap();
55+
56+
let project_type = detect_project_type(&proj);
57+
assert_eq!(project_type, Some(ProjectType::Ansible));
58+
}

test-detection.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
use std::path::Path;
2+
use indexer::detect::{detect_project_type, ProjectType};
3+
4+
fn main() {
5+
let test_dirs = vec![
6+
"test-repo",
7+
"test-repo/terraform",
8+
"test-repo/terraform/aws",
9+
"test-repo/ansible",
10+
];
11+
12+
for dir in test_dirs {
13+
let path = Path::new(dir);
14+
if let Some(project_type) = detect_project_type(path) {
15+
println!("{}: {:?}", dir, project_type.as_str());
16+
} else {
17+
println!("{}: None", dir);
18+
}
19+
}
20+
}

0 commit comments

Comments
 (0)