in doc-architect/doc-architect-core/src/main/java/com/docarchitect/core/scanner/impl/python/PipPoetryDependencyScanner.java [179:245]
public ScanResult scan(ScanContext context) {
log.info("Scanning Python dependencies in: {}", context.rootPath());
List<Dependency> dependencies = new ArrayList<>();
List<Component> components = new ArrayList<>();
String sourceComponentId = IdGenerator.generate(context.rootPath().toString());
// Create component for the Python project
Component pythonProject = new Component(
sourceComponentId,
context.rootPath().getFileName().toString(),
ComponentType.LIBRARY,
PYTHON_PROJECT_DESCRIPTION,
PYTHON_LANGUAGE,
null,
Map.of()
);
components.add(pythonProject);
// Parse requirements.txt files
context.findFiles(PATTERN_REQUIREMENTS).forEach(file -> {
try {
parseRequirementsTxt(file, sourceComponentId, dependencies);
} catch (IOException e) {
log.warn("Failed to parse requirements file: {} - {}", file, e.getMessage());
}
});
// Parse pyproject.toml files
context.findFiles(PATTERN_PYPROJECT).forEach(file -> {
try {
parsePyprojectToml(file, sourceComponentId, dependencies);
} catch (IOException e) {
log.warn("Failed to parse pyproject.toml: {} - {}", file, e.getMessage());
}
});
// Parse setup.py files
context.findFiles(PATTERN_SETUP_PY).forEach(file -> {
try {
parseSetupPy(file, sourceComponentId, dependencies);
} catch (IOException e) {
log.warn("Failed to parse setup.py: {} - {}", file, e.getMessage());
}
});
// Parse Pipfile
context.findFiles(PATTERN_PIPFILE).forEach(file -> {
try {
parsePipfile(file, sourceComponentId, dependencies);
} catch (IOException e) {
log.warn("Failed to parse Pipfile: {} - {}", file, e.getMessage());
}
});
log.info("Found {} Python dependencies", dependencies.size());
return buildSuccessResult(
components,
dependencies,
List.of(),
List.of(),
List.of(),
List.of(),
List.of()
);
}