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,81 @@
1
+ # frozen_string_literal: true
2
+
3
+ #######################################################################
4
+ # For more details on Dotnet version constraints, see: #
5
+ # https://docs.microsoft.com/en-us/nuget/reference/package-versioning #
6
+ #######################################################################
7
+
8
+ require "dependabot/update_checkers/dotnet/nuget"
9
+ require "dependabot/utils/dotnet/version"
10
+
11
+ module Dependabot
12
+ module UpdateCheckers
13
+ module Dotnet
14
+ class Nuget
15
+ class RequirementsUpdater
16
+ VERSION_REGEX = /[0-9a-zA-Z]+(?:\.[a-zA-Z0-9\-]+)*/.freeze
17
+
18
+ def initialize(requirements:, latest_version:, source_details:)
19
+ @requirements = requirements
20
+ @source_details = source_details
21
+ return unless latest_version
22
+
23
+ @latest_version = version_class.new(latest_version)
24
+ end
25
+
26
+ def updated_requirements
27
+ return requirements unless latest_version
28
+
29
+ # Note: Order is important here. The FileUpdater needs the updated
30
+ # requirement at index `i` to correspond to the previous requirement
31
+ # at the same index.
32
+ requirements.map do |req|
33
+ next req if req.fetch(:requirement).nil?
34
+ next req if req.fetch(:requirement).include?(",")
35
+
36
+ new_req =
37
+ if req.fetch(:requirement).include?("*")
38
+ update_wildcard_requirement(req.fetch(:requirement))
39
+ else
40
+ # Since range requirements are excluded by the line above we
41
+ # can just do a `gsub` on anything that looks like a version
42
+ req[:requirement].gsub(VERSION_REGEX, latest_version.to_s)
43
+ end
44
+
45
+ next req if new_req == req.fetch(:requirement)
46
+
47
+ req.merge(requirement: new_req, source: updated_source)
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ attr_reader :requirements, :latest_version, :source_details
54
+
55
+ def version_class
56
+ Utils::Dotnet::Version
57
+ end
58
+
59
+ def update_wildcard_requirement(req_string)
60
+ precision = req_string.split("*").first.split(/\.|\-/).count
61
+ wilcard_section = req_string.partition(/(?=[.\-]\*)/).last
62
+
63
+ version_parts = latest_version.segments.first(precision)
64
+ version = version_parts.join(".")
65
+
66
+ version + wilcard_section
67
+ end
68
+
69
+ def updated_source
70
+ {
71
+ type: "nuget_repo",
72
+ url: source_details.fetch(:repo_url),
73
+ nuspec_url: source_details.fetch(:nuspec_url),
74
+ source_url: source_details.fetch(:source_url)
75
+ }
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,231 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "excon"
4
+ require "nokogiri"
5
+
6
+ require "dependabot/utils/dotnet/version"
7
+ require "dependabot/utils/dotnet/requirement"
8
+ require "dependabot/update_checkers/dotnet/nuget"
9
+ require "dependabot/shared_helpers"
10
+
11
+ module Dependabot
12
+ module UpdateCheckers
13
+ module Dotnet
14
+ class Nuget
15
+ class VersionFinder
16
+ require_relative "repository_finder"
17
+
18
+ def initialize(dependency:, dependency_files:, credentials:,
19
+ ignored_versions: [])
20
+ @dependency = dependency
21
+ @dependency_files = dependency_files
22
+ @credentials = credentials
23
+ @ignored_versions = ignored_versions
24
+ end
25
+
26
+ def latest_version_details
27
+ @latest_version_details ||=
28
+ begin
29
+ tmp_versions = versions
30
+ unless wants_prerelease?
31
+ tmp_versions.reject! { |d| d.fetch(:version).prerelease? }
32
+ end
33
+ tmp_versions.reject! do |hash|
34
+ ignore_reqs.any? { |r| r.satisfied_by?(hash.fetch(:version)) }
35
+ end
36
+ tmp_versions.max_by { |hash| hash.fetch(:version) }
37
+ end
38
+ end
39
+
40
+ def versions
41
+ available_v3_versions + available_v2_versions
42
+ end
43
+
44
+ attr_reader :dependency, :dependency_files, :credentials,
45
+ :ignored_versions
46
+
47
+ private
48
+
49
+ def available_v3_versions
50
+ v3_nuget_listings.flat_map do |listing|
51
+ listing.
52
+ fetch("versions", []).
53
+ map do |v|
54
+ nuspec_url =
55
+ listing.fetch("listing_details").
56
+ fetch(:versions_url).
57
+ gsub(/index\.json$/, "#{v}/#{sanitized_name}.nuspec")
58
+
59
+ {
60
+ version: version_class.new(v),
61
+ nuspec_url: nuspec_url,
62
+ source_url: nil,
63
+ repo_url:
64
+ listing.fetch("listing_details").fetch(:repository_url)
65
+ }
66
+ end
67
+ end
68
+ end
69
+
70
+ def available_v2_versions
71
+ v2_nuget_listings.flat_map do |listing|
72
+ body = listing.fetch("xml_body", [])
73
+ doc = Nokogiri::XML(body)
74
+ doc.remove_namespaces!
75
+
76
+ doc.xpath("/feed/entry").map do |entry|
77
+ listed = entry.at_xpath("./properties/Listed")&.content&.strip
78
+ next if listed&.casecmp("false")&.zero?
79
+
80
+ entry_details = dependency_details_from_v2_entry(entry)
81
+ entry_details.merge(
82
+ repo_url: listing.fetch("listing_details").
83
+ fetch(:repository_url)
84
+ )
85
+ end.compact
86
+ end
87
+ end
88
+
89
+ def dependency_details_from_v2_entry(entry)
90
+ version = entry.at_xpath("./properties/Version").content.strip
91
+ source_urls = []
92
+ [
93
+ entry.at_xpath("./properties/ProjectUrl").content,
94
+ entry.at_xpath("./properties/ReleaseNotes").content
95
+ ].join(" ").scan(Source::SOURCE_REGEX) do
96
+ source_urls << Regexp.last_match.to_s
97
+ end
98
+
99
+ source_url = source_urls.find { |url| Source.from_url(url) }
100
+ source_url = Source.from_url(source_url)&.url if source_url
101
+
102
+ {
103
+ version: version_class.new(version),
104
+ nuspec_url: nil,
105
+ source_url: source_url
106
+ }
107
+ end
108
+
109
+ def wants_prerelease?
110
+ if dependency.version &&
111
+ version_class.correct?(dependency.version) &&
112
+ version_class.new(dependency.version).prerelease?
113
+ return true
114
+ end
115
+
116
+ dependency.requirements.any? do |req|
117
+ reqs = (req.fetch(:requirement) || "").split(",").map(&:strip)
118
+ reqs.any? { |r| r.include?("-") }
119
+ end
120
+ end
121
+
122
+ def v3_nuget_listings
123
+ return @v3_nuget_listings unless @v3_nuget_listings.nil?
124
+
125
+ dependency_urls.
126
+ select { |details| details.fetch(:repository_type) == "v3" }.
127
+ map do |url_details|
128
+ versions = versions_for_v3_repository(url_details)
129
+ next unless versions
130
+
131
+ { "versions" => versions, "listing_details" => url_details }
132
+ end.compact
133
+ end
134
+
135
+ def v2_nuget_listings
136
+ return @v2_nuget_listings unless @v2_nuget_listings.nil?
137
+
138
+ dependency_urls.
139
+ select { |details| details.fetch(:repository_type) == "v2" }.
140
+ map do |url_details|
141
+ response = Excon.get(
142
+ url_details[:versions_url],
143
+ headers: url_details[:auth_header],
144
+ idempotent: true,
145
+ **excon_defaults
146
+ )
147
+ next unless response.status == 200
148
+
149
+ {
150
+ "xml_body" => response.body,
151
+ "listing_details" => url_details
152
+ }
153
+ end.compact
154
+ end
155
+
156
+ def versions_for_v3_repository(repository_details)
157
+ # If we have a search URL we use it (since it will exclude unlisted
158
+ # versions)
159
+ if repository_details[:search_url]
160
+ response = Excon.get(
161
+ repository_details[:search_url],
162
+ headers: repository_details[:auth_header],
163
+ idempotent: true,
164
+ **excon_defaults
165
+ )
166
+ return unless response.status == 200
167
+
168
+ JSON.parse(response.body).fetch("data").
169
+ find { |d| d.fetch("id").casecmp(sanitized_name).zero? }&.
170
+ fetch("versions")&.
171
+ map { |d| d.fetch("version") }
172
+ # Otherwise, use the versions URL
173
+ elsif repository_details[:versions_url]
174
+ response = Excon.get(
175
+ repository_details[:versions_url],
176
+ headers: repository_details[:auth_header],
177
+ idempotent: true,
178
+ **excon_defaults
179
+ )
180
+ return unless response.status == 200
181
+
182
+ JSON.parse(response.body).fetch("versions")
183
+ end
184
+ end
185
+
186
+ def dependency_urls
187
+ @dependency_urls ||=
188
+ RepositoryFinder.new(
189
+ dependency: dependency,
190
+ credentials: credentials,
191
+ config_file: nuget_config
192
+ ).dependency_urls
193
+ end
194
+
195
+ def ignore_reqs
196
+ ignored_versions.map { |req| requirement_class.new(req.split(",")) }
197
+ end
198
+
199
+ def nuget_config
200
+ @nuget_config ||=
201
+ dependency_files.find { |f| f.name.casecmp("nuget.config").zero? }
202
+ end
203
+
204
+ def sanitized_name
205
+ dependency.name.downcase
206
+ end
207
+
208
+ def version_class
209
+ Utils::Dotnet::Version
210
+ end
211
+
212
+ def requirement_class
213
+ Utils::Dotnet::Requirement
214
+ end
215
+
216
+ def excon_defaults
217
+ # For large JSON files we sometimes need a little longer than for
218
+ # other languages. For example, see:
219
+ # https://dotnet.myget.org/F/aspnetcore-dev/api/v3/query?
220
+ # q=microsoft.aspnetcore.mvc&prerelease=true
221
+ SharedHelpers.excon_defaults.merge(
222
+ connect_timeout: 10,
223
+ write_timeout: 10,
224
+ read_timeout: 10
225
+ )
226
+ end
227
+ end
228
+ end
229
+ end
230
+ end
231
+ end
@@ -0,0 +1,274 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "excon"
4
+ require "dependabot/git_commit_checker"
5
+ require "dependabot/update_checkers/base"
6
+ require "dependabot/shared_helpers"
7
+
8
+ require "json"
9
+
10
+ module Dependabot
11
+ module UpdateCheckers
12
+ module Elixir
13
+ class Hex < Dependabot::UpdateCheckers::Base
14
+ require_relative "hex/file_preparer"
15
+ require_relative "hex/requirements_updater"
16
+ require_relative "hex/version_resolver"
17
+
18
+ def latest_version
19
+ @latest_version ||=
20
+ if git_dependency?
21
+ latest_version_for_git_dependency
22
+ else
23
+ latest_release_from_hex_registry || latest_resolvable_version
24
+ end
25
+ end
26
+
27
+ def latest_resolvable_version
28
+ @latest_resolvable_version ||=
29
+ if git_dependency?
30
+ latest_resolvable_version_for_git_dependency
31
+ else
32
+ fetch_latest_resolvable_version(unlock_requirement: true)
33
+ end
34
+ end
35
+
36
+ def latest_resolvable_version_with_no_unlock
37
+ @latest_resolvable_version_with_no_unlock ||=
38
+ if git_dependency?
39
+ latest_resolvable_commit_with_unchanged_git_source
40
+ else
41
+ fetch_latest_resolvable_version(unlock_requirement: false)
42
+ end
43
+ end
44
+
45
+ def updated_requirements
46
+ RequirementsUpdater.new(
47
+ requirements: dependency.requirements,
48
+ updated_source: updated_source,
49
+ latest_resolvable_version: latest_resolvable_version&.to_s
50
+ ).updated_requirements
51
+ end
52
+
53
+ private
54
+
55
+ def latest_version_resolvable_with_full_unlock?
56
+ # Full unlock checks aren't implemented for Elixir (yet)
57
+ false
58
+ end
59
+
60
+ def updated_dependencies_after_full_unlock
61
+ raise NotImplementedError
62
+ end
63
+
64
+ def latest_version_for_git_dependency
65
+ latest_git_version_sha
66
+ end
67
+
68
+ def latest_resolvable_version_for_git_dependency
69
+ # If the gem isn't pinned, the latest version is just the latest
70
+ # commit for the specified branch.
71
+ unless git_commit_checker.pinned?
72
+ return latest_resolvable_commit_with_unchanged_git_source
73
+ end
74
+
75
+ # If the dependency is pinned to a tag that looks like a version then
76
+ # we want to update that tag. The latest version will then be the SHA
77
+ # of the latest tag that looks like a version.
78
+ if git_commit_checker.pinned_ref_looks_like_version? &&
79
+ latest_git_tag_is_resolvable?
80
+ new_tag = git_commit_checker.local_tag_for_latest_version
81
+ return new_tag.fetch(:commit_sha)
82
+ end
83
+
84
+ # If the dependency is pinned then there's nothing we can do.
85
+ dependency.version
86
+ end
87
+
88
+ def latest_resolvable_commit_with_unchanged_git_source
89
+ fetch_latest_resolvable_version(unlock_requirement: false)
90
+ rescue SharedHelpers::HelperSubprocessFailed,
91
+ Dependabot::DependencyFileNotResolvable => error
92
+ # Resolution may fail, as Elixir updates straight to the tip of the
93
+ # branch. Just return `nil` if it does (so no update).
94
+ return if error.message.include?("resolution failed")
95
+
96
+ raise error
97
+ end
98
+
99
+ def git_dependency?
100
+ git_commit_checker.git_dependency?
101
+ end
102
+
103
+ def latest_git_version_sha
104
+ # If the gem isn't pinned, the latest version is just the latest
105
+ # commit for the specified branch.
106
+ unless git_commit_checker.pinned?
107
+ return git_commit_checker.head_commit_for_current_branch
108
+ end
109
+
110
+ # If the dependency is pinned to a tag that looks like a version then
111
+ # we want to update that tag. The latest version will then be the SHA
112
+ # of the latest tag that looks like a version.
113
+ if git_commit_checker.pinned_ref_looks_like_version?
114
+ latest_tag = git_commit_checker.local_tag_for_latest_version
115
+ return latest_tag&.fetch(:commit_sha) || dependency.version
116
+ end
117
+
118
+ # If the dependency is pinned to a tag that doesn't look like a
119
+ # version then there's nothing we can do.
120
+ dependency.version
121
+ end
122
+
123
+ def latest_git_tag_is_resolvable?
124
+ return @git_tag_resolvable if @latest_git_tag_is_resolvable_checked
125
+
126
+ @latest_git_tag_is_resolvable_checked = true
127
+
128
+ return false if git_commit_checker.local_tag_for_latest_version.nil?
129
+
130
+ replacement_tag = git_commit_checker.local_tag_for_latest_version
131
+
132
+ prepared_files = FilePreparer.new(
133
+ dependency: dependency,
134
+ dependency_files: dependency_files,
135
+ replacement_git_pin: replacement_tag.fetch(:tag)
136
+ ).prepared_dependency_files
137
+
138
+ resolver_result = VersionResolver.new(
139
+ dependency: dependency,
140
+ prepared_dependency_files: prepared_files,
141
+ original_dependency_files: dependency_files,
142
+ credentials: credentials
143
+ ).latest_resolvable_version
144
+
145
+ @git_tag_resolvable = !resolver_result.nil?
146
+ rescue SharedHelpers::HelperSubprocessFailed,
147
+ Dependabot::DependencyFileNotResolvable => error
148
+ raise error unless error.message.include?("resolution failed")
149
+
150
+ @git_tag_resolvable = false
151
+ end
152
+
153
+ def updated_source
154
+ # Never need to update source, unless a git_dependency
155
+ return dependency_source_details unless git_dependency?
156
+
157
+ # Update the git tag if updating a pinned version
158
+ if git_commit_checker.pinned_ref_looks_like_version? &&
159
+ latest_git_tag_is_resolvable?
160
+ new_tag = git_commit_checker.local_tag_for_latest_version
161
+ return dependency_source_details.merge(ref: new_tag.fetch(:tag))
162
+ end
163
+
164
+ # Otherwise return the original source
165
+ dependency_source_details
166
+ end
167
+
168
+ def dependency_source_details
169
+ sources =
170
+ dependency.requirements.map { |r| r.fetch(:source) }.uniq.compact
171
+
172
+ raise "Multiple sources! #{sources.join(', ')}" if sources.count > 1
173
+
174
+ sources.first
175
+ end
176
+
177
+ def fetch_latest_resolvable_version(unlock_requirement:)
178
+ @latest_resolvable_version_hash ||= {}
179
+ @latest_resolvable_version_hash[unlock_requirement] ||=
180
+ version_resolver(unlock_requirement: unlock_requirement).
181
+ latest_resolvable_version
182
+ end
183
+
184
+ def version_resolver(unlock_requirement:)
185
+ @version_resolver ||= {}
186
+ @version_resolver[unlock_requirement] ||=
187
+ begin
188
+ prepared_dependency_files = prepared_dependency_files(
189
+ unlock_requirement: unlock_requirement,
190
+ latest_allowable_version: latest_release_from_hex_registry
191
+ )
192
+
193
+ VersionResolver.new(
194
+ dependency: dependency,
195
+ prepared_dependency_files: prepared_dependency_files,
196
+ original_dependency_files: dependency_files,
197
+ credentials: credentials
198
+ )
199
+ end
200
+ end
201
+
202
+ def prepared_dependency_files(unlock_requirement:,
203
+ latest_allowable_version: nil)
204
+ FilePreparer.new(
205
+ dependency: dependency,
206
+ dependency_files: dependency_files,
207
+ unlock_requirement: unlock_requirement,
208
+ latest_allowable_version: latest_allowable_version
209
+ ).prepared_dependency_files
210
+ end
211
+
212
+ def latest_release_from_hex_registry
213
+ @latest_release_from_hex_registry ||=
214
+ begin
215
+ versions = hex_registry_response&.fetch("releases", []) || []
216
+ versions =
217
+ versions.
218
+ select { |release| version_class.correct?(release["version"]) }.
219
+ map { |release| version_class.new(release["version"]) }
220
+
221
+ versions.reject!(&:prerelease?) unless wants_prerelease?
222
+ versions.reject! do |v|
223
+ ignore_reqs.any? { |r| r.satisfied_by?(v) }
224
+ end
225
+ versions.max
226
+ end
227
+ end
228
+
229
+ def hex_registry_response
230
+ return @hex_registry_response if @hex_registry_requested
231
+
232
+ @hex_registry_requested = true
233
+
234
+ response = Excon.get(
235
+ dependency_url,
236
+ idempotent: true,
237
+ **SharedHelpers.excon_defaults
238
+ )
239
+
240
+ return unless response.status == 200
241
+
242
+ @hex_registry_response = JSON.parse(response.body)
243
+ rescue Excon::Error::Socket, Excon::Error::Timeout
244
+ nil
245
+ end
246
+
247
+ def wants_prerelease?
248
+ current_version = dependency.version
249
+ if current_version &&
250
+ version_class.correct?(current_version) &&
251
+ version_class.new(current_version).prerelease?
252
+ return true
253
+ end
254
+
255
+ dependency.requirements.any? do |req|
256
+ req[:requirement]&.match?(/\d-[A-Za-z0-9]/)
257
+ end
258
+ end
259
+
260
+ def dependency_url
261
+ "https://hex.pm/api/packages/#{dependency.name}"
262
+ end
263
+
264
+ def git_commit_checker
265
+ @git_commit_checker ||=
266
+ GitCommitChecker.new(
267
+ dependency: dependency,
268
+ credentials: credentials
269
+ )
270
+ end
271
+ end
272
+ end
273
+ end
274
+ end