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,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/metadata_finders/ruby/bundler"
4
+ require "dependabot/metadata_finders/python/pip"
5
+ require "dependabot/metadata_finders/java_script/npm_and_yarn"
6
+ require "dependabot/metadata_finders/java/maven"
7
+ require "dependabot/metadata_finders/php/composer"
8
+ require "dependabot/metadata_finders/git/submodules"
9
+ require "dependabot/metadata_finders/docker/docker"
10
+ require "dependabot/metadata_finders/elixir/hex"
11
+ require "dependabot/metadata_finders/rust/cargo"
12
+ require "dependabot/metadata_finders/dotnet/nuget"
13
+ require "dependabot/metadata_finders/go/dep"
14
+ require "dependabot/metadata_finders/elm/elm_package"
15
+
16
+ module Dependabot
17
+ module MetadataFinders
18
+ @metadata_finders = {
19
+ "bundler" => MetadataFinders::Ruby::Bundler,
20
+ "npm_and_yarn" => MetadataFinders::JavaScript::NpmAndYarn,
21
+ "maven" => MetadataFinders::Java::Maven,
22
+ "gradle" => MetadataFinders::Java::Maven,
23
+ "pip" => MetadataFinders::Python::Pip,
24
+ "composer" => MetadataFinders::Php::Composer,
25
+ "submodules" => MetadataFinders::Git::Submodules,
26
+ "docker" => MetadataFinders::Docker::Docker,
27
+ "hex" => MetadataFinders::Elixir::Hex,
28
+ "cargo" => MetadataFinders::Rust::Cargo,
29
+ "nuget" => MetadataFinders::Dotnet::Nuget,
30
+ "dep" => MetadataFinders::Go::Dep,
31
+ "go_modules" => MetadataFinders::Go::Dep,
32
+ "elm-package" => MetadataFinders::Elm::ElmPackage
33
+ }
34
+
35
+ def self.for_package_manager(package_manager)
36
+ metadata_finder = @metadata_finders[package_manager]
37
+ return metadata_finder if metadata_finder
38
+
39
+ raise "Unsupported package_manager #{package_manager}"
40
+ end
41
+
42
+ def self.register(package_manager, metadata_finder)
43
+ @metadata_finders[package_manager] = metadata_finder
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,53 @@
1
+ # Metadata finders
2
+
3
+ Metadata finders look up metadata about a dependency, such as its GitHub URL.
4
+
5
+ There is a `Dependabot::MetadataFinders` class for each language Dependabot
6
+ supports.
7
+
8
+ ## Public API
9
+
10
+ Each `Dependabot::MetadataFinders` class exposes the following methods:
11
+
12
+ | Method | Description |
13
+ |-----------------------|---------------------------------------------------------------------------------------------|
14
+ | `#source_url` | A link to the source data for the dependency. |
15
+ | `#homepage_url` | A link to the homepage for the dependency. |
16
+ | `#commits_url` | A link to a commit diff between the previous version of the dependency and the new version. |
17
+ | `#commits` | A list of commits between the previous version of the dependency and the new version. |
18
+ | `#changelog_url` | A link to the changelog for the dependency. |
19
+ | `#changelog_text` | The relevant text from the changelog. |
20
+ | `#release_url` | A link to the release notes for this version of the dependency. |
21
+ | `#release_text` | The relevant text from the release notes |
22
+ | `#upgrade_guide_url` | A link to the upgrade guide for this upgrade (if it exists). |
23
+ | `#upgrade_guide_text` | The text of the upgrade guide for this upgrade (if it exists). |
24
+
25
+ An integration might look as follows:
26
+
27
+ ```ruby
28
+ require 'dependabot/metadata_finders'
29
+
30
+ dependency = update_checker.updated_dependency
31
+
32
+ metadata_finder_class = Dependabot::MetadataFinders::Ruby::Bundler
33
+ metadata_finder = metadata_finder_class.new(
34
+ dependency: dependency,
35
+ credentials: credentials
36
+ )
37
+
38
+ puts "Changelog for #{dependency.name} is at #{metadata_finder.changelog_url}"
39
+ ```
40
+
41
+ ## Writing a metadata finder for a new language
42
+
43
+ All new metadata finders should inherit from `Dependabot::MetadataFinders::Base`
44
+ and implement the following methods:
45
+
46
+ | Method | Description |
47
+ |------------------------|-------------------------|
48
+ | `#look_up_source` | Private method that returns a `Dependabot::Source` object. Generally the source details are extracted from a source code URL provided by the language's dependency registry, but sometimes it's already know from parsing the dependency file. |
49
+
50
+ To ensure the above are implemented, you should include
51
+ `it_behaves_like "a dependency metadata finder"` in your specs for the new
52
+ metadata finder.
53
+
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/source"
4
+
5
+ module Dependabot
6
+ module MetadataFinders
7
+ class Base
8
+ require "dependabot/metadata_finders/base/changelog_finder"
9
+ require "dependabot/metadata_finders/base/release_finder"
10
+ require "dependabot/metadata_finders/base/commits_finder"
11
+
12
+ attr_reader :dependency, :credentials
13
+
14
+ def initialize(dependency:, credentials:)
15
+ @dependency = dependency
16
+ @credentials = credentials
17
+ end
18
+
19
+ def source_url
20
+ source&.url
21
+ end
22
+
23
+ def homepage_url
24
+ source_url
25
+ end
26
+
27
+ def changelog_url
28
+ @changelog_finder ||= ChangelogFinder.new(
29
+ dependency: dependency,
30
+ source: source,
31
+ credentials: credentials
32
+ )
33
+ @changelog_finder.changelog_url
34
+ end
35
+
36
+ def changelog_text
37
+ @changelog_finder ||= ChangelogFinder.new(
38
+ dependency: dependency,
39
+ source: source,
40
+ credentials: credentials
41
+ )
42
+ @changelog_finder.changelog_text
43
+ end
44
+
45
+ def upgrade_guide_url
46
+ @changelog_finder ||= ChangelogFinder.new(
47
+ dependency: dependency,
48
+ source: source,
49
+ credentials: credentials
50
+ )
51
+ @changelog_finder.upgrade_guide_url
52
+ end
53
+
54
+ def upgrade_guide_text
55
+ @changelog_finder ||= ChangelogFinder.new(
56
+ dependency: dependency,
57
+ source: source,
58
+ credentials: credentials
59
+ )
60
+ @changelog_finder.upgrade_guide_text
61
+ end
62
+
63
+ def releases_url
64
+ @release_finder ||= ReleaseFinder.new(
65
+ dependency: dependency,
66
+ source: source,
67
+ credentials: credentials
68
+ )
69
+ @release_finder.releases_url
70
+ end
71
+
72
+ def releases_text
73
+ @release_finder ||= ReleaseFinder.new(
74
+ dependency: dependency,
75
+ source: source,
76
+ credentials: credentials
77
+ )
78
+ @release_finder.releases_text
79
+ end
80
+
81
+ def commits_url
82
+ @commits_finder ||= CommitsFinder.new(
83
+ dependency: dependency,
84
+ source: source,
85
+ credentials: credentials
86
+ )
87
+ @commits_finder.commits_url
88
+ end
89
+
90
+ def commits
91
+ @commits_finder ||= CommitsFinder.new(
92
+ dependency: dependency,
93
+ source: source,
94
+ credentials: credentials
95
+ )
96
+ @commits_finder.commits
97
+ end
98
+
99
+ def maintainer_changes
100
+ nil
101
+ end
102
+
103
+ private
104
+
105
+ def source
106
+ return @source if @source_lookup_attempted
107
+
108
+ @source_lookup_attempted = true
109
+ @source = look_up_source
110
+ end
111
+
112
+ def look_up_source
113
+ raise NotImplementedError
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,317 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "excon"
4
+
5
+ require "dependabot/clients/github_with_retries"
6
+ require "dependabot/clients/gitlab"
7
+ require "dependabot/clients/bitbucket"
8
+ require "dependabot/shared_helpers"
9
+ require "dependabot/metadata_finders/base"
10
+
11
+ module Dependabot
12
+ module MetadataFinders
13
+ class Base
14
+ class ChangelogFinder
15
+ require_relative "changelog_pruner"
16
+ require_relative "commits_finder"
17
+
18
+ # Earlier entries are preferred
19
+ CHANGELOG_NAMES = %w(changelog history news changes release).freeze
20
+
21
+ attr_reader :source, :dependency, :credentials
22
+
23
+ def initialize(source:, dependency:, credentials:)
24
+ @source = source
25
+ @dependency = dependency
26
+ @credentials = credentials
27
+ end
28
+
29
+ def changelog_url
30
+ changelog&.html_url
31
+ end
32
+
33
+ def changelog_text
34
+ return unless full_changelog_text
35
+
36
+ ChangelogPruner.new(
37
+ dependency: dependency,
38
+ changelog_text: full_changelog_text
39
+ ).pruned_text
40
+ end
41
+
42
+ def upgrade_guide_url
43
+ upgrade_guide&.html_url
44
+ end
45
+
46
+ def upgrade_guide_text
47
+ return unless upgrade_guide
48
+
49
+ @upgrade_guide_text ||= fetch_file_text(upgrade_guide)
50
+ end
51
+
52
+ private
53
+
54
+ # rubocop:disable Metrics/CyclomaticComplexity
55
+ # rubocop:disable Metrics/PerceivedComplexity
56
+ def changelog
57
+ return unless source
58
+
59
+ # Changelog won't be relevant for a git commit bump
60
+ return if git_source? && !ref_changed?
61
+
62
+ # If there is a changelog, and it includes the new version, return it
63
+ if new_version && default_branch_changelog &&
64
+ fetch_file_text(default_branch_changelog)&.include?(new_version)
65
+ return default_branch_changelog
66
+ end
67
+
68
+ # Otherwise, look for a changelog at the tag for this version
69
+ if new_version && relevant_tag_changelog &&
70
+ fetch_file_text(relevant_tag_changelog)&.include?(new_version)
71
+ return relevant_tag_changelog
72
+ end
73
+
74
+ # Fall back to the changelog (or nil) from the default branch
75
+ default_branch_changelog
76
+ end
77
+ # rubocop:enable Metrics/CyclomaticComplexity
78
+ # rubocop:enable Metrics/PerceivedComplexity
79
+
80
+ def default_branch_changelog
81
+ return unless source
82
+
83
+ @default_branch_changelog ||= changelog_from_ref(nil)
84
+ end
85
+
86
+ def relevant_tag_changelog
87
+ return unless source
88
+ return unless tag_for_new_version
89
+
90
+ @relevant_tag_changelog ||= changelog_from_ref(tag_for_new_version)
91
+ end
92
+
93
+ def changelog_from_ref(ref)
94
+ files =
95
+ dependency_file_list(ref).
96
+ select { |f| f.type == "file" }.
97
+ reject { |f| f.name.end_with?(".sh") }.
98
+ reject { |f| f.size > 1_000_000 }
99
+
100
+ CHANGELOG_NAMES.each do |name|
101
+ candidates = files.select { |f| f.name =~ /#{name}/i }
102
+ file = candidates.first if candidates.one?
103
+ file ||=
104
+ candidates.find do |f|
105
+ candidates -= [f] && next if fetch_file_text(f).nil?
106
+ ChangelogPruner.new(
107
+ dependency: dependency,
108
+ changelog_text: fetch_file_text(f)
109
+ ).includes_new_version?
110
+ end
111
+ file ||= candidates.max_by(&:size)
112
+ return file if file
113
+ end
114
+
115
+ nil
116
+ end
117
+
118
+ def tag_for_new_version
119
+ CommitsFinder.new(
120
+ dependency: dependency,
121
+ source: source,
122
+ credentials: credentials
123
+ ).new_tag
124
+ end
125
+
126
+ def full_changelog_text
127
+ return unless changelog
128
+
129
+ fetch_file_text(changelog)
130
+ end
131
+
132
+ def fetch_file_text(file)
133
+ @file_text ||= {}
134
+
135
+ unless @file_text.key?(file.download_url)
136
+ @file_text[file.download_url] =
137
+ case source.provider
138
+ when "github" then fetch_github_file(file)
139
+ when "gitlab" then fetch_gitlab_file(file)
140
+ when "bitbucket" then fetch_bitbucket_file(file)
141
+ else raise "Unsupported provider '#{source.provider}"
142
+ end
143
+ end
144
+
145
+ return unless @file_text[file.download_url].valid_encoding?
146
+
147
+ @file_text[file.download_url].
148
+ force_encoding("UTF-8").
149
+ encode.sub(/\n*\z/, "")
150
+ end
151
+
152
+ def fetch_github_file(file)
153
+ # Hitting the download URL directly causes encoding problems
154
+ raw_content = github_client.get(file.url).content
155
+ Base64.decode64(raw_content).force_encoding("UTF-8").encode
156
+ end
157
+
158
+ def fetch_gitlab_file(file)
159
+ Excon.get(
160
+ file.download_url,
161
+ idempotent: true,
162
+ **SharedHelpers.excon_defaults
163
+ ).body
164
+ end
165
+
166
+ def fetch_bitbucket_file(file)
167
+ bitbucket_client.get(file.download_url).body
168
+ end
169
+
170
+ def upgrade_guide
171
+ return unless source
172
+
173
+ # Upgrade guide usually won't be relevant for bumping anything other
174
+ # than the major version
175
+ return unless major_version_upgrade?
176
+
177
+ dependency_file_list.
178
+ select { |f| f.type == "file" }.
179
+ select { |f| f.name.casecmp("upgrade.md").zero? }.
180
+ reject { |f| f.size > 1_000_000 }.
181
+ max_by(&:size)
182
+ end
183
+
184
+ def dependency_file_list(ref = nil)
185
+ @dependency_file_list ||= {}
186
+ @dependency_file_list[ref] ||= fetch_dependency_file_list(ref)
187
+ end
188
+
189
+ def fetch_dependency_file_list(ref)
190
+ case source.provider
191
+ when "github" then fetch_github_file_list(ref)
192
+ when "bitbucket" then fetch_bitbucket_file_list
193
+ when "gitlab" then fetch_gitlab_file_list
194
+ when "azure" then [] # TODO: Fetch files from Azure
195
+ else raise "Unexpected repo provider '#{source.provider}'"
196
+ end
197
+ end
198
+
199
+ def fetch_github_file_list(ref)
200
+ files = []
201
+
202
+ if source.directory
203
+ opts = { path: source.directory, ref: ref }.compact
204
+ files += github_client.contents(source.repo, opts)
205
+ end
206
+
207
+ opts = { ref: ref }.compact
208
+ files += github_client.contents(source.repo, opts)
209
+
210
+ %w(doc docs).each do |dir_name|
211
+ if files.any? { |f| f.name == dir_name && f.type == "dir" }
212
+ opts = { path: dir_name, ref: ref }.compact
213
+ files += github_client.contents(source.repo, opts)
214
+ end
215
+ end
216
+
217
+ files
218
+ rescue Octokit::NotFound
219
+ []
220
+ end
221
+
222
+ def fetch_bitbucket_file_list
223
+ branch = default_bitbucket_branch
224
+ bitbucket_client.fetch_repo_contents(source.repo).map do |file|
225
+ OpenStruct.new(
226
+ name: file.fetch("path").split("/").last,
227
+ type: file.fetch("type") == "commit_file" ? "file" : file["type"],
228
+ size: file.fetch("size", 0),
229
+ html_url: "#{source.url}/src/#{branch}/#{file['path']}",
230
+ download_url: "#{source.url}/raw/#{branch}/#{file['path']}"
231
+ )
232
+ end
233
+ rescue Dependabot::Clients::Bitbucket::NotFound
234
+ []
235
+ end
236
+
237
+ def fetch_gitlab_file_list
238
+ gitlab_client.repo_tree(source.repo).map do |file|
239
+ OpenStruct.new(
240
+ name: file.name,
241
+ type: file.type == "blob" ? "file" : file.type,
242
+ size: 0, # GitLab doesn't return file size
243
+ html_url: "#{source.url}/blob/master/#{file.path}",
244
+ download_url: "#{source.url}/raw/master/#{file.path}"
245
+ )
246
+ end
247
+ rescue Gitlab::Error::NotFound
248
+ []
249
+ end
250
+
251
+ def new_version
252
+ @new_version ||= git_source? ? new_ref : dependency.version
253
+ @new_version&.gsub(/^v/, "")
254
+ end
255
+
256
+ def previous_ref
257
+ dependency.previous_requirements.map do |r|
258
+ r.dig(:source, "ref") || r.dig(:source, :ref)
259
+ end.compact.first
260
+ end
261
+
262
+ def new_ref
263
+ dependency.requirements.map do |r|
264
+ r.dig(:source, "ref") || r.dig(:source, :ref)
265
+ end.compact.first
266
+ end
267
+
268
+ def ref_changed?
269
+ previous_ref && new_ref && previous_ref != new_ref
270
+ end
271
+
272
+ # TODO: Refactor me so that Composer doesn't need to be special cased
273
+ def git_source?
274
+ # Special case Composer, which uses git as a source but handles tags
275
+ # internally
276
+ return false if dependency.package_manager == "composer"
277
+
278
+ requirements = dependency.requirements
279
+ sources = requirements.map { |r| r.fetch(:source) }.uniq.compact
280
+ return false if sources.empty?
281
+ raise "Multiple sources! #{sources.join(', ')}" if sources.count > 1
282
+
283
+ source_type = sources.first[:type] || sources.first.fetch("type")
284
+ source_type == "git"
285
+ end
286
+
287
+ def major_version_upgrade?
288
+ return false unless dependency.version&.match?(/^\d/)
289
+ return false unless dependency.previous_version&.match?(/^\d/)
290
+
291
+ dependency.version.split(".").first.to_i -
292
+ dependency.previous_version.split(".").first.to_i >= 1
293
+ end
294
+
295
+ def gitlab_client
296
+ @gitlab_client ||= Dependabot::Clients::Gitlab.
297
+ for_gitlab_dot_com(credentials: credentials)
298
+ end
299
+
300
+ def github_client
301
+ @github_client ||= Dependabot::Clients::GithubWithRetries.
302
+ for_github_dot_com(credentials: credentials)
303
+ end
304
+
305
+ def bitbucket_client
306
+ @bitbucket_client ||= Dependabot::Clients::Bitbucket.
307
+ for_bitbucket_dot_org(credentials: credentials)
308
+ end
309
+
310
+ def default_bitbucket_branch
311
+ @default_bitbucket_branch ||=
312
+ bitbucket_client.fetch_default_branch(source.repo)
313
+ end
314
+ end
315
+ end
316
+ end
317
+ end