dependabot-cargo 0.326.0 → 0.326.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 649b2e05f391db12ac0c0a2b684c1307d08c0f70d63cda70fbcf38b684b0ced6
         | 
| 4 | 
            +
              data.tar.gz: 2d99e07be08c7d16413c23a93fa05475aa8958fb32690e8685a9ffa5cd2fc3a0
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 7edc7ef35e787abbc520058bf77514c0ac6837cee2f1bfafe02cac7e5b698d58459f22a7a01f02d5ea00d5515a7506bdf6e64103a2675feac0d4f4841a1d7787
         | 
| 7 | 
            +
              data.tar.gz: 871c65564b60b9d5a3a29a61ec56b86a5b8ddb302b6ac5db11e965fc6eb75272793bb67898ed8fe823ffbf10ff7c9f3fb3dbe361c340cb372145af65becf6f1f
         | 
| @@ -121,6 +121,10 @@ module Dependabot | |
| 121 121 |  | 
| 122 122 | 
             
                      DEPENDENCY_TYPES.each do |type|
         | 
| 123 123 | 
             
                        parsed_content.fetch(type, {}).each do |name, requirement|
         | 
| 124 | 
            +
                          # Skip workspace-inherited dependencies (similar to pnpm catalog)
         | 
| 125 | 
            +
                          # Only skip if workspace is exactly boolean true
         | 
| 126 | 
            +
                          next if requirement.is_a?(Hash) && requirement["workspace"] == true
         | 
| 127 | 
            +
             | 
| 124 128 | 
             
                          next unless name == name_from_declaration(name, requirement)
         | 
| 125 129 | 
             
                          next if lockfile && !version_from_lockfile(name, requirement)
         | 
| 126 130 |  | 
| @@ -129,6 +133,10 @@ module Dependabot | |
| 129 133 |  | 
| 130 134 | 
             
                        parsed_content.fetch("target", {}).each do |_, t_details|
         | 
| 131 135 | 
             
                          t_details.fetch(type, {}).each do |name, requirement|
         | 
| 136 | 
            +
                            # Skip workspace-inherited dependencies
         | 
| 137 | 
            +
                            # Only skip if workspace is exactly boolean true
         | 
| 138 | 
            +
                            next if requirement.is_a?(Hash) && requirement["workspace"] == true
         | 
| 139 | 
            +
             | 
| 132 140 | 
             
                            next unless name == name_from_declaration(name, requirement)
         | 
| 133 141 | 
             
                            next if lockfile && !version_from_lockfile(name, requirement)
         | 
| 134 142 |  | 
| @@ -0,0 +1,142 @@ | |
| 1 | 
            +
            # typed: strict
         | 
| 2 | 
            +
            # frozen_string_literal: true
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            require "sorbet-runtime"
         | 
| 5 | 
            +
            require "dependabot/cargo/file_updater"
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            module Dependabot
         | 
| 8 | 
            +
              module Cargo
         | 
| 9 | 
            +
                class FileUpdater
         | 
| 10 | 
            +
                  class WorkspaceManifestUpdater
         | 
| 11 | 
            +
                    extend T::Sig
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                    sig { params(dependencies: T::Array[Dependabot::Dependency], manifest: Dependabot::DependencyFile).void }
         | 
| 14 | 
            +
                    def initialize(dependencies:, manifest:)
         | 
| 15 | 
            +
                      @dependencies = T.let(dependencies, T::Array[Dependabot::Dependency])
         | 
| 16 | 
            +
                      @manifest = T.let(manifest, Dependabot::DependencyFile)
         | 
| 17 | 
            +
                    end
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                    sig { returns(String) }
         | 
| 20 | 
            +
                    def updated_manifest_content
         | 
| 21 | 
            +
                      workspace_deps = dependencies.select { |dep| workspace_dependency?(dep) }
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                      return T.must(manifest.content) if workspace_deps.empty?
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                      T.must(workspace_deps.reduce(manifest.content.dup) do |content, dep|
         | 
| 26 | 
            +
                        update_workspace_dependency(T.must(content), dep)
         | 
| 27 | 
            +
                      end)
         | 
| 28 | 
            +
                    end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                    private
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                    sig { returns(T::Array[Dependabot::Dependency]) }
         | 
| 33 | 
            +
                    attr_reader :dependencies
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                    sig { returns(Dependabot::DependencyFile) }
         | 
| 36 | 
            +
                    attr_reader :manifest
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                    sig { params(dep: Dependabot::Dependency).returns(T::Boolean) }
         | 
| 39 | 
            +
                    def workspace_dependency?(dep)
         | 
| 40 | 
            +
                      dep.requirements.any? { |r| r[:groups]&.include?("workspace.dependencies") }
         | 
| 41 | 
            +
                    end
         | 
| 42 | 
            +
             | 
| 43 | 
            +
                    sig { params(content: String, dep: Dependabot::Dependency).returns(String) }
         | 
| 44 | 
            +
                    def update_workspace_dependency(content, dep)
         | 
| 45 | 
            +
                      old_req = find_workspace_requirement(dep.previous_requirements)
         | 
| 46 | 
            +
                      new_req = find_workspace_requirement(dep.requirements)
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                      return content if old_req == new_req || !old_req || !new_req
         | 
| 49 | 
            +
             | 
| 50 | 
            +
                      # First try to update in the inline [workspace.dependencies] section
         | 
| 51 | 
            +
                      workspace_section_regex = /\[workspace\.dependencies\](.*?)(?=\n\[|\n*\z)/m
         | 
| 52 | 
            +
             | 
| 53 | 
            +
                      updated_content = content.gsub(workspace_section_regex) do |section|
         | 
| 54 | 
            +
                        update_version_in_section(section, dep.name, old_req, new_req)
         | 
| 55 | 
            +
                      end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                      # If content didn't change, try table header notation [workspace.dependencies.name]
         | 
| 58 | 
            +
                      if updated_content == content
         | 
| 59 | 
            +
                        updated_content = update_table_header_notation(content, dep.name, old_req, new_req)
         | 
| 60 | 
            +
                      end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                      updated_content
         | 
| 63 | 
            +
                    end
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                    sig { params(requirements: T.nilable(T::Array[T::Hash[Symbol, T.untyped]])).returns(T.nilable(String)) }
         | 
| 66 | 
            +
                    def find_workspace_requirement(requirements)
         | 
| 67 | 
            +
                      requirements&.find { |r| r[:groups]&.include?("workspace.dependencies") }
         | 
| 68 | 
            +
                                  &.fetch(:requirement)
         | 
| 69 | 
            +
                    end
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                    sig { params(section: String, dep_name: String, old_req: String, new_req: String).returns(String) }
         | 
| 72 | 
            +
                    def update_version_in_section(section, dep_name, old_req, new_req)
         | 
| 73 | 
            +
                      # Try double-quoted version first
         | 
| 74 | 
            +
                      updated = section.gsub(
         | 
| 75 | 
            +
                        /^(\s*#{Regexp.escape(dep_name)}\s*=\s*)"#{Regexp.escape(old_req)}"/m,
         | 
| 76 | 
            +
                        "\\1\"#{new_req}\""
         | 
| 77 | 
            +
                      )
         | 
| 78 | 
            +
                      return updated if updated != section
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                      # Try single-quoted version
         | 
| 81 | 
            +
                      updated = section.gsub(
         | 
| 82 | 
            +
                        /^(\s*#{Regexp.escape(dep_name)}\s*=\s*)'#{Regexp.escape(old_req)}'/m,
         | 
| 83 | 
            +
                        "\\1'#{new_req}'"
         | 
| 84 | 
            +
                      )
         | 
| 85 | 
            +
                      return updated if updated != section
         | 
| 86 | 
            +
             | 
| 87 | 
            +
                      # Try unquoted version
         | 
| 88 | 
            +
                      updated = section.gsub(
         | 
| 89 | 
            +
                        /^(\s*#{Regexp.escape(dep_name)}\s*=\s*)#{Regexp.escape(old_req)}(\s|$)/m,
         | 
| 90 | 
            +
                        "\\1#{new_req}\\2"
         | 
| 91 | 
            +
                      )
         | 
| 92 | 
            +
                      return updated if updated != section
         | 
| 93 | 
            +
             | 
| 94 | 
            +
                      # Try inline table format with double quotes
         | 
| 95 | 
            +
                      updated = section.gsub(
         | 
| 96 | 
            +
                        /^(\s*#{Regexp.escape(dep_name)}\s*=\s*\{[^}]*version\s*=\s*)"#{Regexp.escape(old_req)}"/m,
         | 
| 97 | 
            +
                        "\\1\"#{new_req}\""
         | 
| 98 | 
            +
                      )
         | 
| 99 | 
            +
                      return updated if updated != section
         | 
| 100 | 
            +
             | 
| 101 | 
            +
                      # Try inline table format with single quotes
         | 
| 102 | 
            +
                      section.gsub(
         | 
| 103 | 
            +
                        /^(\s*#{Regexp.escape(dep_name)}\s*=\s*\{[^}]*version\s*=\s*)'#{Regexp.escape(old_req)}'/m,
         | 
| 104 | 
            +
                        "\\1'#{new_req}'"
         | 
| 105 | 
            +
                      )
         | 
| 106 | 
            +
                    end
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                    sig { params(content: String, dep_name: String, old_req: String, new_req: String).returns(String) }
         | 
| 109 | 
            +
                    def update_table_header_notation(content, dep_name, old_req, new_req)
         | 
| 110 | 
            +
                      # Match [workspace.dependencies.name] section and its content until next section
         | 
| 111 | 
            +
                      table_header_regex = /\[workspace\.dependencies\.#{Regexp.escape(dep_name)}\](.*?)(?=\n\[|\n*\z)/m
         | 
| 112 | 
            +
             | 
| 113 | 
            +
                      content.gsub(table_header_regex) do |section|
         | 
| 114 | 
            +
                        # Update version = "..." line within this section (double quotes)
         | 
| 115 | 
            +
                        updated = section.gsub(
         | 
| 116 | 
            +
                          /^(\s*version\s*=\s*)"#{Regexp.escape(old_req)}"/m,
         | 
| 117 | 
            +
                          "\\1\"#{new_req}\""
         | 
| 118 | 
            +
                        )
         | 
| 119 | 
            +
             | 
| 120 | 
            +
                        # Try single quotes if double quotes didn't match
         | 
| 121 | 
            +
                        if updated == section
         | 
| 122 | 
            +
                          updated = section.gsub(
         | 
| 123 | 
            +
                            /^(\s*version\s*=\s*)'#{Regexp.escape(old_req)}'/m,
         | 
| 124 | 
            +
                            "\\1'#{new_req}'"
         | 
| 125 | 
            +
                          )
         | 
| 126 | 
            +
                        end
         | 
| 127 | 
            +
             | 
| 128 | 
            +
                        # Also try unquoted version
         | 
| 129 | 
            +
                        if updated == section
         | 
| 130 | 
            +
                          updated = section.gsub(
         | 
| 131 | 
            +
                            /^(\s*version\s*=\s*)#{Regexp.escape(old_req)}(\s|$)/m,
         | 
| 132 | 
            +
                            "\\1#{new_req}\\2"
         | 
| 133 | 
            +
                          )
         | 
| 134 | 
            +
                        end
         | 
| 135 | 
            +
             | 
| 136 | 
            +
                        updated
         | 
| 137 | 
            +
                      end
         | 
| 138 | 
            +
                    end
         | 
| 139 | 
            +
                  end
         | 
| 140 | 
            +
                end
         | 
| 141 | 
            +
              end
         | 
| 142 | 
            +
            end
         | 
| @@ -16,6 +16,7 @@ module Dependabot | |
| 16 16 |  | 
| 17 17 | 
             
                  require_relative "file_updater/manifest_updater"
         | 
| 18 18 | 
             
                  require_relative "file_updater/lockfile_updater"
         | 
| 19 | 
            +
                  require_relative "file_updater/workspace_manifest_updater"
         | 
| 19 20 |  | 
| 20 21 | 
             
                  sig { override.returns(T::Array[Regexp]) }
         | 
| 21 22 | 
             
                  def self.updated_files_regex
         | 
| @@ -60,10 +61,18 @@ module Dependabot | |
| 60 61 |  | 
| 61 62 | 
             
                  sig { params(file: Dependabot::DependencyFile).returns(String) }
         | 
| 62 63 | 
             
                  def updated_manifest_content(file)
         | 
| 63 | 
            -
                     | 
| 64 | 
            -
             | 
| 65 | 
            -
                       | 
| 66 | 
            -
             | 
| 64 | 
            +
                    # Use workspace updater for root workspace manifests
         | 
| 65 | 
            +
                    if workspace_root_manifest?(file)
         | 
| 66 | 
            +
                      WorkspaceManifestUpdater.new(
         | 
| 67 | 
            +
                        dependencies: dependencies,
         | 
| 68 | 
            +
                        manifest: file
         | 
| 69 | 
            +
                      ).updated_manifest_content
         | 
| 70 | 
            +
                    else
         | 
| 71 | 
            +
                      ManifestUpdater.new(
         | 
| 72 | 
            +
                        dependencies: dependencies,
         | 
| 73 | 
            +
                        manifest: file
         | 
| 74 | 
            +
                      ).updated_manifest_content
         | 
| 75 | 
            +
                    end
         | 
| 67 76 | 
             
                  end
         | 
| 68 77 |  | 
| 69 78 | 
             
                  sig { returns(String) }
         | 
| @@ -92,6 +101,16 @@ module Dependabot | |
| 92 101 | 
             
                  def lockfile
         | 
| 93 102 | 
             
                    @lockfile ||= T.let(get_original_file("Cargo.lock"), T.nilable(Dependabot::DependencyFile))
         | 
| 94 103 | 
             
                  end
         | 
| 104 | 
            +
             | 
| 105 | 
            +
                  sig { params(file: Dependabot::DependencyFile).returns(T::Boolean) }
         | 
| 106 | 
            +
                  def workspace_root_manifest?(file)
         | 
| 107 | 
            +
                    return false unless file.name == "Cargo.toml"
         | 
| 108 | 
            +
             | 
| 109 | 
            +
                    parsed_file = TomlRB.parse(file.content)
         | 
| 110 | 
            +
                    parsed_file.key?("workspace") && parsed_file["workspace"].key?("dependencies")
         | 
| 111 | 
            +
                  rescue TomlRB::ParseError
         | 
| 112 | 
            +
                    false
         | 
| 113 | 
            +
                  end
         | 
| 95 114 | 
             
                end
         | 
| 96 115 | 
             
              end
         | 
| 97 116 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: dependabot-cargo
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.326. | 
| 4 | 
            +
              version: 0.326.1
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Dependabot
         | 
| @@ -15,14 +15,14 @@ dependencies: | |
| 15 15 | 
             
                requirements:
         | 
| 16 16 | 
             
                - - '='
         | 
| 17 17 | 
             
                  - !ruby/object:Gem::Version
         | 
| 18 | 
            -
                    version: 0.326. | 
| 18 | 
            +
                    version: 0.326.1
         | 
| 19 19 | 
             
              type: :runtime
         | 
| 20 20 | 
             
              prerelease: false
         | 
| 21 21 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 22 22 | 
             
                requirements:
         | 
| 23 23 | 
             
                - - '='
         | 
| 24 24 | 
             
                  - !ruby/object:Gem::Version
         | 
| 25 | 
            -
                    version: 0.326. | 
| 25 | 
            +
                    version: 0.326.1
         | 
| 26 26 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 27 27 | 
             
              name: debug
         | 
| 28 28 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -247,6 +247,7 @@ files: | |
| 247 247 | 
             
            - lib/dependabot/cargo/file_updater.rb
         | 
| 248 248 | 
             
            - lib/dependabot/cargo/file_updater/lockfile_updater.rb
         | 
| 249 249 | 
             
            - lib/dependabot/cargo/file_updater/manifest_updater.rb
         | 
| 250 | 
            +
            - lib/dependabot/cargo/file_updater/workspace_manifest_updater.rb
         | 
| 250 251 | 
             
            - lib/dependabot/cargo/helpers.rb
         | 
| 251 252 | 
             
            - lib/dependabot/cargo/language.rb
         | 
| 252 253 | 
             
            - lib/dependabot/cargo/metadata_finder.rb
         | 
| @@ -265,7 +266,7 @@ licenses: | |
| 265 266 | 
             
            - MIT
         | 
| 266 267 | 
             
            metadata:
         | 
| 267 268 | 
             
              bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
         | 
| 268 | 
            -
              changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.326. | 
| 269 | 
            +
              changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.326.1
         | 
| 269 270 | 
             
            rdoc_options: []
         | 
| 270 271 | 
             
            require_paths:
         | 
| 271 272 | 
             
            - lib
         |