dependabot-nix 0.367.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: d96dbad7c99a3d367400e75f35924e09780a520b1bad0d75f3a09b1fd3dbcc61
4
+ data.tar.gz: 3075e3e0e369bfc2a6430770f31386d80501dee1a1fb3e99581668190779ad3a
5
+ SHA512:
6
+ metadata.gz: 7b7ce4e11d73728346b66072626e0e7dd495b5fc5933dc605f2e864f8f601cc935448e3f1dc271ca3f06d6f4e3fcdc97218c9d1f95d7e7e1c054c9c4881ce792
7
+ data.tar.gz: 7ef644ba8f2b8fd863f1f05903fc58ed0552ae408118f416ebfcd7986bc4f913e9bd6714090307a88b46cd421d6aec3ea5710d6ca8667efde7b5804d37d9b113
@@ -0,0 +1,66 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+ require "dependabot/file_fetchers"
6
+ require "dependabot/file_fetchers/base"
7
+
8
+ module Dependabot
9
+ module Nix
10
+ class FileFetcher < Dependabot::FileFetchers::Base
11
+ extend T::Sig
12
+
13
+ sig { override.params(filenames: T::Array[String]).returns(T::Boolean) }
14
+ def self.required_files_in?(filenames)
15
+ filenames.include?("flake.nix") && filenames.include?("flake.lock")
16
+ end
17
+
18
+ sig { override.returns(String) }
19
+ def self.required_files_message
20
+ "Repo must contain a flake.nix and flake.lock file."
21
+ end
22
+
23
+ sig { override.returns(T::Array[DependencyFile]) }
24
+ def fetch_files
25
+ unless allow_beta_ecosystems?
26
+ raise Dependabot::DependencyFileNotFound.new(
27
+ nil,
28
+ "Nix support is currently in beta. Set ALLOW_BETA_ECOSYSTEMS=true to enable it."
29
+ )
30
+ end
31
+
32
+ fetched_files = []
33
+ fetched_files << flake_nix
34
+ fetched_files << flake_lock
35
+ fetched_files
36
+ end
37
+
38
+ sig { override.returns(T.nilable(T::Hash[Symbol, T.untyped])) }
39
+ def ecosystem_versions
40
+ nil
41
+ end
42
+
43
+ private
44
+
45
+ sig { returns(Dependabot::DependencyFile) }
46
+ def flake_nix
47
+ @flake_nix ||=
48
+ T.let(
49
+ fetch_file_from_host("flake.nix"),
50
+ T.nilable(Dependabot::DependencyFile)
51
+ )
52
+ end
53
+
54
+ sig { returns(Dependabot::DependencyFile) }
55
+ def flake_lock
56
+ @flake_lock ||=
57
+ T.let(
58
+ fetch_file_from_host("flake.lock"),
59
+ T.nilable(Dependabot::DependencyFile)
60
+ )
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ Dependabot::FileFetchers.register("nix", Dependabot::Nix::FileFetcher)
@@ -0,0 +1,215 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "json"
5
+ require "sorbet-runtime"
6
+
7
+ require "dependabot/dependency"
8
+ require "dependabot/file_parsers"
9
+ require "dependabot/file_parsers/base"
10
+ require "dependabot/shared_helpers"
11
+ require "dependabot/nix/package_manager"
12
+
13
+ module Dependabot
14
+ module Nix
15
+ class FileParser < Dependabot::FileParsers::Base
16
+ extend T::Sig
17
+
18
+ # Source types that are backed by git and can be updated via revision tracking
19
+ SUPPORTED_SOURCE_TYPES = T.let(%w(github gitlab sourcehut git).freeze, T::Array[String])
20
+
21
+ SUPPORTED_LOCK_VERSION = 7
22
+
23
+ DEFAULT_HOSTS = T.let(
24
+ {
25
+ "github" => "github.com",
26
+ "gitlab" => "gitlab.com",
27
+ "sourcehut" => "git.sr.ht"
28
+ }.freeze,
29
+ T::Hash[String, String]
30
+ )
31
+
32
+ sig { override.returns(T::Array[Dependabot::Dependency]) }
33
+ def parse
34
+ lock_content = JSON.parse(T.must(flake_lock.content))
35
+
36
+ lock_version = lock_content["version"]
37
+ if lock_version != SUPPORTED_LOCK_VERSION
38
+ Dependabot.logger.warn(
39
+ "flake.lock version #{lock_version.inspect} differs from expected #{SUPPORTED_LOCK_VERSION}"
40
+ )
41
+ end
42
+
43
+ root_name = lock_content.fetch("root", "root")
44
+ nodes = lock_content.fetch("nodes", {})
45
+ root_node = nodes.fetch(root_name, {})
46
+ root_inputs = root_node.fetch("inputs", {})
47
+
48
+ root_inputs.filter_map do |input_name, node_label|
49
+ node = resolve_node(node_label, nodes)
50
+ next unless node
51
+
52
+ build_dependency(input_name, node)
53
+ end
54
+ end
55
+
56
+ sig { returns(Ecosystem) }
57
+ def ecosystem
58
+ @ecosystem ||= T.let(
59
+ Ecosystem.new(
60
+ name: ECOSYSTEM,
61
+ package_manager: package_manager
62
+ ),
63
+ T.nilable(Dependabot::Ecosystem)
64
+ )
65
+ end
66
+
67
+ private
68
+
69
+ # Resolves a node_label to its node in the lock file.
70
+ # node_label is either a string (direct reference) or an array ("follows" path
71
+ # that must be walked through nested inputs maps).
72
+ sig do
73
+ params(
74
+ node_label: T.any(String, T::Array[String]),
75
+ nodes: T::Hash[String, T.untyped]
76
+ ).returns(T.nilable(T::Hash[String, T.untyped]))
77
+ end
78
+ def resolve_node(node_label, nodes)
79
+ return nodes[node_label] unless node_label.is_a?(Array)
80
+ return nil if node_label.empty?
81
+
82
+ # Walk the "follows" path: e.g. ["nixpkgs", "flake-utils"] means
83
+ # follow root -> nixpkgs node -> its inputs -> flake-utils
84
+ resolved_label = resolve_follows_path(node_label, nodes)
85
+ resolved_label ? nodes[resolved_label] : nil
86
+ end
87
+
88
+ # Walks a "follows" path through nested inputs to find the final node label.
89
+ sig do
90
+ params(
91
+ path: T::Array[String],
92
+ nodes: T::Hash[String, T.untyped]
93
+ ).returns(T.nilable(String))
94
+ end
95
+ def resolve_follows_path(path, nodes)
96
+ current_node_label = T.let(nil, T.nilable(String))
97
+
98
+ path.each_with_index do |segment, index|
99
+ # For the first segment, look up in the root's inputs via nodes directly
100
+ target = if index.zero?
101
+ # The first segment references a top-level node by name
102
+ segment
103
+ else
104
+ # Subsequent segments look up inputs within the current node
105
+ node = nodes[T.must(current_node_label)]
106
+ return nil unless node.is_a?(Hash)
107
+
108
+ inputs = node.fetch("inputs", nil)
109
+ return nil unless inputs.is_a?(Hash)
110
+
111
+ label = inputs[segment]
112
+ return nil unless label.is_a?(String)
113
+
114
+ label
115
+ end
116
+
117
+ current_node_label = target
118
+ end
119
+
120
+ current_node_label
121
+ end
122
+
123
+ sig do
124
+ params(
125
+ input_name: String,
126
+ node: T::Hash[String, T.untyped]
127
+ ).returns(T.nilable(Dependabot::Dependency))
128
+ end
129
+ def build_dependency(input_name, node)
130
+ locked = node.fetch("locked", nil)
131
+ original = node.fetch("original", nil)
132
+ return unless locked && original
133
+
134
+ source_type = locked.fetch("type", nil)
135
+ return unless SUPPORTED_SOURCE_TYPES.include?(source_type)
136
+
137
+ rev = locked.fetch("rev", nil)
138
+ return unless rev
139
+
140
+ url = build_url(locked)
141
+ return unless url
142
+
143
+ ref = original.fetch("ref", nil)
144
+
145
+ Dependency.new(
146
+ name: input_name,
147
+ version: rev,
148
+ package_manager: "nix",
149
+ requirements: [{
150
+ requirement: nil,
151
+ file: "flake.lock",
152
+ source: { type: "git", url: url, branch: ref, ref: ref },
153
+ groups: []
154
+ }]
155
+ )
156
+ end
157
+
158
+ sig { params(locked: T::Hash[String, T.untyped]).returns(T.nilable(String)) }
159
+ def build_url(locked)
160
+ case locked["type"]
161
+ when "github"
162
+ host = locked["host"] || DEFAULT_HOSTS["github"]
163
+ "https://#{host}/#{locked['owner']}/#{locked['repo']}"
164
+ when "gitlab"
165
+ host = locked["host"] || DEFAULT_HOSTS["gitlab"]
166
+ "https://#{host}/#{locked['owner']}/#{locked['repo']}"
167
+ when "sourcehut"
168
+ host = locked["host"] || DEFAULT_HOSTS["sourcehut"]
169
+ "https://#{host}/~#{locked['owner']}/#{locked['repo']}"
170
+ when "git"
171
+ locked["url"]
172
+ end
173
+ end
174
+
175
+ sig { returns(Dependabot::DependencyFile) }
176
+ def flake_lock
177
+ @flake_lock ||=
178
+ T.let(
179
+ T.must(get_original_file("flake.lock")),
180
+ T.nilable(Dependabot::DependencyFile)
181
+ )
182
+ end
183
+
184
+ sig { override.void }
185
+ def check_required_files
186
+ %w(flake.nix flake.lock).each do |filename|
187
+ raise "No #{filename}!" unless get_original_file(filename)
188
+ end
189
+ end
190
+
191
+ sig { returns(Ecosystem::VersionManager) }
192
+ def package_manager
193
+ @package_manager ||= T.let(
194
+ PackageManager.new(T.must(nix_version)),
195
+ T.nilable(Dependabot::Nix::PackageManager)
196
+ )
197
+ end
198
+
199
+ sig { returns(T.nilable(String)) }
200
+ def nix_version
201
+ @nix_version ||= T.let(
202
+ begin
203
+ version_output = SharedHelpers.run_shell_command("nix --version")
204
+ version_output.match(/nix.*?(\d+\.\d+[\.\d]*)/)&.captures&.first || "0.0.0"
205
+ rescue StandardError
206
+ "0.0.0"
207
+ end,
208
+ T.nilable(String)
209
+ )
210
+ end
211
+ end
212
+ end
213
+ end
214
+
215
+ Dependabot::FileParsers.register("nix", Dependabot::Nix::FileParser)
@@ -0,0 +1,81 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+
6
+ require "dependabot/errors"
7
+ require "dependabot/file_updaters"
8
+ require "dependabot/file_updaters/base"
9
+ require "dependabot/shared_helpers"
10
+
11
+ module Dependabot
12
+ module Nix
13
+ class FileUpdater < Dependabot::FileUpdaters::Base
14
+ extend T::Sig
15
+
16
+ sig { override.returns(T::Array[Dependabot::DependencyFile]) }
17
+ def updated_dependency_files
18
+ updated_lockfile_content = update_flake_lock
19
+
20
+ if updated_lockfile_content == flake_lock.content
21
+ raise Dependabot::DependencyFileContentNotChanged,
22
+ "Expected flake.lock to change for #{dependency.name}, but it didn't"
23
+ end
24
+
25
+ [updated_file(file: flake_lock, content: updated_lockfile_content)]
26
+ end
27
+
28
+ private
29
+
30
+ sig { returns(Dependabot::Dependency) }
31
+ def dependency
32
+ T.must(dependencies.first)
33
+ end
34
+
35
+ sig { returns(String) }
36
+ def update_flake_lock
37
+ SharedHelpers.in_a_temporary_repo_directory(
38
+ flake_lock.directory,
39
+ repo_contents_path
40
+ ) do
41
+ File.write("flake.nix", T.must(flake_nix.content))
42
+ File.write("flake.lock", T.must(flake_lock.content))
43
+
44
+ SharedHelpers.run_shell_command(
45
+ "nix flake update #{dependency.name}",
46
+ fingerprint: "nix flake update <input_name>"
47
+ )
48
+
49
+ File.read("flake.lock")
50
+ end
51
+ end
52
+
53
+ sig { override.void }
54
+ def check_required_files
55
+ %w(flake.nix flake.lock).each do |filename|
56
+ raise "No #{filename}!" unless get_original_file(filename)
57
+ end
58
+ end
59
+
60
+ sig { returns(Dependabot::DependencyFile) }
61
+ def flake_lock
62
+ @flake_lock ||=
63
+ T.let(
64
+ T.must(get_original_file("flake.lock")),
65
+ T.nilable(Dependabot::DependencyFile)
66
+ )
67
+ end
68
+
69
+ sig { returns(Dependabot::DependencyFile) }
70
+ def flake_nix
71
+ @flake_nix ||=
72
+ T.let(
73
+ T.must(get_original_file("flake.nix")),
74
+ T.nilable(Dependabot::DependencyFile)
75
+ )
76
+ end
77
+ end
78
+ end
79
+ end
80
+
81
+ Dependabot::FileUpdaters.register("nix", Dependabot::Nix::FileUpdater)
@@ -0,0 +1,27 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+
6
+ require "dependabot/metadata_finders"
7
+ require "dependabot/metadata_finders/base"
8
+
9
+ module Dependabot
10
+ module Nix
11
+ class MetadataFinder < Dependabot::MetadataFinders::Base
12
+ extend T::Sig
13
+
14
+ private
15
+
16
+ sig { override.returns(T.nilable(Dependabot::Source)) }
17
+ def look_up_source
18
+ url = dependency.requirements.first&.fetch(:source)&.fetch(:url) ||
19
+ dependency.requirements.first&.fetch(:source)&.fetch("url")
20
+
21
+ Source.from_url(url)
22
+ end
23
+ end
24
+ end
25
+ end
26
+
27
+ Dependabot::MetadataFinders.register("nix", Dependabot::Nix::MetadataFinder)
@@ -0,0 +1,142 @@
1
+ # typed: strict
2
+ # frozen_string_literal: true
3
+
4
+ require "json"
5
+ require "time"
6
+ require "sorbet-runtime"
7
+ require "dependabot/nix"
8
+ require "dependabot/package/package_release"
9
+ require "dependabot/package/package_details"
10
+ require "dependabot/git_commit_checker"
11
+ require "dependabot/git_metadata_fetcher"
12
+
13
+ module Dependabot
14
+ module Nix
15
+ module Package
16
+ class PackageDetailsFetcher
17
+ extend T::Sig
18
+
19
+ sig do
20
+ params(
21
+ dependency: Dependabot::Dependency,
22
+ credentials: T::Array[Dependabot::Credential]
23
+ ).void
24
+ end
25
+ def initialize(dependency:, credentials:)
26
+ @dependency = dependency
27
+ @credentials = credentials
28
+ end
29
+
30
+ sig { returns(Dependabot::Dependency) }
31
+ attr_reader :dependency
32
+
33
+ sig { returns(T::Array[T.untyped]) }
34
+ attr_reader :credentials
35
+
36
+ sig { returns(T.nilable(T::Array[Dependabot::Package::PackageRelease])) }
37
+ def available_versions
38
+ versions_metadata = fetch_tags_and_release_date
39
+
40
+ versions_metadata = fetch_latest_tag_info if versions_metadata.empty?
41
+
42
+ pseudo_version = versions_metadata.length + 1
43
+
44
+ versions_metadata.flat_map do |version_details|
45
+ pseudo_version -= 1
46
+ tag = version_details[:tag]
47
+ release_date = version_details[:release_date]
48
+
49
+ Dependabot::Package::PackageRelease.new(
50
+ version: Nix::Version.new("0.0.0-0.#{pseudo_version}"),
51
+ tag: tag,
52
+ released_at: release_date ? Time.parse(release_date) : nil
53
+ )
54
+ rescue ArgumentError
55
+ Dependabot::Package::PackageRelease.new(
56
+ version: Nix::Version.new("0.0.0-0.#{pseudo_version}"),
57
+ tag: tag
58
+ )
59
+ end
60
+ end
61
+
62
+ private
63
+
64
+ TARGET_COMMITS_TO_FETCH = 500
65
+ private_constant :TARGET_COMMITS_TO_FETCH
66
+
67
+ sig { returns(T::Array[T::Hash[Symbol, T.untyped]]) }
68
+ def fetch_latest_tag_info
69
+ client = build_client
70
+ head = client.head_commit_for_current_branch
71
+ return [] unless head
72
+
73
+ [{ tag: head }]
74
+ end
75
+
76
+ sig { returns(T::Array[T::Hash[Symbol, T.untyped]]) }
77
+ def fetch_tags_and_release_date
78
+ parsed_results = T.let([], T::Array[T::Hash[Symbol, T.untyped]])
79
+
80
+ begin
81
+ Dependabot.logger.info("Fetching release info for Nix flake input: #{dependency.name}")
82
+ client = build_client
83
+
84
+ sha = T.let(nil, T.nilable(String))
85
+ catch :found do
86
+ while parsed_results.length < TARGET_COMMITS_TO_FETCH
87
+ commits = get_commits(client, sha)
88
+ break if commits.empty?
89
+
90
+ commits.each do |commit|
91
+ sha = commit["sha"]
92
+ parsed_results << {
93
+ tag: sha,
94
+ release_date: commit.dig("commit", "committer", "date")
95
+ }
96
+ throw :found if sha == dependency.version
97
+ end
98
+ break if commits.length < Dependabot::GitMetadataFetcher::MAX_COMMITS_PER_PAGE
99
+ end
100
+ end
101
+ parsed_results
102
+ rescue StandardError => e
103
+ Dependabot.logger.error("Error while fetching package info for nix flake input: #{e.message}")
104
+ parsed_results
105
+ end
106
+ end
107
+
108
+ sig { returns(Dependabot::GitCommitChecker) }
109
+ def build_client
110
+ Dependabot::GitCommitChecker.new(
111
+ dependency: dependency,
112
+ credentials: credentials
113
+ )
114
+ end
115
+
116
+ sig do
117
+ params(
118
+ client: Dependabot::GitCommitChecker,
119
+ sha: T.nilable(String)
120
+ ).returns(T::Array[T::Hash[String, T.untyped]])
121
+ end
122
+ def get_commits(client, sha)
123
+ response = sha.nil? ? client.ref_details_for_pinned_ref : client.ref_details(sha)
124
+
125
+ unless response.status == 200
126
+ Dependabot.logger.error(
127
+ "Error while fetching details for #{dependency.name}: #{response.body}"
128
+ )
129
+ end
130
+
131
+ return [] unless response.status == 200
132
+
133
+ commits = JSON.parse(response.body)
134
+ sha.nil? || commits.empty? ? commits : commits[1..]
135
+ rescue StandardError => e
136
+ Dependabot.logger.error("Error fetching commits: #{e.message}")
137
+ []
138
+ end
139
+ end
140
+ end
141
+ end
142
+ end
@@ -0,0 +1,39 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+ require "dependabot/ecosystem"
6
+ require "dependabot/nix/version"
7
+
8
+ module Dependabot
9
+ module Nix
10
+ ECOSYSTEM = "nix"
11
+ PACKAGE_MANAGER = "nix"
12
+ SUPPORTED_NIX_VERSIONS = T.let([].freeze, T::Array[Dependabot::Version])
13
+ DEPRECATED_NIX_VERSIONS = T.let([].freeze, T::Array[Dependabot::Version])
14
+
15
+ class PackageManager < Dependabot::Ecosystem::VersionManager
16
+ extend T::Sig
17
+
18
+ sig { params(raw_version: String).void }
19
+ def initialize(raw_version)
20
+ super(
21
+ name: PACKAGE_MANAGER,
22
+ version: Version.new(raw_version),
23
+ deprecated_versions: DEPRECATED_NIX_VERSIONS,
24
+ supported_versions: SUPPORTED_NIX_VERSIONS
25
+ )
26
+ end
27
+
28
+ sig { returns(T::Boolean) }
29
+ def deprecated?
30
+ false
31
+ end
32
+
33
+ sig { returns(T::Boolean) }
34
+ def unsupported?
35
+ false
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,32 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+
6
+ require "dependabot/requirement"
7
+ require "dependabot/utils"
8
+
9
+ module Dependabot
10
+ module Nix
11
+ class Requirement < Dependabot::Requirement
12
+ extend T::Sig
13
+
14
+ sig { override.params(requirement_string: T.nilable(String)).returns(T::Array[Requirement]) }
15
+ def self.requirements_array(requirement_string)
16
+ [new(requirement_string)]
17
+ end
18
+
19
+ sig { params(requirements: T.nilable(String)).void }
20
+ def initialize(*requirements)
21
+ requirements = requirements.flatten.flat_map do |req_string|
22
+ req_string&.split(",")&.map(&:strip)
23
+ end
24
+
25
+ super(requirements)
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ Dependabot::Utils
32
+ .register_requirement_class("nix", Dependabot::Nix::Requirement)
@@ -0,0 +1,60 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+
6
+ require "dependabot/package/package_latest_version_finder"
7
+ require "dependabot/package/package_details"
8
+ require "dependabot/nix/update_checker"
9
+ require "dependabot/nix/package/package_details_fetcher"
10
+
11
+ module Dependabot
12
+ module Nix
13
+ class UpdateChecker
14
+ class LatestVersionFinder < Dependabot::Package::PackageLatestVersionFinder
15
+ extend T::Sig
16
+
17
+ sig do
18
+ override.params(releases: T::Array[Dependabot::Package::PackageRelease])
19
+ .returns(T::Array[Dependabot::Package::PackageRelease])
20
+ end
21
+ def apply_post_fetch_latest_versions_filter(releases)
22
+ if releases.empty?
23
+ Dependabot.logger.info("No releases found for #{dependency.name} after applying filters.")
24
+ return releases
25
+ end
26
+
27
+ # Fallback so the current version is always in the candidate set
28
+ releases << Dependabot::Package::PackageRelease.new(
29
+ version: Nix::Version.new("0.0.0-0.0"),
30
+ tag: dependency.version
31
+ )
32
+ releases
33
+ end
34
+
35
+ # All Nix versions are pseudo-versions with prerelease segments (0.0.0-0.N),
36
+ # so we must always include prereleases to avoid filtering everything out.
37
+ sig { override.returns(T::Boolean) }
38
+ def wants_prerelease?
39
+ true
40
+ end
41
+
42
+ private
43
+
44
+ sig { override.returns(T.nilable(Dependabot::Package::PackageDetails)) }
45
+ def package_details
46
+ @package_details ||= T.let(
47
+ Dependabot::Package::PackageDetails.new(
48
+ dependency: dependency,
49
+ releases: Package::PackageDetailsFetcher.new(
50
+ dependency: dependency,
51
+ credentials: credentials
52
+ ).available_versions || []
53
+ ),
54
+ T.nilable(Dependabot::Package::PackageDetails)
55
+ )
56
+ end
57
+ end
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,78 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+
6
+ require "dependabot/update_checkers"
7
+ require "dependabot/update_checkers/base"
8
+ require "dependabot/nix/version"
9
+ require "dependabot/nix/requirement"
10
+ require "dependabot/git_commit_checker"
11
+
12
+ module Dependabot
13
+ module Nix
14
+ class UpdateChecker < Dependabot::UpdateCheckers::Base
15
+ extend T::Sig
16
+
17
+ require_relative "update_checker/latest_version_finder"
18
+
19
+ sig { override.returns(T.nilable(T.any(String, Dependabot::Version))) }
20
+ def latest_version
21
+ @latest_version ||=
22
+ T.let(
23
+ fetch_latest_version,
24
+ T.nilable(T.any(String, Dependabot::Version))
25
+ )
26
+ end
27
+
28
+ sig { override.returns(T.nilable(T.any(String, Dependabot::Version))) }
29
+ def latest_resolvable_version
30
+ # Resolvability isn't an issue for flake inputs — they're independent.
31
+ latest_version
32
+ end
33
+
34
+ sig { override.returns(T.nilable(T.any(String, Dependabot::Version))) }
35
+ def latest_resolvable_version_with_no_unlock
36
+ # No concept of "unlocking" for flake inputs
37
+ latest_version
38
+ end
39
+
40
+ sig { override.returns(T::Array[T::Hash[Symbol, T.untyped]]) }
41
+ def updated_requirements
42
+ # Flake input requirements are the URL and branch — we never update those.
43
+ dependency.requirements
44
+ end
45
+
46
+ private
47
+
48
+ sig { override.returns(T::Boolean) }
49
+ def latest_version_resolvable_with_full_unlock?
50
+ # Full unlock checks aren't relevant for flake inputs
51
+ false
52
+ end
53
+
54
+ sig { override.returns(T::Array[Dependabot::Dependency]) }
55
+ def updated_dependencies_after_full_unlock
56
+ raise NotImplementedError
57
+ end
58
+
59
+ sig { returns(T.nilable(String)) }
60
+ def fetch_latest_version
61
+ T.let(
62
+ LatestVersionFinder.new(
63
+ dependency: dependency,
64
+ dependency_files: dependency_files,
65
+ credentials: credentials,
66
+ ignored_versions: ignored_versions,
67
+ security_advisories: security_advisories,
68
+ cooldown_options: update_cooldown,
69
+ raise_on_ignored: raise_on_ignored
70
+ ).latest_tag,
71
+ T.nilable(String)
72
+ )
73
+ end
74
+ end
75
+ end
76
+ end
77
+
78
+ Dependabot::UpdateCheckers.register("nix", Dependabot::Nix::UpdateChecker)
@@ -0,0 +1,15 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "dependabot/version"
5
+ require "dependabot/utils"
6
+
7
+ module Dependabot
8
+ module Nix
9
+ class Version < Dependabot::Version
10
+ end
11
+ end
12
+ end
13
+
14
+ Dependabot::Utils
15
+ .register_version_class("nix", Dependabot::Nix::Version)
@@ -0,0 +1,20 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ # These all need to be required so the various classes can be registered in a
5
+ # lookup table of package manager names to concrete classes.
6
+ require "dependabot/nix/file_fetcher"
7
+ require "dependabot/nix/file_parser"
8
+ require "dependabot/nix/update_checker"
9
+ require "dependabot/nix/file_updater"
10
+ require "dependabot/nix/metadata_finder"
11
+ require "dependabot/nix/version"
12
+ require "dependabot/nix/requirement"
13
+
14
+ require "dependabot/pull_request_creator/labeler"
15
+ Dependabot::PullRequestCreator::Labeler
16
+ .register_label_details("nix", name: "nix", colour: "3E6399")
17
+
18
+ require "dependabot/dependency"
19
+ Dependabot::Dependency
20
+ .register_production_check("nix", ->(_) { true })
metadata ADDED
@@ -0,0 +1,278 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dependabot-nix
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.367.0
5
+ platform: ruby
6
+ authors:
7
+ - Dependabot
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: dependabot-common
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - '='
17
+ - !ruby/object:Gem::Version
18
+ version: 0.367.0
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - '='
24
+ - !ruby/object:Gem::Version
25
+ version: 0.367.0
26
+ - !ruby/object:Gem::Dependency
27
+ name: debug
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '1.9'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.9'
40
+ - !ruby/object:Gem::Dependency
41
+ name: gpgme
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '2.0'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '2.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: rake
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '13.2'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '13.2'
68
+ - !ruby/object:Gem::Dependency
69
+ name: rspec
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '3.12'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '3.12'
82
+ - !ruby/object:Gem::Dependency
83
+ name: rspec-its
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '2.0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '2.0'
96
+ - !ruby/object:Gem::Dependency
97
+ name: rspec-sorbet
98
+ requirement: !ruby/object:Gem::Requirement
99
+ requirements:
100
+ - - "~>"
101
+ - !ruby/object:Gem::Version
102
+ version: '1.9'
103
+ type: :development
104
+ prerelease: false
105
+ version_requirements: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '1.9'
110
+ - !ruby/object:Gem::Dependency
111
+ name: rubocop
112
+ requirement: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '1.80'
117
+ type: :development
118
+ prerelease: false
119
+ version_requirements: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - "~>"
122
+ - !ruby/object:Gem::Version
123
+ version: '1.80'
124
+ - !ruby/object:Gem::Dependency
125
+ name: rubocop-performance
126
+ requirement: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - "~>"
129
+ - !ruby/object:Gem::Version
130
+ version: '1.26'
131
+ type: :development
132
+ prerelease: false
133
+ version_requirements: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - "~>"
136
+ - !ruby/object:Gem::Version
137
+ version: '1.26'
138
+ - !ruby/object:Gem::Dependency
139
+ name: rubocop-rspec
140
+ requirement: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '3.7'
145
+ type: :development
146
+ prerelease: false
147
+ version_requirements: !ruby/object:Gem::Requirement
148
+ requirements:
149
+ - - "~>"
150
+ - !ruby/object:Gem::Version
151
+ version: '3.7'
152
+ - !ruby/object:Gem::Dependency
153
+ name: rubocop-sorbet
154
+ requirement: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - "~>"
157
+ - !ruby/object:Gem::Version
158
+ version: '0.10'
159
+ type: :development
160
+ prerelease: false
161
+ version_requirements: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - "~>"
164
+ - !ruby/object:Gem::Version
165
+ version: '0.10'
166
+ - !ruby/object:Gem::Dependency
167
+ name: simplecov
168
+ requirement: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - "~>"
171
+ - !ruby/object:Gem::Version
172
+ version: '0.22'
173
+ type: :development
174
+ prerelease: false
175
+ version_requirements: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - "~>"
178
+ - !ruby/object:Gem::Version
179
+ version: '0.22'
180
+ - !ruby/object:Gem::Dependency
181
+ name: turbo_tests
182
+ requirement: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - "~>"
185
+ - !ruby/object:Gem::Version
186
+ version: 2.2.5
187
+ type: :development
188
+ prerelease: false
189
+ version_requirements: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - "~>"
192
+ - !ruby/object:Gem::Version
193
+ version: 2.2.5
194
+ - !ruby/object:Gem::Dependency
195
+ name: vcr
196
+ requirement: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - "~>"
199
+ - !ruby/object:Gem::Version
200
+ version: '6.1'
201
+ type: :development
202
+ prerelease: false
203
+ version_requirements: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - "~>"
206
+ - !ruby/object:Gem::Version
207
+ version: '6.1'
208
+ - !ruby/object:Gem::Dependency
209
+ name: webmock
210
+ requirement: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - "~>"
213
+ - !ruby/object:Gem::Version
214
+ version: '3.25'
215
+ type: :development
216
+ prerelease: false
217
+ version_requirements: !ruby/object:Gem::Requirement
218
+ requirements:
219
+ - - "~>"
220
+ - !ruby/object:Gem::Version
221
+ version: '3.25'
222
+ - !ruby/object:Gem::Dependency
223
+ name: webrick
224
+ requirement: !ruby/object:Gem::Requirement
225
+ requirements:
226
+ - - "~>"
227
+ - !ruby/object:Gem::Version
228
+ version: '1.9'
229
+ type: :development
230
+ prerelease: false
231
+ version_requirements: !ruby/object:Gem::Requirement
232
+ requirements:
233
+ - - "~>"
234
+ - !ruby/object:Gem::Version
235
+ version: '1.9'
236
+ description: Dependabot-Nix provides support for bumping Nix dependencies via Dependabot.
237
+ If you want support for multiple package managers, you probably want the meta-gem
238
+ dependabot-omnibus.
239
+ email: opensource@github.com
240
+ executables: []
241
+ extensions: []
242
+ extra_rdoc_files: []
243
+ files:
244
+ - lib/dependabot/nix.rb
245
+ - lib/dependabot/nix/file_fetcher.rb
246
+ - lib/dependabot/nix/file_parser.rb
247
+ - lib/dependabot/nix/file_updater.rb
248
+ - lib/dependabot/nix/metadata_finder.rb
249
+ - lib/dependabot/nix/package/package_details_fetcher.rb
250
+ - lib/dependabot/nix/package_manager.rb
251
+ - lib/dependabot/nix/requirement.rb
252
+ - lib/dependabot/nix/update_checker.rb
253
+ - lib/dependabot/nix/update_checker/latest_version_finder.rb
254
+ - lib/dependabot/nix/version.rb
255
+ homepage: https://github.com/dependabot/dependabot-core
256
+ licenses:
257
+ - MIT
258
+ metadata:
259
+ bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
260
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.367.0
261
+ rdoc_options: []
262
+ require_paths:
263
+ - lib
264
+ required_ruby_version: !ruby/object:Gem::Requirement
265
+ requirements:
266
+ - - ">="
267
+ - !ruby/object:Gem::Version
268
+ version: 3.3.0
269
+ required_rubygems_version: !ruby/object:Gem::Requirement
270
+ requirements:
271
+ - - ">="
272
+ - !ruby/object:Gem::Version
273
+ version: 3.3.0
274
+ requirements: []
275
+ rubygems_version: 3.7.2
276
+ specification_version: 4
277
+ summary: Provides Dependabot support for Nix
278
+ test_files: []