dependabot-common 0.393.0 → 0.394.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1a99920113509c66688f9ff8e4c3da84a054c3ce8d0f6c1d137cbdbc936ab4e9
4
- data.tar.gz: 5c4de02216c87431010c69387a5ade5f4f296423e3b5e7f3e889e293743ee666
3
+ metadata.gz: 56fd73092967bcc3c61c5380d818f4802319503d4ef71fe825cc0433e928e6a9
4
+ data.tar.gz: c2d55c57dc9a06af239f6f2797c65df21837495afa5c00da8435a0810fd8af30
5
5
  SHA512:
6
- metadata.gz: c84ada814badfb9efc4e7a60d67fa5a26154c9c110337bf77c0963bbb08393ffd13247508d2db349750fb26590f81dfdded077aaf74ad54bf0b4f01b769453cb
7
- data.tar.gz: 1dc8a19ec787541adb136602ee00d101d7919b86c6d903c6d33ae4dedd65afd6fe677b83f4574e5c370a9e2e379093f4e5e7bf630cf95868e9bf91f0db66eccc
6
+ metadata.gz: 9051406a2bb191fc74abe230325d756939a54c84588c78c55ddc44e2a03452e2c57952cb8791f1b2f5f3cdfe9317fbabb01aa4ac00da1be8a30d2274bae835eb
7
+ data.tar.gz: e11299a8ef1eea997446cc50ea216a0615c54875a7a34ce5482f001be1bf038e0700fba9b5e3425aa6d931da753fac54c48f782365755006310651487cfff192
@@ -580,7 +580,10 @@ module Dependabot
580
580
  end
581
581
  def initialize(tool_name, tool_message)
582
582
  @tool_name = tool_name
583
- @tool_message = tool_message
583
+ # Sanitize here as well as via `super`: the raw `tool_message` attribute is read
584
+ # directly during error serialization (see `updater_error_details`), so it must not
585
+ # carry credentials (e.g. basic-auth URLs) that the base message sanitization strips.
586
+ @tool_message = T.let(filter_sensitive_data(tool_message), String)
584
587
 
585
588
  msg = "Dependabot detected that #{tool_name} is misconfigured in this repository. " \
586
589
  "Running `#{tool_name.downcase}` results in the following error: #{tool_message}"
@@ -503,7 +503,7 @@ module Dependabot
503
503
  params(path: String, fetch_submodules: T::Boolean, raise_errors: T::Boolean)
504
504
  .returns(T::Array[RepositoryContent])
505
505
  end
506
- def _fetch_repo_contents(path, fetch_submodules: false, raise_errors: true) # rubocop:disable Metrics/PerceivedComplexity
506
+ def _fetch_repo_contents(path, fetch_submodules: false, raise_errors: true)
507
507
  path = path.gsub(" ", "%20")
508
508
  specification = _full_specification_for(path, fetch_submodules: fetch_submodules)
509
509
  provider = specification.provider
@@ -512,11 +512,7 @@ module Dependabot
512
512
  commit = specification.commit
513
513
 
514
514
  entries = _fetch_repo_contents_fully_specified(provider, repo, tmp_path, commit)
515
- if Dependabot::Experiments.enabled?(:enable_exclude_paths_subdirectory_manifest_files)
516
- filter_excluded(entries)
517
- else
518
- entries
519
- end
515
+ filter_excluded(entries)
520
516
  rescue *CLIENT_NOT_FOUND_ERRORS
521
517
  raise Dependabot::DirectoryNotFound, directory if path == directory.gsub(%r{^/*}, "")
522
518
 
@@ -597,11 +593,7 @@ module Dependabot
597
593
  size: 0 # NOTE: added for parity with github contents API
598
594
  )
599
595
  end
600
- if Dependabot::Experiments.enabled?(:enable_exclude_paths_subdirectory_manifest_files)
601
- filter_excluded(entries)
602
- else
603
- entries
604
- end
596
+ filter_excluded(entries)
605
597
  end
606
598
 
607
599
  # Filters out any entries whose paths match one of the exclude_paths globs.
@@ -90,8 +90,6 @@ module Dependabot
90
90
  ).returns(T::Boolean)
91
91
  end
92
92
  def self.should_exclude_path?(path, context, exclude_paths)
93
- return false unless Dependabot::Experiments.enabled?(:enable_exclude_paths_subdirectory_manifest_files)
94
-
95
93
  return false if exclude_paths.nil? || exclude_paths.empty?
96
94
 
97
95
  should_exclude = exclude_path?(path, exclude_paths)
@@ -0,0 +1,72 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "sorbet-runtime"
5
+
6
+ module Dependabot
7
+ module Package
8
+ class NpmPackageManagerConfig < T::ImmutableStruct
9
+ extend T::Sig
10
+
11
+ ObjectHash = T.type_alias { T::Hash[String, Object] }
12
+
13
+ const :package_manager, T.nilable(String), default: nil
14
+ const :engines, T.nilable(T::Hash[String, String]), default: nil
15
+
16
+ sig { params(package_json: T.nilable(Object)).returns(NpmPackageManagerConfig) }
17
+ def self.from_package_json(package_json)
18
+ return new if package_json.nil?
19
+
20
+ manifest = object_hash(package_json, "package.json")
21
+
22
+ new(
23
+ package_manager: optional_string(manifest["packageManager"], "packageManager"),
24
+ engines: parse_engines(manifest)
25
+ )
26
+ end
27
+
28
+ sig { params(manifest: ObjectHash).returns(T.nilable(T::Hash[String, String])) }
29
+ def self.parse_engines(manifest)
30
+ return unless manifest.key?("engines")
31
+
32
+ raw_engines = manifest["engines"]
33
+ return if raw_engines.nil?
34
+
35
+ engines = T.let({}, T::Hash[String, String])
36
+ object_hash(raw_engines, "engines").each do |name, raw_requirement|
37
+ next if raw_requirement.nil?
38
+
39
+ raise TypeError, "engines.#{name} must be a string" unless raw_requirement.is_a?(String)
40
+
41
+ engines[name] = raw_requirement
42
+ end
43
+ engines
44
+ end
45
+ private_class_method :parse_engines
46
+
47
+ sig { params(value: Object, context: String).returns(ObjectHash) }
48
+ def self.object_hash(value, context)
49
+ raise TypeError, "#{context} must be an object" unless value.is_a?(Hash)
50
+
51
+ result = T.let({}, ObjectHash)
52
+ value.each do |raw_key, raw_value|
53
+ key = T.cast(raw_key, Object)
54
+ raise TypeError, "#{context} keys must be strings" unless key.is_a?(String)
55
+
56
+ result[key] = T.cast(raw_value, Object)
57
+ end
58
+ result
59
+ end
60
+ private_class_method :object_hash
61
+
62
+ sig { params(value: T.nilable(Object), context: String).returns(T.nilable(String)) }
63
+ def self.optional_string(value, context)
64
+ return if value.nil?
65
+ return value if value.is_a?(String)
66
+
67
+ raise TypeError, "#{context} must be a string"
68
+ end
69
+ private_class_method :optional_string
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,186 @@
1
+ # typed: strong
2
+ # frozen_string_literal: true
3
+
4
+ require "json"
5
+ require "time"
6
+ require "sorbet-runtime"
7
+
8
+ module Dependabot
9
+ module Package
10
+ class NpmRegistryPackage < T::ImmutableStruct
11
+ extend T::Sig
12
+
13
+ ObjectHash = T.type_alias { T::Hash[String, Object] }
14
+ VersionFilter = T.type_alias { T.proc.params(version: String).returns(T::Boolean) }
15
+
16
+ class Repository < T::ImmutableStruct
17
+ extend T::Sig
18
+
19
+ const :git, T::Boolean
20
+ const :url, T.nilable(String), default: nil
21
+ const :type, T.nilable(String), default: nil
22
+
23
+ sig { returns(T::Boolean) }
24
+ def git?
25
+ git
26
+ end
27
+ end
28
+
29
+ class Release < T::ImmutableStruct
30
+ extend T::Sig
31
+
32
+ const :version, String
33
+ const :released_at, T.nilable(Time), default: nil
34
+ const :node_requirement, T.nilable(String), default: nil
35
+ const :repository, T.nilable(Repository), default: nil
36
+ const :details, ObjectHash
37
+
38
+ sig { returns(String) }
39
+ def package_type
40
+ repository&.git? ? "git" : "npm"
41
+ end
42
+ end
43
+
44
+ const :releases, T::Hash[String, Release]
45
+ const :dist_tags, T.nilable(T::Hash[String, String]), default: nil
46
+
47
+ sig { params(json: String, version_filter: VersionFilter).returns(NpmRegistryPackage) }
48
+ def self.from_json(json, &version_filter)
49
+ parsed = T.cast(JSON.parse(json), Object)
50
+ package = object_hash(parsed, "npm registry package")
51
+
52
+ versions = package["versions"]
53
+ times = package["time"]
54
+ dist_tags = package["dist-tags"]
55
+
56
+ release_details = versions.nil? ? {} : object_hash(versions, "versions")
57
+ accepted_versions = T.let({}, T::Hash[String, T::Boolean])
58
+ release_details.each_key do |version|
59
+ accepted_versions[version] = true if yield(version)
60
+ end
61
+
62
+ release_times = if times.nil?
63
+ {}
64
+ else
65
+ string_map(times, "time", included_keys: accepted_versions)
66
+ end
67
+
68
+ releases = T.let({}, T::Hash[String, Release])
69
+ release_details.each do |version, details|
70
+ next unless accepted_versions.key?(version)
71
+
72
+ releases[version] = parse_release(
73
+ version: version,
74
+ details: details,
75
+ released_at: release_times[version]
76
+ )
77
+ end
78
+
79
+ new(
80
+ releases: releases,
81
+ dist_tags: dist_tags.nil? ? nil : string_map(dist_tags, "dist-tags")
82
+ )
83
+ end
84
+
85
+ sig do
86
+ params(
87
+ version: String,
88
+ details: Object,
89
+ released_at: T.nilable(String)
90
+ ).returns(Release)
91
+ end
92
+ def self.parse_release(version:, details:, released_at:)
93
+ details_hash = object_hash(details, "version #{version} details")
94
+
95
+ Release.new(
96
+ version: version,
97
+ released_at: released_at && Time.parse(released_at),
98
+ node_requirement: parse_node_requirement(details_hash, version),
99
+ repository: parse_repository(details_hash["repository"], version),
100
+ details: details_hash
101
+ )
102
+ end
103
+ private_class_method :parse_release
104
+
105
+ sig { params(details: ObjectHash, version: String).returns(T.nilable(String)) }
106
+ def self.parse_node_requirement(details, version)
107
+ engines = details["engines"]
108
+ return unless engines.is_a?(Hash)
109
+
110
+ engines_hash = object_hash(engines, "version #{version} engines")
111
+ optional_string(
112
+ engines_hash["node"],
113
+ "version #{version} engines.node"
114
+ )
115
+ end
116
+ private_class_method :parse_node_requirement
117
+
118
+ sig { params(value: T.nilable(Object), version: String).returns(T.nilable(Repository)) }
119
+ def self.parse_repository(value, version)
120
+ case value
121
+ when nil
122
+ nil
123
+ when String
124
+ Repository.new(url: value, git: value.start_with?("git+"))
125
+ when Hash
126
+ repository = object_hash(value, "version #{version} repository")
127
+ url = optional_string(repository["url"], "version #{version} repository.url")
128
+ type = optional_string(repository["type"], "version #{version} repository.type")
129
+
130
+ Repository.new(
131
+ url: url,
132
+ type: type,
133
+ git: type == "git"
134
+ )
135
+ else
136
+ raise TypeError, "version #{version} repository must be a string or object"
137
+ end
138
+ end
139
+ private_class_method :parse_repository
140
+
141
+ sig { params(value: Object, context: String).returns(ObjectHash) }
142
+ def self.object_hash(value, context)
143
+ raise TypeError, "#{context} must be an object" unless value.is_a?(Hash)
144
+
145
+ result = T.let({}, ObjectHash)
146
+ value.each do |raw_key, raw_value|
147
+ key = T.cast(raw_key, Object)
148
+ raise TypeError, "#{context} keys must be strings" unless key.is_a?(String)
149
+
150
+ result[key] = T.cast(raw_value, Object)
151
+ end
152
+ result
153
+ end
154
+ private_class_method :object_hash
155
+
156
+ sig do
157
+ params(
158
+ value: Object,
159
+ context: String,
160
+ included_keys: T.nilable(T::Hash[String, T::Boolean])
161
+ ).returns(T::Hash[String, String])
162
+ end
163
+ def self.string_map(value, context, included_keys: nil)
164
+ result = T.let({}, T::Hash[String, String])
165
+ object_hash(value, context).each do |key, raw_value|
166
+ next if included_keys && !included_keys.key?(key)
167
+
168
+ raise TypeError, "#{context} values must be strings" unless raw_value.is_a?(String)
169
+
170
+ result[key] = raw_value
171
+ end
172
+ result
173
+ end
174
+ private_class_method :string_map
175
+
176
+ sig { params(value: T.nilable(Object), context: String).returns(T.nilable(String)) }
177
+ def self.optional_string(value, context)
178
+ return if value.nil?
179
+ return value if value.is_a?(String)
180
+
181
+ raise TypeError, "#{context} must be a string"
182
+ end
183
+ private_class_method :optional_string
184
+ end
185
+ end
186
+ end
data/lib/dependabot.rb CHANGED
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module Dependabot
5
- VERSION = "0.393.0"
5
+ VERSION = "0.394.0"
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dependabot-common
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.393.0
4
+ version: 0.394.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dependabot
@@ -441,14 +441,14 @@ dependencies:
441
441
  requirements:
442
442
  - - "~>"
443
443
  - !ruby/object:Gem::Version
444
- version: '0.22'
444
+ version: '1.1'
445
445
  type: :development
446
446
  prerelease: false
447
447
  version_requirements: !ruby/object:Gem::Requirement
448
448
  requirements:
449
449
  - - "~>"
450
450
  - !ruby/object:Gem::Version
451
- version: '0.22'
451
+ version: '1.1'
452
452
  - !ruby/object:Gem::Dependency
453
453
  name: turbo_tests
454
454
  requirement: !ruby/object:Gem::Requirement
@@ -572,6 +572,8 @@ files:
572
572
  - lib/dependabot/metadata_finders/base/commits_finder.rb
573
573
  - lib/dependabot/metadata_finders/base/release_finder.rb
574
574
  - lib/dependabot/notices.rb
575
+ - lib/dependabot/package/npm_package_manager_config.rb
576
+ - lib/dependabot/package/npm_registry_package.rb
575
577
  - lib/dependabot/package/package_details.rb
576
578
  - lib/dependabot/package/package_language.rb
577
579
  - lib/dependabot/package/package_latest_version_finder.rb
@@ -629,7 +631,7 @@ licenses:
629
631
  - MIT
630
632
  metadata:
631
633
  bug_tracker_uri: https://github.com/dependabot/dependabot-core/issues
632
- changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.393.0
634
+ changelog_uri: https://github.com/dependabot/dependabot-core/releases/tag/v0.394.0
633
635
  rdoc_options: []
634
636
  require_paths:
635
637
  - lib