dependabot-core 0.76.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.
Files changed (321) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +6408 -0
  3. data/LICENSE +37 -0
  4. data/README.md +115 -0
  5. data/helpers/elixir/bin/check_update.exs +92 -0
  6. data/helpers/elixir/bin/do_update.exs +39 -0
  7. data/helpers/elixir/bin/parse_deps.exs +103 -0
  8. data/helpers/elixir/bin/run.exs +76 -0
  9. data/helpers/elixir/mix.exs +21 -0
  10. data/helpers/elixir/mix.lock +3 -0
  11. data/helpers/go/Makefile +9 -0
  12. data/helpers/go/go.mod +9 -0
  13. data/helpers/go/go.sum +5 -0
  14. data/helpers/go/importresolver/main.go +34 -0
  15. data/helpers/go/main.go +77 -0
  16. data/helpers/go/updatechecker/main.go +107 -0
  17. data/helpers/go/updater/go.mod +3 -0
  18. data/helpers/go/updater/go.sum +2 -0
  19. data/helpers/go/updater/helpers.go +57 -0
  20. data/helpers/go/updater/main.go +48 -0
  21. data/helpers/npm/.agignore +1 -0
  22. data/helpers/npm/.envrc +2 -0
  23. data/helpers/npm/.eslintrc +14 -0
  24. data/helpers/npm/.nvimrc +7 -0
  25. data/helpers/npm/bin/run.js +34 -0
  26. data/helpers/npm/lib/helpers.js +25 -0
  27. data/helpers/npm/lib/peer-dependency-checker.js +102 -0
  28. data/helpers/npm/lib/subdependency-updater.js +48 -0
  29. data/helpers/npm/lib/updater.js +95 -0
  30. data/helpers/npm/package.json +17 -0
  31. data/helpers/npm/test/fixtures/npm-left-pad.json +1 -0
  32. data/helpers/npm/test/fixtures/updater/original/package-lock.json +16 -0
  33. data/helpers/npm/test/fixtures/updater/original/package.json +9 -0
  34. data/helpers/npm/test/fixtures/updater/updated/package-lock.json +16 -0
  35. data/helpers/npm/test/helpers.js +7 -0
  36. data/helpers/npm/test/updater.test.js +50 -0
  37. data/helpers/npm/yarn.lock +6120 -0
  38. data/helpers/php/.php_cs +34 -0
  39. data/helpers/php/bin/run.php +57 -0
  40. data/helpers/php/composer.json +14 -0
  41. data/helpers/php/composer.lock +1521 -0
  42. data/helpers/php/composer.phar +0 -0
  43. data/helpers/php/setup.sh +4 -0
  44. data/helpers/php/src/DependabotInstallationManager.php +61 -0
  45. data/helpers/php/src/DependabotPluginManager.php +23 -0
  46. data/helpers/php/src/ExceptionIO.php +25 -0
  47. data/helpers/php/src/Hasher.php +21 -0
  48. data/helpers/php/src/UpdateChecker.php +123 -0
  49. data/helpers/php/src/Updater.php +97 -0
  50. data/helpers/python/lib/__init__.py +0 -0
  51. data/helpers/python/lib/hasher.py +23 -0
  52. data/helpers/python/lib/parser.py +130 -0
  53. data/helpers/python/requirements.txt +9 -0
  54. data/helpers/python/run.py +18 -0
  55. data/helpers/test/run.rb +15 -0
  56. data/helpers/utils/git-credential-store-immutable +10 -0
  57. data/helpers/yarn/.agignore +1 -0
  58. data/helpers/yarn/.envrc +2 -0
  59. data/helpers/yarn/.eslintrc +14 -0
  60. data/helpers/yarn/.nvimrc +7 -0
  61. data/helpers/yarn/bin/run.js +36 -0
  62. data/helpers/yarn/lib/fix-duplicates.js +53 -0
  63. data/helpers/yarn/lib/helpers.js +5 -0
  64. data/helpers/yarn/lib/lockfile-parser.js +21 -0
  65. data/helpers/yarn/lib/peer-dependency-checker.js +130 -0
  66. data/helpers/yarn/lib/replace-lockfile-declaration.js +45 -0
  67. data/helpers/yarn/lib/subdependency-updater.js +69 -0
  68. data/helpers/yarn/lib/updater.js +254 -0
  69. data/helpers/yarn/package.json +17 -0
  70. data/helpers/yarn/test/fixtures/updater/original/package.json +6 -0
  71. data/helpers/yarn/test/fixtures/updater/original/yarn.lock +11 -0
  72. data/helpers/yarn/test/fixtures/updater/updated/yarn.lock +12 -0
  73. data/helpers/yarn/test/fixtures/updater/with-version-comments/package.json +5 -0
  74. data/helpers/yarn/test/fixtures/updater/with-version-comments/yarn.lock +13 -0
  75. data/helpers/yarn/test/fixtures/yarnpkg-is-positive.json +1 -0
  76. data/helpers/yarn/test/fixtures/yarnpkg-left-pad.json +1 -0
  77. data/helpers/yarn/test/helpers.js +7 -0
  78. data/helpers/yarn/test/updater.test.js +93 -0
  79. data/helpers/yarn/yarn.lock +4912 -0
  80. data/lib/bundler_definition_bundler_version_patch.rb +15 -0
  81. data/lib/bundler_definition_ruby_version_patch.rb +14 -0
  82. data/lib/bundler_git_source_patch.rb +27 -0
  83. data/lib/dependabot.rb +4 -0
  84. data/lib/dependabot/clients/bitbucket.rb +101 -0
  85. data/lib/dependabot/clients/github_with_retries.rb +117 -0
  86. data/lib/dependabot/clients/gitlab.rb +72 -0
  87. data/lib/dependabot/dependency.rb +118 -0
  88. data/lib/dependabot/dependency_file.rb +54 -0
  89. data/lib/dependabot/errors.rb +179 -0
  90. data/lib/dependabot/file_fetchers.rb +48 -0
  91. data/lib/dependabot/file_fetchers/README.md +65 -0
  92. data/lib/dependabot/file_fetchers/base.rb +302 -0
  93. data/lib/dependabot/file_fetchers/docker/docker.rb +40 -0
  94. data/lib/dependabot/file_fetchers/dotnet/nuget.rb +215 -0
  95. data/lib/dependabot/file_fetchers/dotnet/nuget/import_paths_finder.rb +51 -0
  96. data/lib/dependabot/file_fetchers/dotnet/nuget/sln_project_paths_finder.rb +55 -0
  97. data/lib/dependabot/file_fetchers/elixir/hex.rb +78 -0
  98. data/lib/dependabot/file_fetchers/elm/elm_package.rb +52 -0
  99. data/lib/dependabot/file_fetchers/git/submodules.rb +73 -0
  100. data/lib/dependabot/file_fetchers/go/dep.rb +69 -0
  101. data/lib/dependabot/file_fetchers/go/modules.rb +64 -0
  102. data/lib/dependabot/file_fetchers/java/gradle.rb +56 -0
  103. data/lib/dependabot/file_fetchers/java/gradle/settings_file_parser.rb +66 -0
  104. data/lib/dependabot/file_fetchers/java/maven.rb +127 -0
  105. data/lib/dependabot/file_fetchers/java_script/npm_and_yarn.rb +330 -0
  106. data/lib/dependabot/file_fetchers/java_script/npm_and_yarn/path_dependency_builder.rb +107 -0
  107. data/lib/dependabot/file_fetchers/php/composer.rb +131 -0
  108. data/lib/dependabot/file_fetchers/python/pip.rb +305 -0
  109. data/lib/dependabot/file_fetchers/ruby/bundler.rb +185 -0
  110. data/lib/dependabot/file_fetchers/ruby/bundler/child_gemfile_finder.rb +70 -0
  111. data/lib/dependabot/file_fetchers/ruby/bundler/path_gemspec_finder.rb +114 -0
  112. data/lib/dependabot/file_fetchers/ruby/bundler/require_relative_finder.rb +67 -0
  113. data/lib/dependabot/file_fetchers/rust/cargo.rb +240 -0
  114. data/lib/dependabot/file_parsers.rb +48 -0
  115. data/lib/dependabot/file_parsers/README.md +45 -0
  116. data/lib/dependabot/file_parsers/base.rb +31 -0
  117. data/lib/dependabot/file_parsers/base/dependency_set.rb +77 -0
  118. data/lib/dependabot/file_parsers/docker/docker.rb +164 -0
  119. data/lib/dependabot/file_parsers/dotnet/nuget.rb +85 -0
  120. data/lib/dependabot/file_parsers/dotnet/nuget/packages_config_parser.rb +65 -0
  121. data/lib/dependabot/file_parsers/dotnet/nuget/project_file_parser.rb +156 -0
  122. data/lib/dependabot/file_parsers/dotnet/nuget/property_value_finder.rb +131 -0
  123. data/lib/dependabot/file_parsers/elixir/hex.rb +134 -0
  124. data/lib/dependabot/file_parsers/elm/elm_package.rb +136 -0
  125. data/lib/dependabot/file_parsers/git/submodules.rb +69 -0
  126. data/lib/dependabot/file_parsers/go/dep.rb +163 -0
  127. data/lib/dependabot/file_parsers/go/modules.rb +34 -0
  128. data/lib/dependabot/file_parsers/go/modules/go_mod_parser.rb +134 -0
  129. data/lib/dependabot/file_parsers/java/gradle.rb +236 -0
  130. data/lib/dependabot/file_parsers/java/gradle/property_value_finder.rb +90 -0
  131. data/lib/dependabot/file_parsers/java/gradle/repositories_finder.rb +145 -0
  132. data/lib/dependabot/file_parsers/java/maven.rb +252 -0
  133. data/lib/dependabot/file_parsers/java/maven/property_value_finder.rb +166 -0
  134. data/lib/dependabot/file_parsers/java/maven/repositories_finder.rb +188 -0
  135. data/lib/dependabot/file_parsers/java_script/npm_and_yarn.rb +394 -0
  136. data/lib/dependabot/file_parsers/php/composer.rb +177 -0
  137. data/lib/dependabot/file_parsers/python/pip.rb +223 -0
  138. data/lib/dependabot/file_parsers/python/pip/pipfile_files_parser.rb +154 -0
  139. data/lib/dependabot/file_parsers/python/pip/poetry_files_parser.rb +141 -0
  140. data/lib/dependabot/file_parsers/python/pip/setup_file_parser.rb +160 -0
  141. data/lib/dependabot/file_parsers/ruby/bundler.rb +295 -0
  142. data/lib/dependabot/file_parsers/ruby/bundler/file_preparer.rb +85 -0
  143. data/lib/dependabot/file_parsers/ruby/bundler/gemfile_checker.rb +48 -0
  144. data/lib/dependabot/file_parsers/rust/cargo.rb +213 -0
  145. data/lib/dependabot/file_updaters.rb +48 -0
  146. data/lib/dependabot/file_updaters/README.md +58 -0
  147. data/lib/dependabot/file_updaters/base.rb +52 -0
  148. data/lib/dependabot/file_updaters/docker/docker.rb +133 -0
  149. data/lib/dependabot/file_updaters/dotnet/nuget.rb +151 -0
  150. data/lib/dependabot/file_updaters/dotnet/nuget/packages_config_declaration_finder.rb +69 -0
  151. data/lib/dependabot/file_updaters/dotnet/nuget/project_file_declaration_finder.rb +78 -0
  152. data/lib/dependabot/file_updaters/dotnet/nuget/property_value_updater.rb +64 -0
  153. data/lib/dependabot/file_updaters/elixir/hex.rb +71 -0
  154. data/lib/dependabot/file_updaters/elixir/hex/lockfile_updater.rb +147 -0
  155. data/lib/dependabot/file_updaters/elixir/hex/mixfile_git_pin_updater.rb +53 -0
  156. data/lib/dependabot/file_updaters/elixir/hex/mixfile_requirement_updater.rb +74 -0
  157. data/lib/dependabot/file_updaters/elixir/hex/mixfile_sanitizer.rb +28 -0
  158. data/lib/dependabot/file_updaters/elixir/hex/mixfile_updater.rb +98 -0
  159. data/lib/dependabot/file_updaters/elm/elm_package.rb +79 -0
  160. data/lib/dependabot/file_updaters/elm/elm_package/elm_json_updater.rb +69 -0
  161. data/lib/dependabot/file_updaters/elm/elm_package/elm_package_updater.rb +69 -0
  162. data/lib/dependabot/file_updaters/git/submodules.rb +38 -0
  163. data/lib/dependabot/file_updaters/go/dep.rb +77 -0
  164. data/lib/dependabot/file_updaters/go/dep/lockfile_updater.rb +219 -0
  165. data/lib/dependabot/file_updaters/go/dep/manifest_updater.rb +155 -0
  166. data/lib/dependabot/file_updaters/go/modules.rb +71 -0
  167. data/lib/dependabot/file_updaters/go/modules/go_mod_updater.rb +81 -0
  168. data/lib/dependabot/file_updaters/java/gradle.rb +176 -0
  169. data/lib/dependabot/file_updaters/java/gradle/dependency_set_updater.rb +66 -0
  170. data/lib/dependabot/file_updaters/java/gradle/property_value_updater.rb +58 -0
  171. data/lib/dependabot/file_updaters/java/maven.rb +155 -0
  172. data/lib/dependabot/file_updaters/java/maven/declaration_finder.rb +132 -0
  173. data/lib/dependabot/file_updaters/java/maven/property_value_updater.rb +61 -0
  174. data/lib/dependabot/file_updaters/java_script/npm_and_yarn.rb +159 -0
  175. data/lib/dependabot/file_updaters/java_script/npm_and_yarn/npm_lockfile_updater.rb +532 -0
  176. data/lib/dependabot/file_updaters/java_script/npm_and_yarn/npmrc_builder.rb +191 -0
  177. data/lib/dependabot/file_updaters/java_script/npm_and_yarn/package_json_preparer.rb +91 -0
  178. data/lib/dependabot/file_updaters/java_script/npm_and_yarn/package_json_updater.rb +220 -0
  179. data/lib/dependabot/file_updaters/java_script/npm_and_yarn/yarn_lockfile_updater.rb +475 -0
  180. data/lib/dependabot/file_updaters/php/composer.rb +78 -0
  181. data/lib/dependabot/file_updaters/php/composer/lockfile_updater.rb +264 -0
  182. data/lib/dependabot/file_updaters/php/composer/manifest_updater.rb +70 -0
  183. data/lib/dependabot/file_updaters/python/pip.rb +147 -0
  184. data/lib/dependabot/file_updaters/python/pip/pip_compile_file_updater.rb +363 -0
  185. data/lib/dependabot/file_updaters/python/pip/pipfile_file_updater.rb +397 -0
  186. data/lib/dependabot/file_updaters/python/pip/pipfile_preparer.rb +125 -0
  187. data/lib/dependabot/file_updaters/python/pip/poetry_file_updater.rb +289 -0
  188. data/lib/dependabot/file_updaters/python/pip/pyproject_preparer.rb +105 -0
  189. data/lib/dependabot/file_updaters/python/pip/requirement_file_updater.rb +166 -0
  190. data/lib/dependabot/file_updaters/python/pip/requirement_replacer.rb +95 -0
  191. data/lib/dependabot/file_updaters/python/pip/setup_file_sanitizer.rb +91 -0
  192. data/lib/dependabot/file_updaters/ruby/bundler.rb +121 -0
  193. data/lib/dependabot/file_updaters/ruby/bundler/gemfile_updater.rb +116 -0
  194. data/lib/dependabot/file_updaters/ruby/bundler/gemspec_dependency_name_finder.rb +52 -0
  195. data/lib/dependabot/file_updaters/ruby/bundler/gemspec_sanitizer.rb +298 -0
  196. data/lib/dependabot/file_updaters/ruby/bundler/gemspec_updater.rb +64 -0
  197. data/lib/dependabot/file_updaters/ruby/bundler/git_pin_replacer.rb +80 -0
  198. data/lib/dependabot/file_updaters/ruby/bundler/git_source_remover.rb +102 -0
  199. data/lib/dependabot/file_updaters/ruby/bundler/lockfile_updater.rb +384 -0
  200. data/lib/dependabot/file_updaters/ruby/bundler/requirement_replacer.rb +188 -0
  201. data/lib/dependabot/file_updaters/rust/cargo.rb +83 -0
  202. data/lib/dependabot/file_updaters/rust/cargo/lockfile_updater.rb +251 -0
  203. data/lib/dependabot/file_updaters/rust/cargo/manifest_updater.rb +162 -0
  204. data/lib/dependabot/git_commit_checker.rb +412 -0
  205. data/lib/dependabot/metadata_finders.rb +46 -0
  206. data/lib/dependabot/metadata_finders/README.md +53 -0
  207. data/lib/dependabot/metadata_finders/base.rb +117 -0
  208. data/lib/dependabot/metadata_finders/base/changelog_finder.rb +317 -0
  209. data/lib/dependabot/metadata_finders/base/changelog_pruner.rb +177 -0
  210. data/lib/dependabot/metadata_finders/base/commits_finder.rb +217 -0
  211. data/lib/dependabot/metadata_finders/base/release_finder.rb +251 -0
  212. data/lib/dependabot/metadata_finders/docker/docker.rb +18 -0
  213. data/lib/dependabot/metadata_finders/dotnet/nuget.rb +116 -0
  214. data/lib/dependabot/metadata_finders/elixir/hex.rb +69 -0
  215. data/lib/dependabot/metadata_finders/elm/elm_package.rb +22 -0
  216. data/lib/dependabot/metadata_finders/git/submodules.rb +20 -0
  217. data/lib/dependabot/metadata_finders/go/dep.rb +56 -0
  218. data/lib/dependabot/metadata_finders/java/maven.rb +173 -0
  219. data/lib/dependabot/metadata_finders/java_script/npm_and_yarn.rb +215 -0
  220. data/lib/dependabot/metadata_finders/php/composer.rb +66 -0
  221. data/lib/dependabot/metadata_finders/python/pip.rb +120 -0
  222. data/lib/dependabot/metadata_finders/ruby/bundler.rb +150 -0
  223. data/lib/dependabot/metadata_finders/rust/cargo.rb +64 -0
  224. data/lib/dependabot/pull_request_creator.rb +151 -0
  225. data/lib/dependabot/pull_request_creator/branch_namer.rb +170 -0
  226. data/lib/dependabot/pull_request_creator/commit_signer.rb +63 -0
  227. data/lib/dependabot/pull_request_creator/github.rb +233 -0
  228. data/lib/dependabot/pull_request_creator/gitlab.rb +122 -0
  229. data/lib/dependabot/pull_request_creator/labeler.rb +361 -0
  230. data/lib/dependabot/pull_request_creator/message_builder.rb +888 -0
  231. data/lib/dependabot/pull_request_updater.rb +43 -0
  232. data/lib/dependabot/pull_request_updater/github.rb +151 -0
  233. data/lib/dependabot/shared_helpers.rb +201 -0
  234. data/lib/dependabot/source.rb +120 -0
  235. data/lib/dependabot/update_checkers.rb +48 -0
  236. data/lib/dependabot/update_checkers/README.md +67 -0
  237. data/lib/dependabot/update_checkers/base.rb +220 -0
  238. data/lib/dependabot/update_checkers/docker/docker.rb +290 -0
  239. data/lib/dependabot/update_checkers/dotnet/nuget.rb +127 -0
  240. data/lib/dependabot/update_checkers/dotnet/nuget/property_updater.rb +97 -0
  241. data/lib/dependabot/update_checkers/dotnet/nuget/repository_finder.rb +232 -0
  242. data/lib/dependabot/update_checkers/dotnet/nuget/requirements_updater.rb +81 -0
  243. data/lib/dependabot/update_checkers/dotnet/nuget/version_finder.rb +231 -0
  244. data/lib/dependabot/update_checkers/elixir/hex.rb +274 -0
  245. data/lib/dependabot/update_checkers/elixir/hex/file_preparer.rb +193 -0
  246. data/lib/dependabot/update_checkers/elixir/hex/requirements_updater.rb +177 -0
  247. data/lib/dependabot/update_checkers/elixir/hex/version_resolver.rb +175 -0
  248. data/lib/dependabot/update_checkers/elm/elm_package.rb +126 -0
  249. data/lib/dependabot/update_checkers/elm/elm_package/cli_parser.rb +33 -0
  250. data/lib/dependabot/update_checkers/elm/elm_package/elm_18_version_resolver.rb +234 -0
  251. data/lib/dependabot/update_checkers/elm/elm_package/elm_19_version_resolver.rb +198 -0
  252. data/lib/dependabot/update_checkers/elm/elm_package/requirements_updater.rb +75 -0
  253. data/lib/dependabot/update_checkers/git/submodules.rb +52 -0
  254. data/lib/dependabot/update_checkers/go/dep.rb +311 -0
  255. data/lib/dependabot/update_checkers/go/dep/file_preparer.rb +221 -0
  256. data/lib/dependabot/update_checkers/go/dep/latest_version_finder.rb +169 -0
  257. data/lib/dependabot/update_checkers/go/dep/requirements_updater.rb +223 -0
  258. data/lib/dependabot/update_checkers/go/dep/version_resolver.rb +164 -0
  259. data/lib/dependabot/update_checkers/go/modules.rb +112 -0
  260. data/lib/dependabot/update_checkers/java/gradle.rb +148 -0
  261. data/lib/dependabot/update_checkers/java/gradle/multi_dependency_updater.rb +105 -0
  262. data/lib/dependabot/update_checkers/java/gradle/version_finder.rb +183 -0
  263. data/lib/dependabot/update_checkers/java/maven.rb +159 -0
  264. data/lib/dependabot/update_checkers/java/maven/property_updater.rb +127 -0
  265. data/lib/dependabot/update_checkers/java/maven/requirements_updater.rb +92 -0
  266. data/lib/dependabot/update_checkers/java/maven/version_finder.rb +225 -0
  267. data/lib/dependabot/update_checkers/java_script/npm_and_yarn.rb +280 -0
  268. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/latest_version_finder.rb +342 -0
  269. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/library_detector.rb +69 -0
  270. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/registry_finder.rb +226 -0
  271. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/requirements_updater.rb +197 -0
  272. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/subdependency_version_resolver.rb +228 -0
  273. data/lib/dependabot/update_checkers/java_script/npm_and_yarn/version_resolver.rb +452 -0
  274. data/lib/dependabot/update_checkers/php/composer.rb +165 -0
  275. data/lib/dependabot/update_checkers/php/composer/requirements_updater.rb +243 -0
  276. data/lib/dependabot/update_checkers/php/composer/version_resolver.rb +203 -0
  277. data/lib/dependabot/update_checkers/python/pip.rb +227 -0
  278. data/lib/dependabot/update_checkers/python/pip/latest_version_finder.rb +252 -0
  279. data/lib/dependabot/update_checkers/python/pip/pip_compile_version_resolver.rb +380 -0
  280. data/lib/dependabot/update_checkers/python/pip/pipfile_version_resolver.rb +559 -0
  281. data/lib/dependabot/update_checkers/python/pip/poetry_version_resolver.rb +300 -0
  282. data/lib/dependabot/update_checkers/python/pip/requirements_updater.rb +367 -0
  283. data/lib/dependabot/update_checkers/ruby/bundler.rb +324 -0
  284. data/lib/dependabot/update_checkers/ruby/bundler/file_preparer.rb +278 -0
  285. data/lib/dependabot/update_checkers/ruby/bundler/force_updater.rb +261 -0
  286. data/lib/dependabot/update_checkers/ruby/bundler/latest_version_finder.rb +169 -0
  287. data/lib/dependabot/update_checkers/ruby/bundler/requirements_updater.rb +264 -0
  288. data/lib/dependabot/update_checkers/ruby/bundler/ruby_requirement_setter.rb +115 -0
  289. data/lib/dependabot/update_checkers/ruby/bundler/shared_bundler_helpers.rb +243 -0
  290. data/lib/dependabot/update_checkers/ruby/bundler/version_resolver.rb +255 -0
  291. data/lib/dependabot/update_checkers/rust/cargo.rb +282 -0
  292. data/lib/dependabot/update_checkers/rust/cargo/file_preparer.rb +202 -0
  293. data/lib/dependabot/update_checkers/rust/cargo/requirements_updater.rb +175 -0
  294. data/lib/dependabot/update_checkers/rust/cargo/version_resolver.rb +242 -0
  295. data/lib/dependabot/utils.rb +84 -0
  296. data/lib/dependabot/utils/docker/credentials_finder.rb +65 -0
  297. data/lib/dependabot/utils/dotnet/requirement.rb +90 -0
  298. data/lib/dependabot/utils/dotnet/version.rb +22 -0
  299. data/lib/dependabot/utils/elixir/requirement.rb +53 -0
  300. data/lib/dependabot/utils/elixir/version.rb +59 -0
  301. data/lib/dependabot/utils/elm/requirement.rb +92 -0
  302. data/lib/dependabot/utils/elm/version.rb +19 -0
  303. data/lib/dependabot/utils/go/path_converter.rb +74 -0
  304. data/lib/dependabot/utils/go/requirement.rb +152 -0
  305. data/lib/dependabot/utils/go/shared_helper.rb +20 -0
  306. data/lib/dependabot/utils/go/version.rb +40 -0
  307. data/lib/dependabot/utils/java/requirement.rb +110 -0
  308. data/lib/dependabot/utils/java/version.rb +179 -0
  309. data/lib/dependabot/utils/java_script/requirement.rb +117 -0
  310. data/lib/dependabot/utils/java_script/version.rb +30 -0
  311. data/lib/dependabot/utils/php/requirement.rb +97 -0
  312. data/lib/dependabot/utils/php/version.rb +22 -0
  313. data/lib/dependabot/utils/python/requirement.rb +130 -0
  314. data/lib/dependabot/utils/python/version.rb +88 -0
  315. data/lib/dependabot/utils/ruby/requirement.rb +26 -0
  316. data/lib/dependabot/utils/rust/requirement.rb +108 -0
  317. data/lib/dependabot/utils/rust/version.rb +32 -0
  318. data/lib/dependabot/version.rb +5 -0
  319. data/lib/python_requirement_parser.rb +33 -0
  320. data/lib/python_versions.rb +21 -0
  321. metadata +641 -0
@@ -0,0 +1,127 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_parsers/dotnet/nuget"
4
+ require "dependabot/update_checkers/base"
5
+
6
+ module Dependabot
7
+ module UpdateCheckers
8
+ module Dotnet
9
+ class Nuget < Dependabot::UpdateCheckers::Base
10
+ require_relative "nuget/version_finder"
11
+ require_relative "nuget/property_updater"
12
+ require_relative "nuget/requirements_updater"
13
+
14
+ def latest_version
15
+ @latest_version = latest_version_details&.fetch(:version)
16
+ end
17
+
18
+ def latest_resolvable_version
19
+ # TODO: Check version resolution!
20
+ return nil if version_comes_from_multi_dependency_property?
21
+
22
+ latest_version
23
+ end
24
+
25
+ def latest_resolvable_version_with_no_unlock
26
+ # Irrelevant, since Nuget has a single dependency file
27
+ nil
28
+ end
29
+
30
+ def updated_requirements
31
+ RequirementsUpdater.new(
32
+ requirements: dependency.requirements,
33
+ latest_version: latest_version&.to_s,
34
+ source_details: latest_version_details&.
35
+ slice(:nuspec_url, :repo_url, :source_url)
36
+ ).updated_requirements
37
+ end
38
+
39
+ def up_to_date?
40
+ # If any requirements have an uninterpolated property in them then
41
+ # that property couldn't be found, and we assume that the dependency
42
+ # is up-to-date
43
+ return true unless requirements_unlocked_or_can_be?
44
+
45
+ super
46
+ end
47
+
48
+ def requirements_unlocked_or_can_be?
49
+ # If any requirements have an uninterpolated property in them then
50
+ # that property couldn't be found, and the requirement therefore
51
+ # cannot be unlocked (since we can't update that property)
52
+ namespace = FileParsers::Dotnet::Nuget::PropertyValueFinder
53
+ dependency.requirements.none? do |req|
54
+ req.fetch(:requirement)&.match?(namespace::PROPERTY_REGEX)
55
+ end
56
+ end
57
+
58
+ private
59
+
60
+ def latest_version_resolvable_with_full_unlock?
61
+ return false unless version_comes_from_multi_dependency_property?
62
+
63
+ property_updater.update_possible?
64
+ end
65
+
66
+ def updated_dependencies_after_full_unlock
67
+ property_updater.updated_dependencies
68
+ end
69
+
70
+ def latest_version_details
71
+ @latest_version_details ||= version_finder.latest_version_details
72
+ end
73
+
74
+ def version_finder
75
+ @version_finder ||=
76
+ VersionFinder.new(
77
+ dependency: dependency,
78
+ dependency_files: dependency_files,
79
+ credentials: credentials,
80
+ ignored_versions: ignored_versions
81
+ )
82
+ end
83
+
84
+ def property_updater
85
+ @property_updater ||=
86
+ PropertyUpdater.new(
87
+ dependency: dependency,
88
+ dependency_files: dependency_files,
89
+ target_version_details: latest_version_details,
90
+ credentials: credentials,
91
+ ignored_versions: ignored_versions
92
+ )
93
+ end
94
+
95
+ def version_comes_from_multi_dependency_property?
96
+ declarations_using_a_property.any? do |requirement|
97
+ property_name = requirement.fetch(:metadata).fetch(:property_name)
98
+
99
+ all_property_based_dependencies.any? do |dep|
100
+ next false if dep.name == dependency.name
101
+
102
+ dep.requirements.any? do |req|
103
+ req.dig(:metadata, :property_name) == property_name
104
+ end
105
+ end
106
+ end
107
+ end
108
+
109
+ def declarations_using_a_property
110
+ @declarations_using_a_property ||=
111
+ dependency.requirements.
112
+ select { |req| req.dig(:metadata, :property_name) }
113
+ end
114
+
115
+ def all_property_based_dependencies
116
+ @all_property_based_dependencies ||=
117
+ FileParsers::Dotnet::Nuget.new(
118
+ dependency_files: dependency_files,
119
+ source: nil
120
+ ).parse.select do |dep|
121
+ dep.requirements.any? { |req| req.dig(:metadata, :property_name) }
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_parsers/dotnet/nuget"
4
+ require "dependabot/update_checkers/dotnet/nuget"
5
+
6
+ module Dependabot
7
+ module UpdateCheckers
8
+ module Dotnet
9
+ class Nuget
10
+ class PropertyUpdater
11
+ require_relative "version_finder"
12
+ require_relative "requirements_updater"
13
+
14
+ def initialize(dependency:, dependency_files:, credentials:,
15
+ target_version_details:, ignored_versions:)
16
+ @dependency = dependency
17
+ @dependency_files = dependency_files
18
+ @credentials = credentials
19
+ @ignored_versions = ignored_versions
20
+ @target_version = target_version_details&.fetch(:version)
21
+ @source_details = target_version_details&.
22
+ slice(:nuspec_url, :repo_url, :source_url)
23
+ end
24
+
25
+ def update_possible?
26
+ return false unless target_version
27
+
28
+ @update_possible ||=
29
+ dependencies_using_property.all? do |dep|
30
+ versions = VersionFinder.new(
31
+ dependency: dep,
32
+ dependency_files: dependency_files,
33
+ credentials: credentials,
34
+ ignored_versions: ignored_versions
35
+ ).versions.map { |v| v.fetch(:version) }
36
+
37
+ versions.include?(target_version) || versions.none?
38
+ end
39
+ end
40
+
41
+ def updated_dependencies
42
+ raise "Update not possible!" unless update_possible?
43
+
44
+ @updated_dependencies ||=
45
+ dependencies_using_property.map do |dep|
46
+ Dependency.new(
47
+ name: dep.name,
48
+ version: target_version.to_s,
49
+ requirements: updated_requirements(dep),
50
+ previous_version: dep.version,
51
+ previous_requirements: dep.requirements,
52
+ package_manager: dep.package_manager
53
+ )
54
+ end
55
+ end
56
+
57
+ private
58
+
59
+ attr_reader :dependency, :dependency_files, :target_version,
60
+ :source_details, :credentials, :ignored_versions
61
+
62
+ def dependencies_using_property
63
+ @dependencies_using_property ||=
64
+ FileParsers::Dotnet::Nuget.new(
65
+ dependency_files: dependency_files,
66
+ source: nil
67
+ ).parse.select do |dep|
68
+ dep.requirements.any? do |r|
69
+ r.dig(:metadata, :property_name) == property_name
70
+ end
71
+ end
72
+ end
73
+
74
+ def property_name
75
+ @property_name ||= dependency.requirements.
76
+ find { |r| r.dig(:metadata, :property_name) }&.
77
+ dig(:metadata, :property_name)
78
+
79
+ raise "No requirement with a property name!" unless @property_name
80
+
81
+ @property_name
82
+ end
83
+
84
+ def updated_requirements(dep)
85
+ @updated_requirements ||= {}
86
+ @updated_requirements[dep.name] ||=
87
+ RequirementsUpdater.new(
88
+ requirements: dep.requirements,
89
+ latest_version: target_version,
90
+ source_details: source_details
91
+ ).updated_requirements
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,232 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "excon"
4
+ require "nokogiri"
5
+ require "dependabot/errors"
6
+ require "dependabot/update_checkers/dotnet/nuget"
7
+ require "dependabot/shared_helpers"
8
+
9
+ module Dependabot
10
+ module UpdateCheckers
11
+ module Dotnet
12
+ class Nuget
13
+ class RepositoryFinder
14
+ DEFAULT_REPOSITORY_URL = "https://api.nuget.org/v3/index.json"
15
+
16
+ def initialize(dependency:, credentials:, config_file: nil)
17
+ @dependency = dependency
18
+ @credentials = credentials
19
+ @config_file = config_file
20
+ end
21
+
22
+ def dependency_urls
23
+ find_dependency_urls
24
+ end
25
+
26
+ private
27
+
28
+ attr_reader :dependency, :credentials, :config_file
29
+
30
+ def find_dependency_urls
31
+ @find_dependency_urls ||=
32
+ known_repositories.flat_map do |details|
33
+ if details.fetch(:url) == DEFAULT_REPOSITORY_URL
34
+ # Save a request for the default URL, since we already how
35
+ # it addresses packages
36
+ next default_repository_details
37
+ end
38
+
39
+ build_url_for_details(details)
40
+ end.compact.uniq
41
+ end
42
+
43
+ def build_url_for_details(repo_details)
44
+ response = get_repo_metadata(repo_details)
45
+ check_repo_reponse(response, repo_details)
46
+ return unless response.status == 200
47
+
48
+ base_url = base_url_from_v3_metadata(JSON.parse(response.body))
49
+ search_url = search_url_from_v3_metadata(JSON.parse(response.body))
50
+
51
+ details = {
52
+ repository_url: repo_details.fetch(:url),
53
+ auth_header: auth_header_for_token(repo_details.fetch(:token)),
54
+ repository_type: "v3"
55
+ }
56
+ if base_url
57
+ details[:versions_url] =
58
+ File.join(base_url, dependency.name.downcase, "index.json")
59
+ end
60
+ if search_url
61
+ details[:search_url] =
62
+ search_url + "?q=#{dependency.name.downcase}&prerelease=true"
63
+ end
64
+ details
65
+ rescue JSON::ParserError
66
+ build_v2_url(response, repo_details)
67
+ rescue Excon::Error::Timeout, Excon::Error::Socket
68
+ handle_timeout(repo_metadata_url: repo_details.fetch(:url))
69
+ end
70
+
71
+ def get_repo_metadata(repo_details)
72
+ Excon.get(
73
+ repo_details.fetch(:url),
74
+ headers: auth_header_for_token(repo_details.fetch(:token)),
75
+ idempotent: true,
76
+ **SharedHelpers.excon_defaults
77
+ )
78
+ end
79
+
80
+ def base_url_from_v3_metadata(metadata)
81
+ metadata.
82
+ fetch("resources", []).
83
+ find { |r| r.fetch("@type") == "PackageBaseAddress/3.0.0" }&.
84
+ fetch("@id")
85
+ end
86
+
87
+ def search_url_from_v3_metadata(metadata)
88
+ metadata.
89
+ fetch("resources", []).
90
+ find { |r| r.fetch("@type") == "SearchQueryService" }&.
91
+ fetch("@id")
92
+ end
93
+
94
+ def build_v2_url(response, repo_details)
95
+ doc = Nokogiri::XML(response.body)
96
+ doc.remove_namespaces!
97
+ base_url = doc.at_xpath("service")&.attributes&.fetch("base")&.value
98
+ return unless base_url
99
+
100
+ {
101
+ repository_url: base_url,
102
+ versions_url: File.join(
103
+ base_url,
104
+ "FindPackagesById()?id='#{dependency.name}'"
105
+ ),
106
+ auth_header: auth_header_for_token(repo_details.fetch(:token)),
107
+ repository_type: "v2"
108
+ }
109
+ end
110
+
111
+ def check_repo_reponse(response, details)
112
+ return unless [401, 402, 403].include?(response.status)
113
+ raise if details.fetch(:url) == DEFAULT_REPOSITORY_URL
114
+
115
+ raise PrivateSourceAuthenticationFailure, details.fetch(:url)
116
+ end
117
+
118
+ def handle_timeout(repo_metadata_url:)
119
+ raise if repo_metadata_url == DEFAULT_REPOSITORY_URL
120
+
121
+ raise PrivateSourceTimedOut, repo_metadata_url
122
+ end
123
+
124
+ def known_repositories
125
+ return @known_repositories if @known_repositories
126
+
127
+ @known_repositories = []
128
+ @known_repositories += credential_repositories
129
+ @known_repositories += config_file_repositories
130
+
131
+ if @known_repositories.empty?
132
+ @known_repositories << { url: DEFAULT_REPOSITORY_URL, token: nil }
133
+ end
134
+
135
+ @known_repositories.uniq
136
+ end
137
+
138
+ def credential_repositories
139
+ @credential_repositories ||=
140
+ credentials.
141
+ select { |cred| cred["type"] == "nuget_feed" }.
142
+ map { |c| { url: c.fetch("url"), token: c["token"] } }
143
+ end
144
+
145
+ def config_file_repositories
146
+ return [] unless config_file
147
+
148
+ doc = Nokogiri::XML(config_file.content)
149
+ doc.remove_namespaces!
150
+ sources =
151
+ doc.css("configuration > packageSources > add").map do |node|
152
+ {
153
+ key:
154
+ node.attribute("key")&.value&.strip ||
155
+ node.at_xpath("./key")&.content&.strip,
156
+ url:
157
+ node.attribute("value")&.value&.strip ||
158
+ node.at_xpath("./value")&.content&.strip
159
+ }
160
+ end
161
+
162
+ sources.reject! do |s|
163
+ known_urls = credential_repositories.map { |cr| cr.fetch(:url) }
164
+ known_urls.include?(s.fetch(:url))
165
+ end
166
+
167
+ add_config_file_credentials(sources: sources, doc: doc)
168
+ sources.each { |details| details.delete(:key) }
169
+
170
+ sources
171
+ end
172
+
173
+ def default_repository_details
174
+ {
175
+ repository_url: DEFAULT_REPOSITORY_URL,
176
+ versions_url: "https://api.nuget.org/v3-flatcontainer/"\
177
+ "#{dependency.name.downcase}/index.json",
178
+ search_url: "https://api-v2v3search-0.nuget.org/query"\
179
+ "?q=#{dependency.name.downcase}&prerelease=true",
180
+ auth_header: {},
181
+ repository_type: "v3"
182
+ }
183
+ end
184
+
185
+ def add_config_file_credentials(sources:, doc:)
186
+ sources.each do |source_details|
187
+ key = source_details.fetch(:key)
188
+ next source_details[:token] = nil unless key
189
+ next source_details[:token] = nil if key.match?(/^\d/)
190
+
191
+ tag = key.gsub(" ", "_x0020_")
192
+ creds_nodes = doc.css("configuration > packageSourceCredentials "\
193
+ "> #{tag} > add")
194
+
195
+ username =
196
+ creds_nodes.
197
+ find { |n| n.attribute("key")&.value == "Username" }&.
198
+ attribute("value")&.value
199
+ password =
200
+ creds_nodes.
201
+ find { |n| n.attribute("key")&.value == "ClearTextPassword" }&.
202
+ attribute("value")&.value
203
+
204
+ # Note: We have to look for plain text passwords, as we have no
205
+ # way of decrypting encrypted passwords. For the same reason we
206
+ # don't fetch API keys from the nuget.config at all.
207
+ next source_details[:token] = nil unless username && password
208
+
209
+ source_details[:token] = "#{username}:#{password}"
210
+ end
211
+
212
+ sources
213
+ end
214
+
215
+ def auth_header_for_token(token)
216
+ return {} unless token
217
+
218
+ if token.include?(":")
219
+ encoded_token = Base64.encode64(token).delete("\n")
220
+ { "Authorization" => "Basic #{encoded_token}" }
221
+ elsif Base64.decode64(token).ascii_only? &&
222
+ Base64.decode64(token).include?(":")
223
+ { "Authorization" => "Basic #{token.delete("\n")}" }
224
+ else
225
+ { "Authorization" => "Bearer #{token}" }
226
+ end
227
+ end
228
+ end
229
+ end
230
+ end
231
+ end
232
+ end