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,215 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "excon"
4
+ require "time"
5
+
6
+ require "dependabot/metadata_finders/base"
7
+ require "dependabot/shared_helpers"
8
+ require "dependabot/utils"
9
+
10
+ module Dependabot
11
+ module MetadataFinders
12
+ module JavaScript
13
+ class NpmAndYarn < Dependabot::MetadataFinders::Base
14
+ def homepage_url
15
+ # Attempt to use version_listing first, as fetching the entire listing
16
+ # array can be slow (if it's large)
17
+ if latest_version_listing["homepage"]
18
+ return latest_version_listing["homepage"]
19
+ end
20
+
21
+ listing = all_version_listings.find { |_, l| l["homepage"] }
22
+ listing&.last&.fetch("homepage", nil) || super
23
+ end
24
+
25
+ def maintainer_changes
26
+ return unless npm_releaser
27
+ return unless npm_listing.dig("time", dependency.version)
28
+ return if previous_releasers.include?(npm_releaser)
29
+
30
+ "This version was pushed to npm by "\
31
+ "[#{npm_releaser}](https://www.npmjs.com/~#{npm_releaser}), a new "\
32
+ "releaser for #{dependency.name} since your current version."
33
+ end
34
+
35
+ private
36
+
37
+ def look_up_source
38
+ return find_source_from_registry if new_source.nil?
39
+
40
+ source_type = new_source[:type] || new_source.fetch("type")
41
+
42
+ case source_type
43
+ when "git" then find_source_from_git_url
44
+ when "private_registry" then find_source_from_registry
45
+ else raise "Unexpected source type: #{source_type}"
46
+ end
47
+ end
48
+
49
+ def npm_releaser
50
+ all_version_listings.
51
+ find { |v, _| v == dependency.version }&.
52
+ last&.fetch("_npmUser", nil)&.fetch("name", nil)
53
+ end
54
+
55
+ def previous_releasers
56
+ times = npm_listing.fetch("time")
57
+
58
+ cutoff =
59
+ if dependency.previous_version && times[dependency.previous_version]
60
+ Time.parse(times[dependency.previous_version])
61
+ elsif times[dependency.version]
62
+ Time.parse(times[dependency.version]) - 1
63
+ end
64
+ return unless cutoff
65
+
66
+ all_version_listings.
67
+ reject { |v, _| Time.parse(times[v]) > cutoff }.
68
+ map { |_, d| d.fetch("_npmUser", nil)&.fetch("name", nil) }.compact
69
+ end
70
+
71
+ def find_source_from_registry
72
+ # Attempt to use version_listing first, as fetching the entire listing
73
+ # array can be slow (if it's large)
74
+ potential_source_urls =
75
+ [
76
+ get_url(latest_version_listing["repository"]),
77
+ get_url(latest_version_listing["homepage"]),
78
+ get_url(latest_version_listing["bugs"])
79
+ ].compact
80
+
81
+ source_url = potential_source_urls.find { |url| Source.from_url(url) }
82
+ return Source.from_url(source_url) if Source.from_url(source_url)
83
+
84
+ potential_source_urls =
85
+ all_version_listings.flat_map do |_, listing|
86
+ [
87
+ get_url(listing["repository"]),
88
+ get_url(listing["homepage"]),
89
+ get_url(listing["bugs"])
90
+ ]
91
+ end.compact
92
+
93
+ source_url = potential_source_urls.find { |url| Source.from_url(url) }
94
+ Source.from_url(source_url)
95
+ end
96
+
97
+ def new_source
98
+ sources = dependency.requirements.
99
+ map { |r| r.fetch(:source) }.uniq.compact
100
+
101
+ raise "Multiple sources! #{sources.join(', ')}" if sources.count > 1
102
+
103
+ sources.first
104
+ end
105
+
106
+ def get_url(details)
107
+ case details
108
+ when String then details
109
+ when Hash then details.fetch("url", nil)
110
+ end
111
+ end
112
+
113
+ def find_source_from_git_url
114
+ url = new_source[:url] || new_source.fetch("url")
115
+ Source.from_url(url)
116
+ end
117
+
118
+ def latest_version_listing
119
+ return @latest_version_listing if defined?(@latest_version_listing)
120
+
121
+ response = Excon.get(
122
+ "#{dependency_url}/latest",
123
+ headers: registry_auth_headers,
124
+ idempotent: true,
125
+ **SharedHelpers.excon_defaults
126
+ )
127
+
128
+ if response.status == 200
129
+ return @latest_version_listing = JSON.parse(response.body)
130
+ end
131
+
132
+ @latest_version_listing = {}
133
+ rescue JSON::ParserError, Excon::Error::Timeout
134
+ @latest_version_listing = {}
135
+ end
136
+
137
+ def all_version_listings
138
+ return [] if npm_listing["versions"].nil?
139
+
140
+ npm_listing["versions"].
141
+ reject { |_, details| details["deprecated"] }.
142
+ sort_by { |version, _| Utils::JavaScript::Version.new(version) }.
143
+ reverse
144
+ end
145
+
146
+ def npm_listing
147
+ return @npm_listing unless @npm_listing.nil?
148
+
149
+ response = Excon.get(
150
+ dependency_url,
151
+ headers: registry_auth_headers,
152
+ idempotent: true,
153
+ **SharedHelpers.excon_defaults
154
+ )
155
+
156
+ return @npm_listing = {} if response.status >= 500
157
+
158
+ begin
159
+ @npm_listing = JSON.parse(response.body)
160
+ rescue JSON::ParserError
161
+ raise unless non_standard_registry?
162
+
163
+ @npm_listing = {}
164
+ end
165
+ rescue Excon::Error::Timeout
166
+ @npm_listing = {}
167
+ end
168
+
169
+ def dependency_url
170
+ registry_url =
171
+ if new_source.nil? then "https://registry.npmjs.org"
172
+ else new_source.fetch(:url)
173
+ end
174
+
175
+ # NPM registries expect slashes to be escaped
176
+ escaped_dependency_name = dependency.name.gsub("/", "%2F")
177
+ "#{registry_url}/#{escaped_dependency_name}"
178
+ end
179
+
180
+ def registry_auth_headers
181
+ return {} unless auth_token
182
+
183
+ { "Authorization" => "Bearer #{auth_token}" }
184
+ end
185
+
186
+ def dependency_registry
187
+ if new_source.nil? then "registry.npmjs.org"
188
+ else new_source.fetch(:url).gsub("https://", "").gsub("http://", "")
189
+ end
190
+ end
191
+
192
+ def auth_token
193
+ credentials.
194
+ select { |cred| cred["type"] == "npm_registry" }.
195
+ find { |cred| cred["registry"] == dependency_registry }&.
196
+ fetch("token")
197
+ end
198
+
199
+ def private_dependency_not_reachable?(npm_response)
200
+ # Check whether this dependency is (likely to be) private
201
+ if dependency_registry == "registry.npmjs.org" &&
202
+ !dependency.name.start_with?("@")
203
+ return false
204
+ end
205
+
206
+ [401, 403, 404].include?(npm_response.status)
207
+ end
208
+
209
+ def non_standard_registry?
210
+ dependency_registry != "registry.npmjs.org"
211
+ end
212
+ end
213
+ end
214
+ end
215
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "excon"
4
+ require "dependabot/metadata_finders/base"
5
+ require "dependabot/shared_helpers"
6
+ require "dependabot/utils"
7
+
8
+ module Dependabot
9
+ module MetadataFinders
10
+ module Php
11
+ class Composer < Dependabot::MetadataFinders::Base
12
+ private
13
+
14
+ def look_up_source
15
+ source_from_dependency || look_up_source_from_packagist
16
+ end
17
+
18
+ def source_from_dependency
19
+ source_url =
20
+ dependency.requirements.
21
+ map { |r| r.fetch(:source) }.compact.
22
+ first&.fetch(:url, nil)
23
+
24
+ Source.from_url(source_url)
25
+ end
26
+
27
+ def look_up_source_from_packagist
28
+ return nil if packagist_listing&.fetch("packages", nil) == []
29
+ unless packagist_listing&.dig("packages", dependency.name.downcase)
30
+ return nil
31
+ end
32
+
33
+ version_listings =
34
+ packagist_listing["packages"][dependency.name.downcase].
35
+ select { |version, _| Utils::Php::Version.correct?(version) }.
36
+ sort_by { |version, _| Utils::Php::Version.new(version) }.
37
+ map { |_, listing| listing }.
38
+ reverse
39
+
40
+ potential_source_urls =
41
+ version_listings.
42
+ flat_map { |info| [info["homepage"], info.dig("source", "url")] }.
43
+ compact
44
+
45
+ source_url = potential_source_urls.find { |url| Source.from_url(url) }
46
+
47
+ Source.from_url(source_url)
48
+ end
49
+
50
+ def packagist_listing
51
+ return @packagist_listing unless @packagist_listing.nil?
52
+
53
+ response = Excon.get(
54
+ "https://packagist.org/p/#{dependency.name.downcase}.json",
55
+ idempotent: true,
56
+ **SharedHelpers.excon_defaults
57
+ )
58
+
59
+ return nil unless response.status == 200
60
+
61
+ @packagist_listing = JSON.parse(response.body)
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,120 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "excon"
4
+ require "dependabot/metadata_finders/base"
5
+ require "dependabot/shared_helpers"
6
+
7
+ module Dependabot
8
+ module MetadataFinders
9
+ module Python
10
+ class Pip < Dependabot::MetadataFinders::Base
11
+ MAIN_PYPI_URL = "https://pypi.org/pypi"
12
+
13
+ def homepage_url
14
+ pypi_listing.dig("info", "home_page") || super
15
+ end
16
+
17
+ private
18
+
19
+ def look_up_source
20
+ potential_source_urls = [
21
+ pypi_listing.dig("info", "home_page"),
22
+ pypi_listing.dig("info", "bugtrack_url"),
23
+ pypi_listing.dig("info", "download_url"),
24
+ pypi_listing.dig("info", "docs_url")
25
+ ].compact
26
+
27
+ source_url = potential_source_urls.find { |url| Source.from_url(url) }
28
+ source_url ||= source_from_description
29
+ source_url ||= source_from_homepage
30
+
31
+ Source.from_url(source_url)
32
+ end
33
+
34
+ def source_from_description
35
+ github_urls = []
36
+ desc = pypi_listing.dig("info", "description")
37
+ return unless desc
38
+
39
+ desc.scan(Source::SOURCE_REGEX) do
40
+ github_urls << Regexp.last_match.to_s
41
+ end
42
+
43
+ github_urls.find do |url|
44
+ repo = Source.from_url(url).repo
45
+ repo.downcase.end_with?(dependency.name)
46
+ end
47
+ end
48
+
49
+ def source_from_homepage
50
+ return unless homepage_body
51
+
52
+ github_urls = []
53
+ homepage_body.scan(Source::SOURCE_REGEX) do
54
+ github_urls << Regexp.last_match.to_s
55
+ end
56
+
57
+ github_urls.find do |url|
58
+ repo = Source.from_url(url).repo
59
+ repo.downcase.end_with?(dependency.name)
60
+ end
61
+ end
62
+
63
+ def homepage_body
64
+ homepage_url = pypi_listing.dig("info", "home_page")
65
+
66
+ return unless homepage_url
67
+ return if homepage_url.include?("pypi.python.org")
68
+ return if homepage_url.include?("pypi.org")
69
+
70
+ @homepage_response ||=
71
+ begin
72
+ Excon.get(
73
+ homepage_url,
74
+ idempotent: true,
75
+ **SharedHelpers.excon_defaults
76
+ )
77
+ rescue Excon::Error::Timeout, Excon::Error::Socket, ArgumentError
78
+ nil
79
+ end
80
+
81
+ return unless @homepage_response&.status == 200
82
+
83
+ @homepage_response.body
84
+ end
85
+
86
+ def pypi_listing
87
+ return @pypi_listing unless @pypi_listing.nil?
88
+ return @pypi_listing = {} if dependency.version.include?("+")
89
+
90
+ possible_listing_urls.each do |url|
91
+ response = Excon.get(
92
+ url,
93
+ idempotent: true,
94
+ **SharedHelpers.excon_defaults
95
+ )
96
+ next unless response.status == 200
97
+
98
+ @pypi_listing = JSON.parse(response.body)
99
+ return @pypi_listing
100
+ rescue JSON::ParserError
101
+ next
102
+ end
103
+
104
+ @pypi_listing = {} # No listing found
105
+ end
106
+
107
+ def possible_listing_urls
108
+ credential_urls =
109
+ credentials.
110
+ select { |cred| cred["type"] == "python_index" }.
111
+ map { |cred| cred["index-url"].gsub(%r{/$}, "") }
112
+
113
+ (credential_urls + [MAIN_PYPI_URL]).map do |base_url|
114
+ base_url + "/#{dependency.name}/json"
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,150 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "excon"
4
+ require "dependabot/metadata_finders/base"
5
+
6
+ module Dependabot
7
+ module MetadataFinders
8
+ module Ruby
9
+ class Bundler < Dependabot::MetadataFinders::Base
10
+ SOURCE_KEYS = %w(
11
+ source_code_uri
12
+ homepage_uri
13
+ wiki_uri
14
+ bug_tracker_uri
15
+ documentation_uri
16
+ changelog_uri
17
+ mailing_list_uri
18
+ download_uri
19
+ ).freeze
20
+
21
+ def homepage_url
22
+ if new_source_type == "default" || new_source_type == "rubygems"
23
+ if rubygems_listing["homepage_uri"]
24
+ return rubygems_listing["homepage_uri"]
25
+ end
26
+ end
27
+
28
+ super
29
+ end
30
+
31
+ private
32
+
33
+ def look_up_source
34
+ case new_source_type
35
+ when "default", "rubygems" then find_source_from_rubygems_listing
36
+ when "git" then find_source_from_git_url
37
+ else raise "Unexpected source type: #{new_source_type}"
38
+ end
39
+ end
40
+
41
+ def new_source_type
42
+ sources =
43
+ dependency.requirements.map { |r| r.fetch(:source) }.uniq.compact
44
+
45
+ return "default" if sources.empty?
46
+ raise "Multiple sources! #{sources.join(', ')}" if sources.count > 1
47
+
48
+ sources.first[:type] || sources.first.fetch("type")
49
+ end
50
+
51
+ def find_source_from_rubygems_listing
52
+ source_url = rubygems_listing.
53
+ values_at(*SOURCE_KEYS).
54
+ compact.
55
+ find { |url| Source.from_url(url) }
56
+
57
+ Source.from_url(source_url)
58
+ end
59
+
60
+ def find_source_from_git_url
61
+ info = dependency.requirements.map { |r| r[:source] }.compact.first
62
+
63
+ url = info[:url] || info.fetch("url")
64
+ Source.from_url(url)
65
+ end
66
+
67
+ def rubygems_listing
68
+ return @rubygems_listing unless @rubygems_listing.nil?
69
+
70
+ response =
71
+ Excon.get(
72
+ "#{registry_url}api/v1/gems/#{dependency.name}.json",
73
+ headers: registry_auth_headers,
74
+ idempotent: true,
75
+ **SharedHelpers.excon_defaults
76
+ )
77
+ response_body = response.body
78
+ response_body = augment_private_response_if_appropriate(response_body)
79
+
80
+ @rubygems_listing = JSON.parse(response_body)
81
+ append_slash_to_source_code_uri(@rubygems_listing)
82
+ rescue JSON::ParserError, Excon::Error::Timeout
83
+ @rubygems_listing = {}
84
+ end
85
+
86
+ def append_slash_to_source_code_uri(listing)
87
+ # We have to do this so that `Source.from_url(...)` doesn't prune the
88
+ # last line off of the directory.
89
+ return listing unless listing&.fetch("source_code_uri", nil)
90
+ return listing if listing.fetch("source_code_uri").end_with?("/")
91
+
92
+ listing["source_code_uri"] = listing["source_code_uri"] + "/"
93
+ listing
94
+ end
95
+
96
+ def augment_private_response_if_appropriate(response_body)
97
+ return response_body if new_source_type == "default"
98
+
99
+ parsed_body = JSON.parse(response_body)
100
+ return response_body if (SOURCE_KEYS - parsed_body.keys).none?
101
+
102
+ digest = parsed_body.values_at("version", "authors", "info").hash
103
+
104
+ source_url = parsed_body.
105
+ values_at(*SOURCE_KEYS).
106
+ compact.
107
+ find { |url| Source.from_url(url) }
108
+ return response_body if source_url
109
+
110
+ rubygems_response =
111
+ Excon.get(
112
+ "https://rubygems.org/api/v1/gems/#{dependency.name}.json",
113
+ idempotent: true,
114
+ **SharedHelpers.excon_defaults
115
+ )
116
+ parsed_rubygems_body = JSON.parse(rubygems_response.body)
117
+ rubygems_digest =
118
+ parsed_rubygems_body.values_at("version", "authors", "info").hash
119
+
120
+ digest == rubygems_digest ? rubygems_response.body : response_body
121
+ rescue JSON::ParserError, Excon::Error::Socket, Excon::Error::Timeout
122
+ response_body
123
+ end
124
+
125
+ def registry_url
126
+ return "https://rubygems.org/" if new_source_type == "default"
127
+
128
+ info = dependency.requirements.map { |r| r[:source] }.compact.first
129
+ info[:url] || info.fetch("url")
130
+ end
131
+
132
+ def registry_auth_headers
133
+ return {} unless new_source_type == "rubygems"
134
+
135
+ token =
136
+ credentials.
137
+ select { |cred| cred["type"] == "rubygems_server" }.
138
+ find { |cred| registry_url.include?(cred["host"]) }&.
139
+ fetch("token")
140
+
141
+ return {} unless token
142
+
143
+ token += ":" unless token.include?(":")
144
+ encoded_token = Base64.encode64(token).delete("\n")
145
+ { "Authorization" => "Basic #{encoded_token}" }
146
+ end
147
+ end
148
+ end
149
+ end
150
+ end