RequirementsBuildFileUpdater.kt

package com.depanalyzer.update

import com.depanalyzer.security.InputSafety
import java.io.File

class RequirementsBuildFileUpdater : BuildFileUpdater {
    override fun applyUpdate(buildFile: File, suggestion: UpdateSuggestion): Boolean {
        if (!InputSafety.isSafeVersion(suggestion.newVersion)) return false
        if (!buildFile.exists() || !buildFile.isFile || buildFile.name != "requirements.txt") return false

        val packageName = suggestion.artifactId
        val lines = buildFile.readLines().toMutableList()
        var changed = false

        for (index in lines.indices) {
            val original = lines[index]
            val clean = original.substringBefore('#').trim()
            if (clean.isBlank()) continue

            val nameMatch = Regex("""^([A-Za-z0-9_.-]+)""").find(clean) ?: continue
            val currentName = nameMatch.groupValues[1].lowercase().replace('_', '-')
            if (!currentName.equals(packageName, ignoreCase = true)) continue

            val suffixComment = if (original.contains('#')) " #${original.substringAfter('#').trim()}" else ""
            lines[index] = "$currentName==${suggestion.newVersion}$suffixComment"
            changed = true
            break
        }

        if (!changed && suggestion.targetType == UpdateTargetType.TRANSITIVE_OVERRIDE) {
            lines.add("$packageName==${suggestion.newVersion}")
            changed = true
        }

        if (!changed) return false
        buildFile.writeText(lines.joinToString("\n") + "\n")
        return true
    }
}