class Dependabot::Uv::FileUpdater::PyprojectPreparer
def freeze_top_level_dependencies_except(dependencies)
rubocop:disable Metrics/PerceivedComplexity
def freeze_top_level_dependencies_except(dependencies) return pyproject_content unless lockfile pyproject_object = TomlRB.parse(pyproject_content) poetry_object = pyproject_object["tool"]["poetry"] excluded_names = dependencies.map(&:name) + ["python"] Dependabot::Uv::FileParser::PyprojectFilesParser::POETRY_DEPENDENCY_TYPES.each do |key| next unless poetry_object[key] source_types = %w(directory file url) poetry_object.fetch(key).each do |dep_name, _| next if excluded_names.include?(normalise(dep_name)) locked_details = locked_details(dep_name) next unless (locked_version = locked_details&.fetch("version")) next if source_types.include?(locked_details&.dig("source", "type")) if locked_details&.dig("source", "type") == "git" poetry_object[key][dep_name] = { "git" => locked_details&.dig("source", "url"), "rev" => locked_details&.dig("source", "reference") } subdirectory = locked_details&.dig("source", "subdirectory") poetry_object[key][dep_name]["subdirectory"] = subdirectory if subdirectory elsif poetry_object[key][dep_name].is_a?(Hash) poetry_object[key][dep_name]["version"] = locked_version elsif poetry_object[key][dep_name].is_a?(Array) # if it has multiple-constraints, locking to a single version is # going to result in a bad lockfile, ignore next else poetry_object[key][dep_name] = locked_version end end end TomlRB.dump(pyproject_object) end