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,280 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/git_commit_checker"
4
+ require "dependabot/update_checkers/base"
5
+ require "dependabot/shared_helpers"
6
+
7
+ module Dependabot
8
+ module UpdateCheckers
9
+ module JavaScript
10
+ class NpmAndYarn < Dependabot::UpdateCheckers::Base
11
+ require_relative "npm_and_yarn/requirements_updater"
12
+ require_relative "npm_and_yarn/library_detector"
13
+ require_relative "npm_and_yarn/latest_version_finder"
14
+ require_relative "npm_and_yarn/version_resolver"
15
+ require_relative "npm_and_yarn/subdependency_version_resolver"
16
+
17
+ def latest_version
18
+ @latest_version ||=
19
+ if git_dependency?
20
+ latest_version_for_git_dependency
21
+ else
22
+ latest_version_details&.fetch(:version)
23
+ end
24
+ end
25
+
26
+ def latest_resolvable_version
27
+ return unless latest_version
28
+
29
+ @latest_resolvable_version ||=
30
+ if dependency.top_level?
31
+ version_resolver.latest_resolvable_version
32
+ else
33
+ # If the dependency is indirect its version is constrained by the
34
+ # requirements placed on it by dependencies lower down the tree
35
+ subdependency_version_resolver.latest_resolvable_version
36
+ end
37
+ end
38
+
39
+ def latest_resolvable_version_with_no_unlock
40
+ return latest_resolvable_version unless dependency.top_level?
41
+
42
+ if git_dependency?
43
+ return latest_resolvable_version_with_no_unlock_for_git_dependency
44
+ end
45
+
46
+ latest_version_finder.latest_resolvable_version_with_no_unlock
47
+ end
48
+
49
+ def updated_requirements
50
+ resolvable_version =
51
+ if latest_resolvable_version.is_a?(version_class)
52
+ latest_resolvable_version.to_s
53
+ elsif latest_resolvable_version.nil?
54
+ nil
55
+ else
56
+ latest_version_details&.fetch(:version, nil)&.to_s
57
+ end
58
+
59
+ @updated_requirements ||=
60
+ RequirementsUpdater.new(
61
+ requirements: dependency.requirements,
62
+ updated_source: updated_source,
63
+ latest_version:
64
+ latest_version_details&.fetch(:version, nil)&.to_s,
65
+ latest_resolvable_version: resolvable_version,
66
+ update_strategy: requirements_update_strategy
67
+ ).updated_requirements
68
+ end
69
+
70
+ def requirements_update_strategy
71
+ # If passed in as an option (in the base class) honour that option
72
+ if @requirements_update_strategy
73
+ return @requirements_update_strategy.to_sym
74
+ end
75
+
76
+ # Otherwise, widen ranges for libraries and bump versions for apps
77
+ library? ? :widen_ranges : :bump_versions
78
+ end
79
+
80
+ private
81
+
82
+ def latest_version_resolvable_with_full_unlock?
83
+ return unless latest_version
84
+
85
+ # No support for full unlocks for subdependencies yet
86
+ return false unless dependency.top_level?
87
+
88
+ version_resolver.latest_version_resolvable_with_full_unlock?
89
+ end
90
+
91
+ def updated_dependencies_after_full_unlock
92
+ version_resolver.dependency_updates_from_full_unlock.
93
+ map { |update_details| build_updated_dependency(update_details) }
94
+ end
95
+
96
+ def build_updated_dependency(update_details)
97
+ original_dep = update_details.fetch(:dependency)
98
+
99
+ Dependency.new(
100
+ name: original_dep.name,
101
+ version: update_details.fetch(:version).to_s,
102
+ requirements: RequirementsUpdater.new(
103
+ requirements: original_dep.requirements,
104
+ updated_source: original_dep == dependency ? updated_source : nil,
105
+ latest_version: update_details[:version].to_s,
106
+ latest_resolvable_version: update_details[:version].to_s,
107
+ update_strategy: requirements_update_strategy
108
+ ).updated_requirements,
109
+ previous_version: original_dep.version,
110
+ previous_requirements: original_dep.requirements,
111
+ package_manager: original_dep.package_manager
112
+ )
113
+ end
114
+
115
+ def latest_resolvable_version_with_no_unlock_for_git_dependency
116
+ reqs = dependency.requirements.map do |r|
117
+ next if r.fetch(:requirement).nil?
118
+
119
+ requirement_class.requirements_array(r.fetch(:requirement))
120
+ end.compact
121
+
122
+ return dependency.version if git_commit_checker.pinned?
123
+
124
+ # TODO: Really we should get a tag that satisfies the semver req
125
+ return dependency.version if reqs.any?
126
+
127
+ git_commit_checker.head_commit_for_current_branch
128
+ end
129
+
130
+ def latest_version_for_git_dependency
131
+ @latest_version_for_git_dependency ||=
132
+ begin
133
+ latest_release = latest_version_finder.
134
+ latest_version_details_from_registry
135
+
136
+ # If there's been a release that includes the current pinned ref
137
+ # or that the current branch is behind, we switch to that release.
138
+ if git_branch_or_ref_in_release?(latest_release&.fetch(:version))
139
+ latest_release.fetch(:version)
140
+ else
141
+ latest_git_version_details[:sha]
142
+ end
143
+ end
144
+ end
145
+
146
+ def should_switch_source_from_git_to_registry?
147
+ return false unless git_dependency?
148
+ return false if latest_version_for_git_dependency.nil?
149
+
150
+ version_class.correct?(latest_version_for_git_dependency)
151
+ end
152
+
153
+ def git_branch_or_ref_in_release?(release)
154
+ return false unless release
155
+
156
+ git_commit_checker.branch_or_ref_in_release?(release)
157
+ end
158
+
159
+ def latest_version_details
160
+ @latest_version_details ||=
161
+ if git_dependency? && !should_switch_source_from_git_to_registry?
162
+ latest_git_version_details
163
+ else
164
+ latest_version_finder.latest_version_details_from_registry
165
+ end
166
+ end
167
+
168
+ def latest_version_finder
169
+ @latest_version_finder ||=
170
+ LatestVersionFinder.new(
171
+ dependency: dependency,
172
+ credentials: credentials,
173
+ dependency_files: dependency_files,
174
+ ignored_versions: ignored_versions
175
+ )
176
+ end
177
+
178
+ def version_resolver
179
+ @version_resolver ||=
180
+ VersionResolver.new(
181
+ dependency: dependency,
182
+ credentials: credentials,
183
+ dependency_files: dependency_files,
184
+ latest_allowable_version: latest_version,
185
+ latest_version_finder: latest_version_finder
186
+ )
187
+ end
188
+
189
+ def subdependency_version_resolver
190
+ @subdependency_version_resolver ||=
191
+ SubdependencyVersionResolver.new(
192
+ dependency: dependency,
193
+ credentials: credentials,
194
+ dependency_files: dependency_files,
195
+ ignored_versions: ignored_versions
196
+ )
197
+ end
198
+
199
+ def git_dependency?
200
+ git_commit_checker.git_dependency?
201
+ end
202
+
203
+ def latest_git_version_details
204
+ semver_req =
205
+ dependency.requirements.
206
+ find { |req| req.dig(:source, :type) == "git" }&.
207
+ fetch(:requirement)
208
+
209
+ # If there was a semver requirement provided or the dependency was
210
+ # pinned to a version, look for the latest tag
211
+ if semver_req || git_commit_checker.pinned_ref_looks_like_version?
212
+ latest_tag = git_commit_checker.local_tag_for_latest_version
213
+ return {
214
+ sha: latest_tag&.fetch(:commit_sha),
215
+ version: latest_tag&.fetch(:tag)&.gsub(/^[^\d]*/, "")
216
+ }
217
+ end
218
+
219
+ # Otherwise, if the gem isn't pinned, the latest version is just the
220
+ # latest commit for the specified branch.
221
+ unless git_commit_checker.pinned?
222
+ return { sha: git_commit_checker.head_commit_for_current_branch }
223
+ end
224
+
225
+ # If the dependency is pinned to a tag that doesn't look like a
226
+ # version then there's nothing we can do.
227
+ { sha: dependency.version }
228
+ end
229
+
230
+ def updated_source
231
+ # Never need to update source, unless a git_dependency
232
+ return dependency_source_details unless git_dependency?
233
+
234
+ # Source becomes `nil` if switching to default rubygems
235
+ return nil if should_switch_source_from_git_to_registry?
236
+
237
+ # Update the git tag if updating a pinned version
238
+ if git_commit_checker.pinned_ref_looks_like_version? &&
239
+ !git_commit_checker.local_tag_for_latest_version.nil?
240
+ new_tag = git_commit_checker.local_tag_for_latest_version
241
+ return dependency_source_details.merge(ref: new_tag.fetch(:tag))
242
+ end
243
+
244
+ # Otherwise return the original source
245
+ dependency_source_details
246
+ end
247
+
248
+ def library?
249
+ return true unless dependency.version
250
+ return true if dependency_files.any? { |f| f.name == "lerna.json" }
251
+
252
+ @library =
253
+ LibraryDetector.new(package_json_file: package_json).library?
254
+ end
255
+
256
+ def dependency_source_details
257
+ sources =
258
+ dependency.requirements.map { |r| r.fetch(:source) }.uniq.compact
259
+
260
+ raise "Multiple sources! #{sources.join(', ')}" if sources.count > 1
261
+
262
+ sources.first
263
+ end
264
+
265
+ def package_json
266
+ @package_json ||=
267
+ dependency_files.find { |f| f.name == "package.json" }
268
+ end
269
+
270
+ def git_commit_checker
271
+ @git_commit_checker ||=
272
+ GitCommitChecker.new(
273
+ dependency: dependency,
274
+ credentials: credentials
275
+ )
276
+ end
277
+ end
278
+ end
279
+ end
280
+ end
@@ -0,0 +1,342 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "excon"
4
+ require "dependabot/update_checkers/java_script/npm_and_yarn"
5
+ require "dependabot/update_checkers/java_script/npm_and_yarn/registry_finder"
6
+ require "dependabot/utils/java_script/version"
7
+ require "dependabot/utils/java_script/requirement"
8
+ require "dependabot/shared_helpers"
9
+ require "dependabot/errors"
10
+
11
+ module Dependabot
12
+ module UpdateCheckers
13
+ module JavaScript
14
+ class NpmAndYarn
15
+ class LatestVersionFinder
16
+ class RegistryError < StandardError; end
17
+
18
+ def initialize(dependency:, credentials:, dependency_files:,
19
+ ignored_versions:)
20
+ @dependency = dependency
21
+ @credentials = credentials
22
+ @dependency_files = dependency_files
23
+ @ignored_versions = ignored_versions
24
+ end
25
+
26
+ def latest_version_details_from_registry
27
+ return nil unless npm_details&.fetch("dist-tags", nil)
28
+
29
+ dist_tag_version = version_from_dist_tags(npm_details)
30
+ return { version: dist_tag_version } if dist_tag_version
31
+ return nil if specified_dist_tag_requirement?
32
+
33
+ { version: version_from_versions_array }
34
+ rescue Excon::Error::Socket, Excon::Error::Timeout
35
+ raise if dependency_registry == "registry.npmjs.org"
36
+ # Custom registries can be flaky. We don't want to make that
37
+ # our problem, so we quietly return `nil` here.
38
+ end
39
+
40
+ def latest_resolvable_version_with_no_unlock
41
+ return unless npm_details
42
+
43
+ if specified_dist_tag_requirement?
44
+ return version_from_dist_tags(npm_details)
45
+ end
46
+
47
+ reqs = dependency.requirements.map do |r|
48
+ Utils::JavaScript::Requirement.
49
+ requirements_array(r.fetch(:requirement))
50
+ end.compact
51
+
52
+ possible_versions.
53
+ find do |version|
54
+ reqs.all? { |r| r.any? { |opt| opt.satisfied_by?(version) } } &&
55
+ !yanked?(version)
56
+ end
57
+ rescue Excon::Error::Socket, Excon::Error::Timeout
58
+ raise if dependency_registry == "registry.npmjs.org"
59
+ # Sometimes custom registries are flaky. We don't want to make that
60
+ # our problem, so we quietly return `nil` here.
61
+ end
62
+
63
+ def possible_versions
64
+ npm_details.fetch("versions", {}).
65
+ reject { |_, details| details["deprecated"] }.
66
+ keys.map { |v| version_class.new(v) }.
67
+ reject { |v| v.prerelease? && !related_to_current_pre?(v) }.
68
+ reject { |v| ignore_reqs.any? { |r| r.satisfied_by?(v) } }.
69
+ sort.reverse
70
+ end
71
+
72
+ def possible_versions_with_details
73
+ npm_details.fetch("versions", {}).
74
+ reject { |_, details| details["deprecated"] }.
75
+ transform_keys { |k| version_class.new(k) }.
76
+ reject { |k, _| k.prerelease? && !related_to_current_pre?(k) }.
77
+ reject { |k, _| ignore_reqs.any? { |r| r.satisfied_by?(k) } }.
78
+ sort_by(&:first).reverse
79
+ end
80
+
81
+ private
82
+
83
+ attr_reader :dependency, :credentials, :dependency_files,
84
+ :ignored_versions
85
+
86
+ def version_from_dist_tags(npm_details)
87
+ dist_tags = npm_details["dist-tags"].keys
88
+
89
+ # Check if a dist tag was specified as a requirement. If it was, and
90
+ # it exists, use it.
91
+ dist_tag_req = dependency.requirements.
92
+ find { |r| dist_tags.include?(r[:requirement]) }&.
93
+ fetch(:requirement)
94
+
95
+ if dist_tag_req
96
+ tag_vers =
97
+ version_class.new(npm_details["dist-tags"][dist_tag_req])
98
+ return tag_vers unless yanked?(tag_vers)
99
+ end
100
+
101
+ # Use the latest dist tag unless there's a reason not to
102
+ return nil unless npm_details["dist-tags"]["latest"]
103
+
104
+ latest = version_class.new(npm_details["dist-tags"]["latest"])
105
+
106
+ wants_latest_dist_tag?(latest) ? latest : nil
107
+ end
108
+
109
+ def related_to_current_pre?(version)
110
+ current_version = dependency.version
111
+ if current_version &&
112
+ version_class.correct?(current_version) &&
113
+ version_class.new(current_version).prerelease? &&
114
+ version_class.new(current_version).release == version.release
115
+ return true
116
+ end
117
+
118
+ dependency.requirements.any? do |req|
119
+ next unless req[:requirement]&.match?(/\d-[A-Za-z]/)
120
+
121
+ Utils::JavaScript::Requirement.
122
+ requirements_array(req.fetch(:requirement)).
123
+ any? do |r|
124
+ r.requirements.any? { |a| a.last.release == version.release }
125
+ end
126
+ rescue Gem::Requirement::BadRequirementError
127
+ false
128
+ end
129
+ end
130
+
131
+ def specified_dist_tag_requirement?
132
+ dependency.requirements.any? do |req|
133
+ next false if req[:requirement].nil?
134
+
135
+ req[:requirement].match?(/^[A-Za-z]/)
136
+ end
137
+ end
138
+
139
+ def wants_latest_dist_tag?(latest_version)
140
+ ver = latest_version
141
+ return false if related_to_current_pre?(ver) ^ ver.prerelease?
142
+ return false if current_version_greater_than?(ver)
143
+ return false if current_requirement_greater_than?(ver)
144
+ return false if ignore_reqs.any? { |r| r.satisfied_by?(ver) }
145
+ return false if yanked?(ver)
146
+
147
+ true
148
+ end
149
+
150
+ def current_version_greater_than?(version)
151
+ return false unless dependency.version
152
+ return false unless version_class.correct?(dependency.version)
153
+
154
+ version_class.new(dependency.version) > version
155
+ end
156
+
157
+ def current_requirement_greater_than?(version)
158
+ dependency.requirements.any? do |req|
159
+ next false unless req[:requirement]
160
+
161
+ req_version = req[:requirement].sub(/^\^|~|>=?/, "")
162
+ next false unless version_class.correct?(req_version)
163
+
164
+ version_class.new(req_version) > version
165
+ end
166
+ end
167
+
168
+ def version_from_versions_array
169
+ possible_versions.find { |version| !yanked?(version) }
170
+ end
171
+
172
+ def yanked?(version)
173
+ @yanked ||= {}
174
+ return @yanked[version] if @yanked.key?(version)
175
+
176
+ @yanked[version] =
177
+ begin
178
+ version_not_found =
179
+ Excon.get(
180
+ dependency_url + "/#{version}",
181
+ SharedHelpers.excon_defaults.merge(
182
+ headers: registry_auth_headers,
183
+ idempotent: true
184
+ )
185
+ ).status == 404
186
+ version_not_found && version_endpoint_working?
187
+ rescue Excon::Error::Timeout
188
+ # Give the benefit of the doubt if the registry is playing up
189
+ false
190
+ end
191
+ end
192
+
193
+ def version_endpoint_working?
194
+ return true if dependency_registry == "registry.npmjs.org"
195
+
196
+ if defined?(@version_endpoint_working)
197
+ return @version_endpoint_working
198
+ end
199
+
200
+ @version_endpoint_working =
201
+ begin
202
+ Excon.get(
203
+ dependency_url + "/latest",
204
+ SharedHelpers.excon_defaults.merge(
205
+ headers: registry_auth_headers,
206
+ idempotent: true
207
+ )
208
+ ).status < 400
209
+ rescue Excon::Error::Timeout
210
+ # Give the benefit of the doubt if the registry is playing up
211
+ true
212
+ end
213
+ end
214
+
215
+ def npm_details
216
+ return @npm_details if @npm_details_lookup_attempted
217
+
218
+ @npm_details_lookup_attempted = true
219
+ @npm_details ||=
220
+ begin
221
+ npm_response = fetch_npm_response
222
+
223
+ check_npm_response(npm_response)
224
+ JSON.parse(npm_response.body)
225
+ rescue JSON::ParserError, Excon::Error::Timeout,
226
+ RegistryError => error
227
+ retry_count ||= 0
228
+ retry_count += 1
229
+ raise_npm_details_error(error) if retry_count > 2
230
+ sleep(rand(3.0..10.0)) && retry
231
+ end
232
+ end
233
+
234
+ def fetch_npm_response
235
+ response = Excon.get(
236
+ dependency_url,
237
+ SharedHelpers.excon_defaults.merge(
238
+ headers: registry_auth_headers,
239
+ idempotent: true
240
+ )
241
+ )
242
+
243
+ return response unless response.status == 500
244
+ return response unless registry_auth_headers["Authorization"]
245
+
246
+ auth = registry_auth_headers["Authorization"]
247
+ return response unless auth.start_with?("Basic")
248
+
249
+ decoded_token = Base64.decode64(auth.gsub("Basic ", ""))
250
+ return unless decoded_token.include?(":")
251
+
252
+ username, password = decoded_token.split(":")
253
+ Excon.get(
254
+ dependency_url,
255
+ SharedHelpers.excon_defaults.merge(
256
+ user: username,
257
+ password: password,
258
+ idempotent: true
259
+ )
260
+ )
261
+ end
262
+
263
+ def check_npm_response(npm_response)
264
+ return if git_dependency?
265
+
266
+ if private_dependency_not_reachable?(npm_response)
267
+ raise PrivateSourceAuthenticationFailure, dependency_registry
268
+ end
269
+
270
+ status = npm_response.status
271
+ return if status.to_s.start_with?("2")
272
+
273
+ # Ignore 404s from the registry for updates where a lockfile doesn't
274
+ # need to be generated. The 404 won't cause problems later.
275
+ return if status == 404 && dependency.version.nil?
276
+
277
+ msg = "Got #{status} response with body #{npm_response.body}"
278
+ raise RegistryError, msg
279
+ end
280
+
281
+ def raise_npm_details_error(error)
282
+ raise if dependency_registry == "registry.npmjs.org"
283
+ raise unless error.is_a?(Excon::Error::Timeout)
284
+
285
+ raise PrivateSourceTimedOut, dependency_registry
286
+ end
287
+
288
+ def private_dependency_not_reachable?(npm_response)
289
+ # Check whether this dependency is (likely to be) private
290
+ if dependency_registry == "registry.npmjs.org" &&
291
+ !dependency.name.start_with?("@")
292
+ return false
293
+ end
294
+
295
+ [401, 402, 403, 404].include?(npm_response.status)
296
+ end
297
+
298
+ def dependency_url
299
+ registry_finder.dependency_url
300
+ end
301
+
302
+ def dependency_registry
303
+ registry_finder.registry
304
+ end
305
+
306
+ def registry_auth_headers
307
+ registry_finder.auth_headers
308
+ end
309
+
310
+ def registry_finder
311
+ @registry_finder ||=
312
+ RegistryFinder.new(
313
+ dependency: dependency,
314
+ credentials: credentials,
315
+ npmrc_file: dependency_files.
316
+ find { |f| f.name.end_with?(".npmrc") },
317
+ yarnrc_file: dependency_files.
318
+ find { |f| f.name.end_with?(".yarnrc") }
319
+ )
320
+ end
321
+
322
+ def ignore_reqs
323
+ ignored_versions.
324
+ map { |req| Utils::JavaScript::Requirement.new(req.split(",")) }
325
+ end
326
+
327
+ def version_class
328
+ Utils::JavaScript::Version
329
+ end
330
+
331
+ # TODO: Remove need for me
332
+ def git_dependency?
333
+ GitCommitChecker.new(
334
+ dependency: dependency,
335
+ credentials: credentials
336
+ ).git_dependency?
337
+ end
338
+ end
339
+ end
340
+ end
341
+ end
342
+ end