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,159 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/update_checkers/base"
4
+ require "dependabot/file_parsers/java/maven/property_value_finder"
5
+
6
+ module Dependabot
7
+ module UpdateCheckers
8
+ module Java
9
+ class Maven < Dependabot::UpdateCheckers::Base
10
+ require_relative "maven/requirements_updater"
11
+ require_relative "maven/version_finder"
12
+ require_relative "maven/property_updater"
13
+
14
+ def latest_version
15
+ latest_version_details&.fetch(:version)
16
+ end
17
+
18
+ def latest_resolvable_version
19
+ # Maven's version resolution algorithm is very simple: it just uses
20
+ # the version defined "closest", with the first declaration winning
21
+ # if two declarations are equally close. As a result, we can just
22
+ # return that latest version unless dealing with a property dep.
23
+ # https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html#Transitive_Dependencies
24
+ return nil if version_comes_from_multi_dependency_property?
25
+
26
+ latest_version
27
+ end
28
+
29
+ def latest_resolvable_version_with_no_unlock
30
+ # Irrelevant, since Maven has a single dependency file (the pom.xml).
31
+ #
32
+ # For completeness we ought to resolve the pom.xml and return the
33
+ # latest version that satisfies the current constraint AND any
34
+ # constraints placed on it by other dependencies. Seeing as we're
35
+ # never going to take any action as a result, though, we just return
36
+ # nil.
37
+ nil
38
+ end
39
+
40
+ def updated_requirements
41
+ property_names =
42
+ declarations_using_a_property.
43
+ map { |req| req.dig(:metadata, :property_name) }
44
+
45
+ RequirementsUpdater.new(
46
+ requirements: dependency.requirements,
47
+ latest_version: latest_version&.to_s,
48
+ source_url: latest_version_details&.fetch(:source_url),
49
+ properties_to_update: property_names
50
+ ).updated_requirements
51
+ end
52
+
53
+ def requirements_unlocked_or_can_be?
54
+ declarations_using_a_property.none? do |requirement|
55
+ prop_name = requirement.dig(:metadata, :property_name)
56
+ pom = dependency_files.find { |f| f.name == requirement[:file] }
57
+
58
+ declaration_pom_name =
59
+ property_value_finder.
60
+ property_details(property_name: prop_name, callsite_pom: pom)&.
61
+ fetch(:file)
62
+
63
+ declaration_pom_name == "remote_pom.xml" ||
64
+ declaration_pom_name.end_with?("pom_parent.xml")
65
+ end
66
+ end
67
+
68
+ private
69
+
70
+ def latest_version_resolvable_with_full_unlock?
71
+ return false unless version_comes_from_multi_dependency_property?
72
+
73
+ property_updater.update_possible?
74
+ end
75
+
76
+ def updated_dependencies_after_full_unlock
77
+ property_updater.updated_dependencies
78
+ end
79
+
80
+ def numeric_version_up_to_date?
81
+ return false unless version_class.correct?(dependency.version)
82
+
83
+ super
84
+ end
85
+
86
+ def numeric_version_can_update?(requirements_to_unlock:)
87
+ return false unless version_class.correct?(dependency.version)
88
+
89
+ super
90
+ end
91
+
92
+ def latest_version_details
93
+ @latest_version_details ||= version_finder.latest_version_details
94
+ end
95
+
96
+ def version_finder
97
+ @version_finder ||=
98
+ VersionFinder.new(
99
+ dependency: dependency,
100
+ dependency_files: dependency_files,
101
+ credentials: credentials,
102
+ ignored_versions: ignored_versions
103
+ )
104
+ end
105
+
106
+ def property_updater
107
+ @property_updater ||=
108
+ PropertyUpdater.new(
109
+ dependency: dependency,
110
+ dependency_files: dependency_files,
111
+ target_version_details: latest_version_details,
112
+ credentials: credentials,
113
+ ignored_versions: ignored_versions
114
+ )
115
+ end
116
+
117
+ def property_value_finder
118
+ @property_value_finder ||=
119
+ FileParsers::Java::Maven::PropertyValueFinder.
120
+ new(dependency_files: dependency_files)
121
+ end
122
+
123
+ def version_comes_from_multi_dependency_property?
124
+ declarations_using_a_property.any? do |requirement|
125
+ property_name = requirement.fetch(:metadata).fetch(:property_name)
126
+ property_source = requirement.fetch(:metadata).
127
+ fetch(:property_source)
128
+
129
+ all_property_based_dependencies.any? do |dep|
130
+ next false if dep.name == dependency.name
131
+
132
+ dep.requirements.any? do |req|
133
+ next unless req.dig(:metadata, :property_name) == property_name
134
+
135
+ req.dig(:metadata, :property_source) == property_source
136
+ end
137
+ end
138
+ end
139
+ end
140
+
141
+ def declarations_using_a_property
142
+ @declarations_using_a_property ||=
143
+ dependency.requirements.
144
+ select { |req| req.dig(:metadata, :property_name) }
145
+ end
146
+
147
+ def all_property_based_dependencies
148
+ @all_property_based_dependencies ||=
149
+ FileParsers::Java::Maven.new(
150
+ dependency_files: dependency_files,
151
+ source: nil
152
+ ).parse.select do |dep|
153
+ dep.requirements.any? { |req| req.dig(:metadata, :property_name) }
154
+ end
155
+ end
156
+ end
157
+ end
158
+ end
159
+ end
@@ -0,0 +1,127 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_parsers/java/maven"
4
+ require "dependabot/update_checkers/java/maven"
5
+ require "dependabot/update_checkers/java/maven/requirements_updater"
6
+ require "dependabot/file_updaters/java/maven/declaration_finder"
7
+
8
+ module Dependabot
9
+ module UpdateCheckers
10
+ module Java
11
+ class Maven
12
+ class PropertyUpdater
13
+ require_relative "version_finder"
14
+
15
+ def initialize(dependency:, dependency_files:, credentials:,
16
+ target_version_details:, ignored_versions:)
17
+ @dependency = dependency
18
+ @dependency_files = dependency_files
19
+ @credentials = credentials
20
+ @ignored_versions = ignored_versions
21
+ @target_version = target_version_details&.fetch(:version)
22
+ @source_url = target_version_details&.fetch(: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: updated_version(dep),
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_url, :credentials, :ignored_versions
61
+
62
+ def dependencies_using_property
63
+ @dependencies_using_property ||=
64
+ FileParsers::Java::Maven.new(
65
+ dependency_files: dependency_files,
66
+ source: nil
67
+ ).parse.select do |dep|
68
+ dep.requirements.any? do |r|
69
+ next unless r.dig(:metadata, :property_name) == property_name
70
+
71
+ r.dig(:metadata, :property_source) == property_source
72
+ end
73
+ end
74
+ end
75
+
76
+ def property_name
77
+ @property_name ||= dependency.requirements.
78
+ find { |r| r.dig(:metadata, :property_name) }&.
79
+ dig(:metadata, :property_name)
80
+
81
+ raise "No requirement with a property name!" unless @property_name
82
+
83
+ @property_name
84
+ end
85
+
86
+ def property_source
87
+ @property_source ||=
88
+ dependency.requirements.
89
+ find { |r| r.dig(:metadata, :property_name) == property_name }&.
90
+ dig(:metadata, :property_source)
91
+ end
92
+
93
+ def version_string(dep)
94
+ declaring_requirement =
95
+ dep.requirements.
96
+ find { |r| r.dig(:metadata, :property_name) == property_name }
97
+
98
+ FileUpdaters::Java::Maven::DeclarationFinder.new(
99
+ dependency: dep,
100
+ declaring_requirement: declaring_requirement,
101
+ dependency_files: dependency_files
102
+ ).declaration_nodes.first.at_css("version")&.content
103
+ end
104
+
105
+ def pom
106
+ dependency_files.find { |f| f.name == "pom.xml" }
107
+ end
108
+
109
+ def updated_version(dep)
110
+ version_string(dep).gsub("${#{property_name}}", target_version.to_s)
111
+ end
112
+
113
+ def updated_requirements(dep)
114
+ @updated_requirements ||= {}
115
+ @updated_requirements[dep.name] ||=
116
+ RequirementsUpdater.new(
117
+ requirements: dep.requirements,
118
+ latest_version: updated_version(dep),
119
+ source_url: source_url,
120
+ properties_to_update: [property_name]
121
+ ).updated_requirements
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
127
+ end
@@ -0,0 +1,92 @@
1
+ # frozen_string_literal: true
2
+
3
+ #######################################################
4
+ # For more details on Maven version constraints, see: #
5
+ # https://maven.apache.org/pom.html#Dependencies #
6
+ #######################################################
7
+
8
+ require "dependabot/update_checkers/java/maven"
9
+ require "dependabot/utils/java/version"
10
+ require "dependabot/utils/java/requirement"
11
+
12
+ module Dependabot
13
+ module UpdateCheckers
14
+ module Java
15
+ class Maven
16
+ class RequirementsUpdater
17
+ def initialize(requirements:, latest_version:, source_url:,
18
+ properties_to_update:)
19
+ @requirements = requirements
20
+ @source_url = source_url
21
+ @properties_to_update = properties_to_update
22
+ return unless latest_version
23
+
24
+ @latest_version = version_class.new(latest_version)
25
+ end
26
+
27
+ def updated_requirements
28
+ return requirements unless latest_version
29
+
30
+ # Note: Order is important here. The FileUpdater needs the updated
31
+ # requirement at index `i` to correspond to the previous requirement
32
+ # at the same index.
33
+ requirements.map do |req|
34
+ next req if req.fetch(:requirement).nil?
35
+ next req if req.fetch(:requirement).include?(",")
36
+
37
+ property_name = req.dig(:metadata, :property_name)
38
+ if property_name && !properties_to_update.include?(property_name)
39
+ next req
40
+ end
41
+
42
+ new_req = update_requirement(req[:requirement])
43
+ req.merge(requirement: new_req, source: updated_source)
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ attr_reader :requirements, :latest_version, :source_url,
50
+ :properties_to_update
51
+
52
+ def update_requirement(req_string)
53
+ if req_string.include?(".+")
54
+ update_dynamic_requirement(req_string)
55
+ else
56
+ # Since range requirements are excluded this must be exact
57
+ update_exact_requirement(req_string)
58
+ end
59
+ end
60
+
61
+ def update_exact_requirement(req_string)
62
+ old_version = requirement_class.new(req_string).
63
+ requirements.first.last
64
+ req_string.gsub(old_version.to_s, latest_version.to_s)
65
+ end
66
+
67
+ # This is really only a Gradle thing, but Gradle relies on this
68
+ # RequirementsUpdater too
69
+ def update_dynamic_requirement(req_string)
70
+ precision = req_string.split(".").take_while { |s| s != "+" }.count
71
+
72
+ version_parts = latest_version.segments.first(precision)
73
+
74
+ version_parts.join(".") + ".+"
75
+ end
76
+
77
+ def version_class
78
+ Utils::Java::Version
79
+ end
80
+
81
+ def requirement_class
82
+ Utils::Java::Requirement
83
+ end
84
+
85
+ def updated_source
86
+ { type: "maven_repo", url: source_url }
87
+ end
88
+ end
89
+ end
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,225 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "nokogiri"
4
+ require "dependabot/shared_helpers"
5
+ require "dependabot/file_parsers/java/maven/repositories_finder"
6
+ require "dependabot/update_checkers/java/maven"
7
+ require "dependabot/utils/java/version"
8
+ require "dependabot/utils/java/requirement"
9
+
10
+ module Dependabot
11
+ module UpdateCheckers
12
+ module Java
13
+ class Maven
14
+ class VersionFinder
15
+ TYPE_SUFFICES = %w(jre android java).freeze
16
+
17
+ def initialize(dependency:, dependency_files:, credentials:,
18
+ ignored_versions:)
19
+ @dependency = dependency
20
+ @dependency_files = dependency_files
21
+ @credentials = credentials
22
+ @ignored_versions = ignored_versions
23
+ @forbidden_urls = []
24
+ end
25
+
26
+ def latest_version_details
27
+ possible_versions = versions
28
+
29
+ unless wants_prerelease?
30
+ possible_versions =
31
+ possible_versions.
32
+ reject { |v| v.fetch(:version).prerelease? }
33
+ end
34
+
35
+ unless wants_date_based_version?
36
+ possible_versions =
37
+ possible_versions.
38
+ reject { |v| v.fetch(:version) > version_class.new(1900) }
39
+ end
40
+
41
+ possible_versions =
42
+ possible_versions.
43
+ select { |v| matches_dependency_version_type?(v.fetch(:version)) }
44
+
45
+ ignored_versions.each do |req|
46
+ ignore_req = Utils::Java::Requirement.new(req.split(","))
47
+ possible_versions =
48
+ possible_versions.
49
+ reject { |v| ignore_req.satisfied_by?(v.fetch(:version)) }
50
+ end
51
+
52
+ possible_versions.reverse.find { |v| released?(v.fetch(:version)) }
53
+ end
54
+
55
+ def versions
56
+ version_details =
57
+ repositories.map do |repository_details|
58
+ url = repository_details.fetch("url")
59
+ dependency_metadata(repository_details).
60
+ css("versions > version").
61
+ select { |node| version_class.correct?(node.content) }.
62
+ map { |node| version_class.new(node.content) }.
63
+ map { |version| { version: version, source_url: url } }
64
+ end.flatten
65
+
66
+ if version_details.none? && forbidden_urls.any?
67
+ raise PrivateSourceAuthenticationFailure, forbidden_urls.first
68
+ end
69
+
70
+ version_details.sort_by { |details| details.fetch(:version) }
71
+ end
72
+
73
+ private
74
+
75
+ attr_reader :dependency, :dependency_files, :credentials,
76
+ :ignored_versions, :forbidden_urls
77
+
78
+ def wants_prerelease?
79
+ return false unless dependency.version
80
+ return false unless version_class.correct?(dependency.version)
81
+
82
+ version_class.new(dependency.version).prerelease?
83
+ end
84
+
85
+ def wants_date_based_version?
86
+ return false unless dependency.version
87
+ return false unless version_class.correct?(dependency.version)
88
+
89
+ version_class.new(dependency.version) >= version_class.new(100)
90
+ end
91
+
92
+ def released?(version)
93
+ repositories.any? do |repository_details|
94
+ url = repository_details.fetch("url")
95
+ response = Excon.get(
96
+ dependency_files_url(url, version),
97
+ user: repository_details.fetch("username"),
98
+ password: repository_details.fetch("password"),
99
+ idempotent: true,
100
+ **SharedHelpers.excon_defaults
101
+ )
102
+
103
+ artifact_id = dependency.name.split(":").last
104
+ type = dependency.requirements.first.
105
+ dig(:metadata, :packaging_type)
106
+ response.body.include?("#{artifact_id}-#{version}.#{type}")
107
+ rescue Excon::Error::Socket, Excon::Error::Timeout
108
+ false
109
+ end
110
+ end
111
+
112
+ def dependency_metadata(repository_details)
113
+ @dependency_metadata ||= {}
114
+ @dependency_metadata[repository_details.hash] ||=
115
+ begin
116
+ response = Excon.get(
117
+ dependency_metadata_url(repository_details.fetch("url")),
118
+ user: repository_details.fetch("username"),
119
+ password: repository_details.fetch("password"),
120
+ idempotent: true,
121
+ **SharedHelpers.excon_defaults
122
+ )
123
+ check_response(response, repository_details.fetch("url"))
124
+ Nokogiri::XML(response.body)
125
+ rescue Excon::Error::Socket, Excon::Error::Timeout
126
+ central =
127
+ FileParsers::Java::Maven::RepositoriesFinder::CENTRAL_REPO_URL
128
+ raise if repository_details.fetch("url") == central
129
+
130
+ Nokogiri::XML("")
131
+ end
132
+ end
133
+
134
+ def check_response(response, repository_url)
135
+ central =
136
+ FileParsers::Java::Maven::RepositoriesFinder::CENTRAL_REPO_URL
137
+
138
+ return unless [401, 403].include?(response.status)
139
+ return if @forbidden_urls.include?(repository_url)
140
+ return if repository_url == central
141
+
142
+ @forbidden_urls << repository_url
143
+ end
144
+
145
+ def repositories
146
+ return @repositories if @repositories
147
+
148
+ details = pom_repository_details + credentials_repository_details
149
+
150
+ @repositories =
151
+ details.reject do |repo|
152
+ next if repo["password"]
153
+
154
+ # Reject this entry if an identical one with a password exists
155
+ details.any? { |r| r["url"] == repo["url"] && r["password"] }
156
+ end
157
+ end
158
+
159
+ def pom_repository_details
160
+ @pom_repository_details ||=
161
+ FileParsers::Java::Maven::RepositoriesFinder.
162
+ new(dependency_files: dependency_files).
163
+ repository_urls(pom: pom).
164
+ map do |url|
165
+ { "url" => url, "username" => nil, "password" => nil }
166
+ end
167
+ end
168
+
169
+ def credentials_repository_details
170
+ credentials.
171
+ select { |cred| cred["type"] == "maven_repository" }.
172
+ map do |cred|
173
+ {
174
+ "url" => cred.fetch("url").gsub(%r{/+$}, ""),
175
+ "username" => cred.fetch("username", nil),
176
+ "password" => cred.fetch("password", nil)
177
+ }
178
+ end
179
+ end
180
+
181
+ def matches_dependency_version_type?(comparison_version)
182
+ return true unless dependency.version
183
+
184
+ current_type =
185
+ TYPE_SUFFICES.
186
+ find { |t| dependency.version.split(/[.\-]/).include?(t) }
187
+
188
+ version_type =
189
+ TYPE_SUFFICES.
190
+ find { |t| comparison_version.to_s.split(/[.\-]/).include?(t) }
191
+
192
+ current_type == version_type
193
+ end
194
+
195
+ def pom
196
+ filename = dependency.requirements.first.fetch(:file)
197
+ dependency_files.find { |f| f.name == filename }
198
+ end
199
+
200
+ def dependency_metadata_url(repository_url)
201
+ group_id, artifact_id = dependency.name.split(":")
202
+
203
+ "#{repository_url}/"\
204
+ "#{group_id.tr('.', '/')}/"\
205
+ "#{artifact_id}/"\
206
+ "maven-metadata.xml"
207
+ end
208
+
209
+ def dependency_files_url(repository_url, version)
210
+ group_id, artifact_id = dependency.name.split(":")
211
+
212
+ "#{repository_url}/"\
213
+ "#{group_id.tr('.', '/')}/"\
214
+ "#{artifact_id}/"\
215
+ "#{version}/"
216
+ end
217
+
218
+ def version_class
219
+ Utils::Java::Version
220
+ end
221
+ end
222
+ end
223
+ end
224
+ end
225
+ end