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,252 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "nokogiri"
4
+
5
+ require "dependabot/dependency"
6
+ require "dependabot/file_parsers/base"
7
+ require "dependabot/errors"
8
+
9
+ # The best Maven documentation is at:
10
+ # - http://maven.apache.org/pom.html
11
+ module Dependabot
12
+ module FileParsers
13
+ module Java
14
+ class Maven < Dependabot::FileParsers::Base
15
+ require "dependabot/file_parsers/base/dependency_set"
16
+ require_relative "maven/property_value_finder"
17
+
18
+ # The following "dependencies" are candidates for updating:
19
+ # - The project's parent
20
+ # - Any dependencies (incl. those in dependencyManagement or plugins)
21
+ # - Any plugins (incl. those in pluginManagement)
22
+ # - Any extensions
23
+ DEPENDENCY_SELECTOR = "project > parent, "\
24
+ "dependencies > dependency, "\
25
+ "extensions > extension"
26
+ PLUGIN_SELECTOR = "plugins > plugin"
27
+
28
+ # Regex to get the property name from a declaration that uses a property
29
+ PROPERTY_REGEX = /\$\{(?<property>.*?)\}/.freeze
30
+
31
+ def parse
32
+ dependency_set = DependencySet.new
33
+ pomfiles.each { |pom| dependency_set += pomfile_dependencies(pom) }
34
+ dependency_set.dependencies
35
+ end
36
+
37
+ private
38
+
39
+ def pomfile_dependencies(pom)
40
+ dependency_set = DependencySet.new
41
+
42
+ errors = []
43
+ doc = Nokogiri::XML(pom.content)
44
+ doc.remove_namespaces!
45
+
46
+ doc.css(DEPENDENCY_SELECTOR).each do |dependency_node|
47
+ dep = dependency_from_dependency_node(pom, dependency_node)
48
+ dependency_set << dep if dep
49
+ rescue DependencyFileNotEvaluatable => error
50
+ errors << error
51
+ end
52
+
53
+ doc.css(PLUGIN_SELECTOR).each do |dependency_node|
54
+ dep = dependency_from_plugin_node(pom, dependency_node)
55
+ dependency_set << dep if dep
56
+ rescue DependencyFileNotEvaluatable => error
57
+ errors << error
58
+ end
59
+
60
+ raise errors.first if errors.any? && dependency_set.dependencies.none?
61
+
62
+ dependency_set
63
+ end
64
+
65
+ def dependency_from_dependency_node(pom, dependency_node)
66
+ return unless (name = dependency_name(dependency_node, pom))
67
+ return if internal_dependency_names.include?(name)
68
+
69
+ build_dependency(pom, dependency_node, name)
70
+ end
71
+
72
+ def dependency_from_plugin_node(pom, dependency_node)
73
+ return unless (name = plugin_name(dependency_node, pom))
74
+ return if internal_dependency_names.include?(name)
75
+
76
+ build_dependency(pom, dependency_node, name)
77
+ end
78
+
79
+ def build_dependency(pom, dependency_node, name)
80
+ property_details =
81
+ {
82
+ property_name: version_property_name(dependency_node),
83
+ property_source: property_source(dependency_node, pom)
84
+ }.compact
85
+
86
+ Dependency.new(
87
+ name: name,
88
+ version: dependency_version(pom, dependency_node),
89
+ package_manager: "maven",
90
+ requirements: [{
91
+ requirement: dependency_requirement(pom, dependency_node),
92
+ file: pom.name,
93
+ groups: [],
94
+ source: nil,
95
+ metadata: {
96
+ packaging_type: packaging_type(pom, dependency_node)
97
+ }.merge(property_details)
98
+ }]
99
+ )
100
+ end
101
+
102
+ def dependency_name(dependency_node, pom)
103
+ return unless dependency_node.at_xpath("./groupId")
104
+ return unless dependency_node.at_xpath("./artifactId")
105
+
106
+ [
107
+ evaluated_value(
108
+ dependency_node.at_xpath("./groupId").content.strip,
109
+ pom
110
+ ),
111
+ evaluated_value(
112
+ dependency_node.at_xpath("./artifactId").content.strip,
113
+ pom
114
+ )
115
+ ].join(":")
116
+ end
117
+
118
+ def plugin_name(dependency_node, pom)
119
+ return unless plugin_group_id(pom, dependency_node)
120
+ return unless dependency_node.at_xpath("./artifactId")
121
+
122
+ [
123
+ plugin_group_id(pom, dependency_node),
124
+ evaluated_value(
125
+ dependency_node.at_xpath("./artifactId").content.strip,
126
+ pom
127
+ )
128
+ ].join(":")
129
+ end
130
+
131
+ def plugin_group_id(pom, node)
132
+ return "org.apache.maven.plugins" unless node.at_xpath("./groupId")
133
+
134
+ evaluated_value(
135
+ node.at_xpath("./groupId").content.strip,
136
+ pom
137
+ )
138
+ end
139
+
140
+ def dependency_version(pom, dependency_node)
141
+ requirement = dependency_requirement(pom, dependency_node)
142
+ return nil unless requirement
143
+
144
+ # If a range is specified then we can't tell the exact version
145
+ return nil if requirement.include?(",")
146
+
147
+ # Remove brackets if present (and not denoting a range)
148
+ requirement.gsub(/[\(\)\[\]]/, "").strip
149
+ end
150
+
151
+ def dependency_requirement(pom, dependency_node)
152
+ return unless dependency_node.at_xpath("./version")
153
+
154
+ version_content = dependency_node.at_xpath("./version").content.strip
155
+ version_content = evaluated_value(version_content, pom)
156
+
157
+ version_content.empty? ? nil : version_content
158
+ end
159
+
160
+ def packaging_type(pom, dependency_node)
161
+ return "pom" if dependency_node.node_name == "parent"
162
+ return "jar" unless dependency_node.at_xpath("./type")
163
+
164
+ packaging_type_content = dependency_node.at_xpath("./type").
165
+ content.strip
166
+
167
+ evaluated_value(packaging_type_content, pom)
168
+ end
169
+
170
+ def version_property_name(dependency_node)
171
+ return unless dependency_node.at_xpath("./version")
172
+
173
+ version_content = dependency_node.at_xpath("./version").content.strip
174
+
175
+ return unless version_content.match?(PROPERTY_REGEX)
176
+
177
+ version_content.
178
+ match(PROPERTY_REGEX).
179
+ named_captures.fetch("property")
180
+ end
181
+
182
+ def evaluated_value(value, pom)
183
+ return value unless value.match?(PROPERTY_REGEX)
184
+
185
+ property_name = value.match(PROPERTY_REGEX).
186
+ named_captures.fetch("property")
187
+ property_value = value_for_property(property_name, pom)
188
+
189
+ value.gsub(PROPERTY_REGEX, property_value)
190
+ end
191
+
192
+ def property_source(dependency_node, pom)
193
+ property_name = version_property_name(dependency_node)
194
+ return unless property_name
195
+
196
+ declaring_pom =
197
+ property_value_finder.
198
+ property_details(property_name: property_name, callsite_pom: pom)&.
199
+ fetch(:file)
200
+
201
+ return declaring_pom if declaring_pom
202
+
203
+ msg = "Property not found: #{property_name}"
204
+ raise DependencyFileNotEvaluatable, msg
205
+ end
206
+
207
+ def value_for_property(property_name, pom)
208
+ value =
209
+ property_value_finder.
210
+ property_details(property_name: property_name, callsite_pom: pom)&.
211
+ fetch(:value)
212
+
213
+ return value if value
214
+
215
+ msg = "Property not found: #{property_name}"
216
+ raise DependencyFileNotEvaluatable, msg
217
+ end
218
+
219
+ # Cached, since this can makes calls to the registry (to get property
220
+ # values from parent POMs)
221
+ def property_value_finder
222
+ @property_value_finder ||=
223
+ PropertyValueFinder.new(dependency_files: dependency_files)
224
+ end
225
+
226
+ def pomfiles
227
+ # Note: this (correctly) excludes any parent POMs that were downloaded
228
+ @pomfiles ||=
229
+ dependency_files.select { |f| f.name.end_with?("pom.xml") }
230
+ end
231
+
232
+ def internal_dependency_names
233
+ @internal_dependency_names ||=
234
+ dependency_files.map do |pom|
235
+ doc = Nokogiri::XML(pom.content)
236
+ group_id = doc.at_css("project > groupId") ||
237
+ doc.at_css("project > parent > groupId")
238
+ artifact_id = doc.at_css("project > artifactId")
239
+
240
+ next unless group_id && artifact_id
241
+
242
+ [group_id.content.strip, artifact_id.content.strip].join(":")
243
+ end.compact
244
+ end
245
+
246
+ def check_required_files
247
+ raise "No pom.xml!" unless get_original_file("pom.xml")
248
+ end
249
+ end
250
+ end
251
+ end
252
+ end
@@ -0,0 +1,166 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "nokogiri"
4
+
5
+ require "dependabot/dependency_file"
6
+ require "dependabot/file_parsers/java/maven"
7
+ require "dependabot/shared_helpers"
8
+
9
+ # For documentation, see:
10
+ # - http://maven.apache.org/guides/introduction/introduction-to-the-pom.html
11
+ # - http://maven.apache.org/pom.html#Properties
12
+ module Dependabot
13
+ module FileParsers
14
+ module Java
15
+ class Maven
16
+ class PropertyValueFinder
17
+ require_relative "repositories_finder"
18
+
19
+ DOT_SEPARATOR_REGEX = %r{\.(?:(?!\d+[.\/])+)}.freeze
20
+
21
+ def initialize(dependency_files:)
22
+ @dependency_files = dependency_files
23
+ end
24
+
25
+ def property_details(property_name:, callsite_pom:)
26
+ pom = callsite_pom
27
+ doc = Nokogiri::XML(pom.content)
28
+ doc.remove_namespaces!
29
+
30
+ # Loop through the paths that would satisfy this property name,
31
+ # looking for one that exists in this POM
32
+ nm = sanitize_property_name(property_name)
33
+ node =
34
+ loop do
35
+ candidate_node =
36
+ doc.at_xpath("/project/#{nm}") ||
37
+ doc.at_xpath("/project/properties/#{nm}") ||
38
+ doc.at_xpath("/project/profiles/profile/properties/#{nm}")
39
+ break candidate_node if candidate_node
40
+ break unless nm.match?(DOT_SEPARATOR_REGEX)
41
+
42
+ nm = nm.sub(DOT_SEPARATOR_REGEX, "/")
43
+ end
44
+
45
+ # If we found a property, return it
46
+ if node
47
+ return { file: pom.name, node: node, value: node.content.strip }
48
+ end
49
+
50
+ # Otherwise, look for a value in this pom's parent
51
+ return unless (parent = parent_pom(pom))
52
+
53
+ property_details(
54
+ property_name: property_name,
55
+ callsite_pom: parent
56
+ )
57
+ end
58
+
59
+ private
60
+
61
+ attr_reader :dependency_files
62
+
63
+ def internal_dependency_poms
64
+ return @internal_dependency_poms if @internal_dependency_poms
65
+
66
+ @internal_dependency_poms = {}
67
+ dependency_files.each do |pom|
68
+ doc = Nokogiri::XML(pom.content)
69
+ group_id = doc.at_css("project > groupId") ||
70
+ doc.at_css("project > parent > groupId")
71
+ artifact_id = doc.at_css("project > artifactId")
72
+
73
+ next unless group_id && artifact_id
74
+
75
+ dependency_name = [
76
+ group_id.content.strip,
77
+ artifact_id.content.strip
78
+ ].join(":")
79
+
80
+ @internal_dependency_poms[dependency_name] = pom
81
+ end
82
+
83
+ @internal_dependency_poms
84
+ end
85
+
86
+ def sanitize_property_name(property_name)
87
+ property_name.sub(/^pom\./, "").sub(/^project\./, "")
88
+ end
89
+
90
+ def parent_pom(pom)
91
+ doc = Nokogiri::XML(pom.content)
92
+ doc.remove_namespaces!
93
+ group_id = doc.at_xpath("/project/parent/groupId")&.content&.strip
94
+ artifact_id =
95
+ doc.at_xpath("/project/parent/artifactId")&.content&.strip
96
+ version = doc.at_xpath("/project/parent/version")&.content&.strip
97
+
98
+ return unless group_id && artifact_id
99
+
100
+ name = [group_id, artifact_id].join(":")
101
+
102
+ if internal_dependency_poms[name]
103
+ return internal_dependency_poms[name]
104
+ end
105
+
106
+ return unless version && !version.include?(",")
107
+
108
+ fetch_remote_parent_pom(group_id, artifact_id, version, pom)
109
+ end
110
+
111
+ def parent_repository_urls(pom)
112
+ repositories_finder.repository_urls(
113
+ pom: pom,
114
+ exclude_inherited: true
115
+ )
116
+ end
117
+
118
+ def repositories_finder
119
+ @repositories_finder ||=
120
+ RepositoriesFinder.new(
121
+ dependency_files: dependency_files,
122
+ evaluate_properties: false
123
+ )
124
+ end
125
+
126
+ def fetch_remote_parent_pom(group_id, artifact_id, version, pom)
127
+ parent_repository_urls(pom).each do |base_url|
128
+ url = remote_pom_url(group_id, artifact_id, version, base_url)
129
+
130
+ @maven_responses ||= {}
131
+ @maven_responses[url] ||= Excon.get(
132
+ url,
133
+ idempotent: true,
134
+ **SharedHelpers.excon_defaults
135
+ )
136
+ next unless @maven_responses[url].status == 200
137
+ next unless pom?(@maven_responses[url].body)
138
+
139
+ dependency_file = DependencyFile.new(
140
+ name: "remote_pom.xml",
141
+ content: @maven_responses[url].body
142
+ )
143
+
144
+ return dependency_file
145
+ rescue Excon::Error::Socket, Excon::Error::Timeout
146
+ nil
147
+ end
148
+
149
+ # If a parent POM couldn't be found, return `nil`
150
+ nil
151
+ end
152
+
153
+ def remote_pom_url(group_id, artifact_id, version, base_repo_url)
154
+ "#{base_repo_url}/"\
155
+ "#{group_id.tr('.', '/')}/#{artifact_id}/#{version}/"\
156
+ "#{artifact_id}-#{version}.pom"
157
+ end
158
+
159
+ def pom?(content)
160
+ !Nokogiri::XML(content).at_css("project > artifactId").nil?
161
+ end
162
+ end
163
+ end
164
+ end
165
+ end
166
+ end
@@ -0,0 +1,188 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "nokogiri"
4
+
5
+ require "dependabot/dependency_file"
6
+ require "dependabot/file_parsers/java/maven"
7
+ require "dependabot/shared_helpers"
8
+ require "dependabot/errors"
9
+
10
+ # For documentation, see:
11
+ # - http://maven.apache.org/pom.html#Repositories
12
+ # - http://maven.apache.org/guides/mini/guide-multiple-repositories.html
13
+ module Dependabot
14
+ module FileParsers
15
+ module Java
16
+ class Maven
17
+ class RepositoriesFinder
18
+ require_relative "property_value_finder"
19
+ # In theory we should check the artifact type and either look in
20
+ # <repositories> or <pluginRepositories>. In practice it's unlikely
21
+ # anyone makes this distinction.
22
+ REPOSITORY_SELECTOR = "repositories > repository, "\
23
+ "pluginRepositories > pluginRepository"
24
+
25
+ # The Central Repository is included in the Super POM, which is
26
+ # always inherited from.
27
+ CENTRAL_REPO_URL = "https://repo.maven.apache.org/maven2"
28
+
29
+ def initialize(dependency_files:, evaluate_properties: true)
30
+ @dependency_files = dependency_files
31
+
32
+ # We need the option not to evaluate properties so as not to have a
33
+ # circular dependency between this class and the PropertyValueFinder
34
+ # class
35
+ @evaluate_properties = evaluate_properties
36
+ end
37
+
38
+ # Collect all repository URLs from this POM and its parents
39
+ def repository_urls(pom:, exclude_inherited: false)
40
+ repo_urls_in_pom =
41
+ Nokogiri::XML(pom.content).
42
+ css(REPOSITORY_SELECTOR).
43
+ map { |node| node.at_css("url").content.strip.gsub(%r{/$}, "") }.
44
+ reject { |url| contains_property?(url) && !evaluate_properties? }.
45
+ select { |url| url.start_with?("http") }.
46
+ map { |url| evaluated_value(url, pom) }
47
+
48
+ return repo_urls_in_pom + [CENTRAL_REPO_URL] if exclude_inherited
49
+
50
+ unless (parent = parent_pom(pom, repo_urls_in_pom))
51
+ return repo_urls_in_pom + [CENTRAL_REPO_URL]
52
+ end
53
+
54
+ repo_urls_in_pom + repository_urls(pom: parent)
55
+ end
56
+
57
+ private
58
+
59
+ attr_reader :dependency_files
60
+
61
+ def evaluate_properties?
62
+ @evaluate_properties
63
+ end
64
+
65
+ def parent_pom(pom, repo_urls)
66
+ doc = Nokogiri::XML(pom.content)
67
+ doc.remove_namespaces!
68
+ group_id = doc.at_xpath("/project/parent/groupId")&.content&.strip
69
+ artifact_id =
70
+ doc.at_xpath("/project/parent/artifactId")&.content&.strip
71
+ version = doc.at_xpath("/project/parent/version")&.content&.strip
72
+
73
+ return unless group_id && artifact_id
74
+
75
+ name = [group_id, artifact_id].join(":")
76
+
77
+ if internal_dependency_poms[name]
78
+ return internal_dependency_poms[name]
79
+ end
80
+
81
+ return unless version && !version.include?(",")
82
+
83
+ fetch_remote_parent_pom(group_id, artifact_id, version, repo_urls)
84
+ end
85
+
86
+ def internal_dependency_poms
87
+ return @internal_dependency_poms if @internal_dependency_poms
88
+
89
+ @internal_dependency_poms = {}
90
+ dependency_files.each do |pom|
91
+ doc = Nokogiri::XML(pom.content)
92
+ group_id = doc.at_css("project > groupId") ||
93
+ doc.at_css("project > parent > groupId")
94
+ artifact_id = doc.at_css("project > artifactId")
95
+
96
+ next unless group_id && artifact_id
97
+
98
+ dependency_name = [
99
+ group_id.content.strip,
100
+ artifact_id.content.strip
101
+ ].join(":")
102
+
103
+ @internal_dependency_poms[dependency_name] = pom
104
+ end
105
+
106
+ @internal_dependency_poms
107
+ end
108
+
109
+ def fetch_remote_parent_pom(group_id, artifact_id, version, repo_urls)
110
+ (repo_urls + [CENTRAL_REPO_URL]).uniq.each do |base_url|
111
+ url = remote_pom_url(group_id, artifact_id, version, base_url)
112
+
113
+ @maven_responses ||= {}
114
+ @maven_responses[url] ||= Excon.get(
115
+ url,
116
+ idempotent: true,
117
+ **SharedHelpers.excon_defaults
118
+ )
119
+ next unless @maven_responses[url].status == 200
120
+ next unless pom?(@maven_responses[url].body)
121
+
122
+ dependency_file = DependencyFile.new(
123
+ name: "remote_pom.xml",
124
+ content: @maven_responses[url].body
125
+ )
126
+
127
+ return dependency_file
128
+ rescue Excon::Error::Socket, Excon::Error::Timeout
129
+ nil
130
+ end
131
+
132
+ # If a parent POM couldn't be found, return `nil`
133
+ nil
134
+ end
135
+
136
+ def remote_pom_url(group_id, artifact_id, version, base_repo_url)
137
+ "#{base_repo_url}/"\
138
+ "#{group_id.tr('.', '/')}/#{artifact_id}/#{version}/"\
139
+ "#{artifact_id}-#{version}.pom"
140
+ end
141
+
142
+ def contains_property?(value)
143
+ value.match?(property_regex)
144
+ end
145
+
146
+ def evaluated_value(value, pom)
147
+ return value unless contains_property?(value)
148
+
149
+ property_name = value.match(property_regex).
150
+ named_captures.fetch("property")
151
+ property_value = value_for_property(property_name, pom)
152
+
153
+ value.gsub(property_regex, property_value)
154
+ end
155
+
156
+ def value_for_property(property_name, pom)
157
+ value =
158
+ property_value_finder.
159
+ property_details(
160
+ property_name: property_name,
161
+ callsite_pom: pom
162
+ )&.fetch(:value)
163
+
164
+ return value if value
165
+
166
+ msg = "Property not found: #{property_name}"
167
+ raise DependencyFileNotEvaluatable, msg
168
+ end
169
+
170
+ # Cached, since this can makes calls to the registry (to get property
171
+ # values from parent POMs)
172
+ def property_value_finder
173
+ @property_value_finder ||=
174
+ PropertyValueFinder.new(dependency_files: dependency_files)
175
+ end
176
+
177
+ def property_regex
178
+ FileParsers::Java::Maven::PROPERTY_REGEX
179
+ end
180
+
181
+ def pom?(content)
182
+ !Nokogiri::XML(content).at_css("project > artifactId").nil?
183
+ end
184
+ end
185
+ end
186
+ end
187
+ end
188
+ end