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,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/definition"
4
+
5
+ # Ignore the Bundler version specified in the Gemfile (since the only Bundler
6
+ # version available to us is the one we're using).
7
+ module Bundler
8
+ class Definition
9
+ def expanded_dependencies
10
+ @expanded_dependencies ||=
11
+ expand_dependencies(dependencies + metadata_dependencies, @remote).
12
+ reject { |d| d.name == "bundler" }
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BundlerDefinitionRubyVersionPatch
4
+ def index
5
+ @index ||= super.tap do
6
+ if ruby_version
7
+ requested_version = ruby_version.to_gem_version_with_patchlevel
8
+ sources.metadata_source.specs <<
9
+ Gem::Specification.new("ruby\0", requested_version)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ Bundler::Definition.prepend(BundlerDefinitionRubyVersionPatch)
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bundler
4
+ class Source
5
+ class Git
6
+ class GitProxy
7
+ private
8
+
9
+ # Bundler allows ssh authentication when talking to GitHub but there's
10
+ # no way for Dependabot to do so (it doesn't have any ssh keys).
11
+ # Instead, we convert all `git@github.com:` URLs to use HTTPS.
12
+ def configured_uri_for(uri)
13
+ uri = uri.gsub(/git@(.*?):/, 'https://\1/')
14
+ if uri.match?(/https?:/)
15
+ remote = URI(uri)
16
+ config_auth =
17
+ Bundler.settings[remote.to_s] || Bundler.settings[remote.host]
18
+ remote.userinfo ||= config_auth
19
+ remote.to_s
20
+ else
21
+ uri
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
data/lib/dependabot.rb ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dependabot
4
+ end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/shared_helpers"
4
+ require "excon"
5
+
6
+ module Dependabot
7
+ module Clients
8
+ class Bitbucket
9
+ class NotFound < StandardError; end
10
+
11
+ #######################
12
+ # Constructor methods #
13
+ #######################
14
+
15
+ def self.for_bitbucket_dot_org(credentials:)
16
+ credential =
17
+ credentials.
18
+ select { |cred| cred["type"] == "git_source" }.
19
+ find { |cred| cred["host"] == "bitbucket.org" }
20
+
21
+ new(credential)
22
+ end
23
+
24
+ ##########
25
+ # Client #
26
+ ##########
27
+
28
+ def initialize(credentials)
29
+ @credentials = credentials
30
+ end
31
+
32
+ def fetch_commit(repo, branch)
33
+ path = "#{repo}/refs/branches/#{branch}"
34
+ response = get(base_url + path)
35
+
36
+ JSON.parse(response.body).fetch("target").fetch("hash")
37
+ end
38
+
39
+ def fetch_default_branch(repo)
40
+ response = get(base_url + repo)
41
+
42
+ JSON.parse(response.body).fetch("mainbranch").fetch("name")
43
+ end
44
+
45
+ def fetch_repo_contents(repo, commit = nil, path = nil)
46
+ raise "Commit is required if path provided!" if commit.nil? && path
47
+
48
+ api_path = "#{repo}/src"
49
+ api_path += "/#{commit}" if commit
50
+ api_path += "/#{path.gsub(%r{/+$}, '')}" if path
51
+ api_path += "?pagelen=100"
52
+ response = get(base_url + api_path)
53
+
54
+ JSON.parse(response.body).fetch("values")
55
+ end
56
+
57
+ def fetch_file_contents(repo, commit, path)
58
+ path = "#{repo}/src/#{commit}/#{path.gsub(%r{/+$}, '')}"
59
+ response = get(base_url + path)
60
+
61
+ response.body
62
+ end
63
+
64
+ def tags(repo)
65
+ path = "#{repo}/refs/tags?pagelen=100"
66
+ response = get(base_url + path)
67
+
68
+ JSON.parse(response.body).fetch("values")
69
+ end
70
+
71
+ def compare(repo, previous_tag, new_tag)
72
+ path = "#{repo}/commits/?include=#{new_tag}&exclude=#{previous_tag}"
73
+ response = get(base_url + path)
74
+
75
+ JSON.parse(response.body).fetch("values")
76
+ end
77
+
78
+ def get(url)
79
+ response = Excon.get(
80
+ url,
81
+ user: credentials&.fetch("username"),
82
+ password: credentials&.fetch("password"),
83
+ idempotent: true,
84
+ **SharedHelpers.excon_defaults
85
+ )
86
+ raise NotFound if response.status == 404
87
+
88
+ response
89
+ end
90
+
91
+ private
92
+
93
+ attr_reader :credentials
94
+
95
+ def base_url
96
+ # TODO: Make this configurable when we support enterprise Bitbucket
97
+ "https://api.bitbucket.org/2.0/repositories/"
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "octokit"
4
+
5
+ module Dependabot
6
+ module Clients
7
+ class GithubWithRetries
8
+ DEFAULT_CLIENT_ARGS = {
9
+ connection_options: {
10
+ request: {
11
+ open_timeout: 2,
12
+ timeout: 5
13
+ }
14
+ }
15
+ }.freeze
16
+
17
+ RETRYABLE_ERRORS = [
18
+ Faraday::ConnectionFailed,
19
+ Faraday::TimeoutError,
20
+ Octokit::InternalServerError,
21
+ Octokit::BadGateway
22
+ ].freeze
23
+
24
+ #######################
25
+ # Constructor methods #
26
+ #######################
27
+
28
+ def self.for_source(source:, credentials:)
29
+ access_tokens =
30
+ credentials.
31
+ select { |cred| cred["type"] == "git_source" }.
32
+ select { |cred| cred["host"] == source.hostname }.
33
+ map { |cred| cred.fetch("password") }
34
+
35
+ new(
36
+ access_tokens: access_tokens,
37
+ api_endpoint: source.api_endpoint
38
+ )
39
+ end
40
+
41
+ def self.for_github_dot_com(credentials:)
42
+ access_tokens =
43
+ credentials.
44
+ select { |cred| cred["type"] == "git_source" }.
45
+ select { |cred| cred["host"] == "github.com" }.
46
+ map { |cred| cred.fetch("password") }
47
+
48
+ new(access_tokens: access_tokens)
49
+ end
50
+
51
+ #################
52
+ # VCS Interface #
53
+ #################
54
+
55
+ def fetch_commit(repo, branch)
56
+ ref(repo, "heads/#{branch}").object.sha
57
+ end
58
+
59
+ def fetch_default_branch(repo)
60
+ repository(repo).default_branch
61
+ end
62
+
63
+ ############
64
+ # Proxying #
65
+ ############
66
+
67
+ def initialize(max_retries: 1, **args)
68
+ args = DEFAULT_CLIENT_ARGS.merge(args)
69
+
70
+ access_tokens = args.delete(:access_tokens) || []
71
+ access_tokens << args[:access_token] if args[:access_token]
72
+ access_tokens << nil if access_tokens.empty?
73
+ access_tokens.uniq!
74
+
75
+ @max_retries = max_retries || 1
76
+ @clients = access_tokens.map do |token|
77
+ Octokit::Client.new(args.merge(access_token: token))
78
+ end
79
+ end
80
+
81
+ def method_missing(method_name, *args, &block)
82
+ untried_clients = @clients.dup
83
+ client = untried_clients.pop
84
+
85
+ begin
86
+ retry_connection_failures do
87
+ if client.respond_to?(method_name)
88
+ mutatable_args = args.map(&:dup)
89
+ client.public_send(method_name, *mutatable_args, &block)
90
+ else
91
+ super
92
+ end
93
+ end
94
+ rescue Octokit::NotFound, Octokit::Unauthorized, Octokit::Forbidden
95
+ raise unless (client = untried_clients.pop)
96
+
97
+ retry
98
+ end
99
+ end
100
+
101
+ def respond_to_missing?(method_name, include_private = false)
102
+ @clients.first.respond_to?(method_name) || super
103
+ end
104
+
105
+ def retry_connection_failures
106
+ retry_attempt = 0
107
+
108
+ begin
109
+ yield
110
+ rescue *RETRYABLE_ERRORS
111
+ retry_attempt += 1
112
+ retry_attempt <= @max_retries ? retry : raise
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,72 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "gitlab"
4
+
5
+ module Dependabot
6
+ module Clients
7
+ class Gitlab
8
+ #######################
9
+ # Constructor methods #
10
+ #######################
11
+
12
+ def self.for_source(source:, credentials:)
13
+ access_token =
14
+ credentials.
15
+ select { |cred| cred["type"] == "git_source" }.
16
+ find { |cred| cred["host"] == source.hostname }&.
17
+ fetch("password")
18
+
19
+ new(
20
+ endpoint: source.api_endpoint,
21
+ private_token: access_token || ""
22
+ )
23
+ end
24
+
25
+ def self.for_gitlab_dot_com(credentials:)
26
+ access_token =
27
+ credentials.
28
+ select { |cred| cred["type"] == "git_source" }.
29
+ find { |cred| cred["host"] == "gitlab.com" }&.
30
+ fetch("password")
31
+
32
+ new(
33
+ endpoint: "https://gitlab.com/api/v4",
34
+ private_token: access_token || ""
35
+ )
36
+ end
37
+
38
+ #################
39
+ # VCS Interface #
40
+ #################
41
+
42
+ def fetch_commit(repo, branch)
43
+ branch(repo, branch).commit.id
44
+ end
45
+
46
+ def fetch_default_branch(repo)
47
+ project(repo).default_branch
48
+ end
49
+
50
+ ############
51
+ # Proxying #
52
+ ############
53
+
54
+ def initialize(**args)
55
+ @client = ::Gitlab::Client.new(args)
56
+ end
57
+
58
+ def method_missing(method_name, *args, &block)
59
+ if @client.respond_to?(method_name)
60
+ mutatable_args = args.map(&:dup)
61
+ @client.public_send(method_name, *mutatable_args, &block)
62
+ else
63
+ super
64
+ end
65
+ end
66
+
67
+ def respond_to_missing?(method_name, include_private = false)
68
+ @client.respond_to?(method_name) || super
69
+ end
70
+ end
71
+ end
72
+ end
@@ -0,0 +1,118 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Dependabot
4
+ class Dependency
5
+ attr_reader :name, :version, :requirements, :package_manager,
6
+ :previous_version, :previous_requirements
7
+
8
+ def initialize(name:, requirements:, package_manager:, version: nil,
9
+ previous_version: nil, previous_requirements: nil)
10
+ @name = name
11
+ @version = version
12
+ @requirements = requirements.map { |req| symbolize_keys(req) }
13
+ @previous_version = previous_version
14
+ @previous_requirements =
15
+ previous_requirements&.map { |req| symbolize_keys(req) }
16
+ @package_manager = package_manager
17
+
18
+ check_values
19
+ end
20
+
21
+ def top_level?
22
+ requirements.any?
23
+ end
24
+
25
+ def to_h
26
+ {
27
+ "name" => name,
28
+ "version" => version,
29
+ "requirements" => requirements,
30
+ "previous_version" => previous_version,
31
+ "previous_requirements" => previous_requirements,
32
+ "package_manager" => package_manager
33
+ }
34
+ end
35
+
36
+ def appears_in_lockfile?
37
+ previous_version || (version && previous_requirements.nil?)
38
+ end
39
+
40
+ # rubocop:disable Metrics/CyclomaticComplexity
41
+ # rubocop:disable Metrics/PerceivedComplexity
42
+ def production?
43
+ return true unless top_level?
44
+
45
+ groups = requirements.flat_map { |r| r.fetch(:groups).map(&:to_s) }
46
+
47
+ case package_manager
48
+ when "hex" then groups.empty? || groups.any? { |g| g.include?("prod") }
49
+ when "npm_and_yarn"
50
+ groups.include?("optionalDependencies") ||
51
+ groups.include?("dependencies")
52
+ when "composer" then groups.include?("runtime")
53
+ when "pip"
54
+ groups.empty? ||
55
+ groups.include?("default") ||
56
+ groups.include?("dependencies")
57
+ when "bundler"
58
+ groups.empty? ||
59
+ groups.include?("runtime") ||
60
+ groups.include?("default") ||
61
+ groups.any? { |g| g.include?("prod") }
62
+ else true
63
+ end
64
+ end
65
+ # rubocop:enable Metrics/CyclomaticComplexity
66
+ # rubocop:enable Metrics/PerceivedComplexity
67
+
68
+ def display_name
69
+ return name unless %w(maven gradle).include?(package_manager)
70
+
71
+ name.split(":").last
72
+ end
73
+
74
+ def ==(other)
75
+ other.instance_of?(self.class) && to_h == other.to_h
76
+ end
77
+
78
+ def hash
79
+ to_h.hash
80
+ end
81
+
82
+ def eql?(other)
83
+ self.==(other)
84
+ end
85
+
86
+ private
87
+
88
+ def check_values
89
+ if [version, previous_version].any? { |v| v == "" }
90
+ raise ArgumentError, "blank strings must not be provided as versions"
91
+ end
92
+
93
+ requirement_fields = [requirements, previous_requirements].compact
94
+ unless requirement_fields.all? { |r| r.is_a?(Array) } &&
95
+ requirement_fields.flatten.all? { |r| r.is_a?(Hash) }
96
+ raise ArgumentError, "requirements must be an array of hashes"
97
+ end
98
+
99
+ required_keys = %i(requirement file groups source)
100
+ optional_keys = %i(metadata)
101
+ unless requirement_fields.flatten.
102
+ all? { |r| required_keys.sort == (r.keys - optional_keys).sort }
103
+ raise ArgumentError, "each requirement must have the following "\
104
+ "required keys: #{required_keys.join(', ')}."\
105
+ "Optionally, it may have the following keys: "\
106
+ "#{optional_keys.join(', ')}."
107
+ end
108
+
109
+ return if requirement_fields.flatten.none? { |r| r[:requirement] == "" }
110
+
111
+ raise ArgumentError, "blank strings must not be provided as requirements"
112
+ end
113
+
114
+ def symbolize_keys(hash)
115
+ Hash[hash.keys.map { |k| [k.to_sym, hash[k]] }]
116
+ end
117
+ end
118
+ end