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,126 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "excon"
4
+ require "dependabot/update_checkers/base"
5
+ require "dependabot/shared_helpers"
6
+ require "dependabot/errors"
7
+
8
+ module Dependabot
9
+ module UpdateCheckers
10
+ module Elm
11
+ class ElmPackage < Dependabot::UpdateCheckers::Base
12
+ require_relative "elm_package/requirements_updater"
13
+ require_relative "elm_package/elm_18_version_resolver"
14
+ require_relative "elm_package/elm_19_version_resolver"
15
+
16
+ def latest_version
17
+ @latest_version ||= candidate_versions.max
18
+ end
19
+
20
+ # Overwrite the base class to allow multi-dependency update PRs for
21
+ # dependencies for which we don't have a version.
22
+ def can_update?(requirements_to_unlock:)
23
+ if dependency.appears_in_lockfile?
24
+ version_can_update?(requirements_to_unlock: requirements_to_unlock)
25
+ elsif requirements_to_unlock == :none
26
+ false
27
+ elsif requirements_to_unlock == :own
28
+ requirements_can_update?
29
+ elsif requirements_to_unlock == :all
30
+ updated_dependencies_after_full_unlock.any?
31
+ end
32
+ end
33
+
34
+ def latest_resolvable_version
35
+ @latest_resolvable_version ||=
36
+ version_resolver.
37
+ latest_resolvable_version(unlock_requirement: :own)
38
+ end
39
+
40
+ def latest_resolvable_version_with_no_unlock
41
+ # Irrelevant, since Elm has a single dependency file (well, there's
42
+ # also `exact-dependencies.json`, but it's not recommended that that
43
+ # is committed).
44
+ nil
45
+ end
46
+
47
+ def updated_requirements
48
+ RequirementsUpdater.new(
49
+ requirements: dependency.requirements,
50
+ latest_resolvable_version: latest_resolvable_version
51
+ ).updated_requirements
52
+ end
53
+
54
+ private
55
+
56
+ def version_resolver
57
+ @version_resolver ||=
58
+ if dependency.requirements.any? { |r| r.fetch(:file) == "elm.json" }
59
+ Elm19VersionResolver.new(
60
+ dependency: dependency,
61
+ dependency_files: dependency_files
62
+ )
63
+ else
64
+ Elm18VersionResolver.new(
65
+ dependency: dependency,
66
+ dependency_files: dependency_files,
67
+ candidate_versions: candidate_versions
68
+ )
69
+ end
70
+ end
71
+
72
+ def updated_dependencies_after_full_unlock
73
+ version_resolver.updated_dependencies_after_full_unlock
74
+ end
75
+
76
+ def latest_version_resolvable_with_full_unlock?
77
+ latest_version == version_resolver.
78
+ latest_resolvable_version(unlock_requirement: :all)
79
+ end
80
+
81
+ def candidate_versions
82
+ all_versions.
83
+ reject { |v| ignore_reqs.any? { |r| r.satisfied_by?(v) } }
84
+ end
85
+
86
+ def all_versions
87
+ return @all_versions if @version_lookup_attempted
88
+
89
+ @version_lookup_attempted = true
90
+
91
+ response = Excon.get(
92
+ "https://package.elm-lang.org/packages/#{dependency.name}/"\
93
+ "releases.json",
94
+ idempotent: true,
95
+ **Dependabot::SharedHelpers.excon_defaults
96
+ )
97
+
98
+ return @all_versions = [] unless response.status == 200
99
+
100
+ @all_versions =
101
+ JSON.parse(response.body).
102
+ keys.
103
+ map { |v| version_class.new(v) }.
104
+ sort
105
+ end
106
+
107
+ # Overwrite the base class's requirements_up_to_date? method to instead
108
+ # check whether the latest version is allowed
109
+ def requirements_up_to_date?
110
+ return false unless latest_version
111
+
112
+ dependency.requirements.
113
+ map { |r| r.fetch(:requirement) }.
114
+ map { |r| requirement_class.new(r) }.
115
+ all? { |r| r.satisfied_by?(latest_version) }
116
+ end
117
+
118
+ def ignore_reqs
119
+ # Note: we use Gem::Requirement here because ignore conditions will
120
+ # be passed as Ruby ranges
121
+ ignored_versions.map { |req| Gem::Requirement.new(req.split(",")) }
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/utils/elm/version"
4
+ require "dependabot/update_checkers/elm/elm_package"
5
+
6
+ module Dependabot
7
+ module UpdateCheckers
8
+ module Elm
9
+ class ElmPackage
10
+ class CliParser
11
+ INSTALL_DEPENDENCY_REGEX =
12
+ %r{([^\s]+\/[^\s]+)\s+(\d+\.\d+\.\d+)}.freeze
13
+ UPGRADE_DEPENDENCY_REGEX =
14
+ %r{([^\s]+\/[^\s]+) \(\d+\.\d+\.\d+ => (\d+\.\d+\.\d+)\)}.freeze
15
+
16
+ def self.decode_install_preview(text)
17
+ installs = {}
18
+
19
+ # Parse new installs
20
+ text.scan(INSTALL_DEPENDENCY_REGEX).
21
+ each { |n, v| installs[n] = Utils::Elm::Version.new(v) }
22
+
23
+ # Parse upgrades
24
+ text.scan(UPGRADE_DEPENDENCY_REGEX).
25
+ each { |n, v| installs[n] = Utils::Elm::Version.new(v) }
26
+
27
+ installs
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,234 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/shared_helpers"
4
+ require "dependabot/errors"
5
+ require "dependabot/file_parsers/elm/elm_package"
6
+ require "dependabot/update_checkers/elm/elm_package"
7
+ require "dependabot/update_checkers/elm/elm_package/cli_parser"
8
+ require "dependabot/update_checkers/elm/elm_package/requirements_updater"
9
+ require "dependabot/utils/elm/requirement"
10
+
11
+ module Dependabot
12
+ module UpdateCheckers
13
+ module Elm
14
+ class ElmPackage
15
+ class Elm18VersionResolver
16
+ class UnrecoverableState < StandardError; end
17
+
18
+ def initialize(dependency:, dependency_files:, candidate_versions:)
19
+ @dependency = dependency
20
+ @dependency_files = dependency_files
21
+ @candidate_versions = candidate_versions
22
+ end
23
+
24
+ def latest_resolvable_version(unlock_requirement:)
25
+ unless %i(none own all).include?(unlock_requirement)
26
+ raise "Invalid unlock setting: #{unlock_requirement}"
27
+ end
28
+
29
+ # Elm has no lockfile, so we will never create an update PR if
30
+ # unlock requirements are `none`. Just return the current version.
31
+ return current_version if unlock_requirement == :none
32
+
33
+ # Otherwise, we gotta check a few conditions to see if bumping
34
+ # wouldn't also bump other deps in elm-package.json
35
+ candidate_versions.sort.reverse_each do |version|
36
+ return version if can_update?(version, unlock_requirement)
37
+ end
38
+
39
+ # Fall back to returning the dependency's current version, which is
40
+ # presumed to be resolvable
41
+ current_version
42
+ end
43
+
44
+ def updated_dependencies_after_full_unlock
45
+ version = latest_resolvable_version(unlock_requirement: :all)
46
+ deps_after_install = fetch_install_metadata(target_version: version)
47
+
48
+ original_dependency_details.map do |original_dep|
49
+ new_version = deps_after_install.fetch(original_dep.name)
50
+
51
+ old_reqs = original_dep.requirements.map do |req|
52
+ requirement_class.new(req[:requirement])
53
+ end
54
+
55
+ next if old_reqs.all? { |req| req.satisfied_by?(new_version) }
56
+
57
+ new_requirements =
58
+ RequirementsUpdater.new(
59
+ requirements: original_dep.requirements,
60
+ latest_resolvable_version: new_version.to_s
61
+ ).updated_requirements
62
+
63
+ Dependency.new(
64
+ name: original_dep.name,
65
+ version: new_version.to_s,
66
+ requirements: new_requirements,
67
+ previous_version: original_dep.version,
68
+ previous_requirements: original_dep.requirements,
69
+ package_manager: original_dep.package_manager
70
+ )
71
+ end.compact
72
+ end
73
+
74
+ private
75
+
76
+ attr_reader :dependency, :dependency_files, :candidate_versions
77
+
78
+ def can_update?(version, unlock_requirement)
79
+ deps_after_install = fetch_install_metadata(target_version: version)
80
+
81
+ result = check_install_result(deps_after_install, version)
82
+
83
+ # If the install was clean then we can definitely update
84
+ return true if result == :clean_bump
85
+
86
+ # Otherwise, we can still update if the result was a forced full
87
+ # unlock and we're allowed to unlock other requirements
88
+ return false unless unlock_requirement == :all
89
+
90
+ result == :forced_full_unlock_bump
91
+ end
92
+
93
+ def check_install_result(deps_after_install, target_version)
94
+ # This can go one of 5 ways:
95
+ # 1) We bump our dep and no other dep is bumped
96
+ # 2) We bump our dep and another dep is bumped too
97
+ # Scenario: NoRedInk/datetimepicker bump to 3.0.2 also
98
+ # bumps elm-css to 14
99
+ # 3) We bump our dep but actually elm-package doesn't bump it
100
+ # Scenario: elm-css bump to 14 but datetimepicker is at 3.0.1
101
+ # 4) We bump our dep but elm-package just says
102
+ # "Packages configured successfully!"
103
+ # Narrator: they weren't
104
+ # Scenario: impossible dependency (i.e. elm-css 999.999.999)
105
+ # a <= v < b where a is greater than latest version
106
+ # 5) We bump our dep but elm-package blows up (not handled here)
107
+ # Scenario: rtfeldman/elm-css 14 && rtfeldman/hashed-class 1.0.0
108
+ # I'm not sure what's different from this scenario
109
+ # to 3), why it blows up instead of just rolling
110
+ # elm-css back to version 9 which is what
111
+ # hashed-class requires
112
+
113
+ # 4) We bump our dep but elm-package just says
114
+ # "Packages configured successfully!"
115
+ return :empty_elm_stuff_bug if deps_after_install.empty?
116
+
117
+ version_after_install = deps_after_install.fetch(dependency.name)
118
+
119
+ # 3) We bump our dep but actually elm-package doesn't bump it
120
+ return :downgrade_bug if version_after_install < target_version
121
+
122
+ other_top_level_deps_bumped =
123
+ original_dependency_details.
124
+ reject { |dep| dep.name == dependency.name }.
125
+ select do |dep|
126
+ reqs = dep.requirements.map { |r| r.fetch(:requirement) }
127
+ reqs = reqs.map { |r| requirement_class.new(r) }
128
+ reqs.any? { |r| !r.satisfied_by?(deps_after_install[dep.name]) }
129
+ end
130
+
131
+ # 2) We bump our dep and another dep is bumped
132
+ return :forced_full_unlock_bump if other_top_level_deps_bumped.any?
133
+
134
+ # 1) We bump our dep and no other dep is bumped
135
+ :clean_bump
136
+ end
137
+
138
+ def fetch_install_metadata(target_version:)
139
+ @install_cache ||= {}
140
+ @install_cache[target_version.to_s] ||=
141
+ SharedHelpers.in_a_temporary_directory do
142
+ write_temporary_dependency_files(target_version: target_version)
143
+
144
+ # Elm package install outputs a preview of the actions to be
145
+ # performed. We can use this preview to calculate whether it
146
+ # would do anything funny
147
+ command = "yes n | elm-package install"
148
+ response = run_shell_command(command)
149
+
150
+ deps_after_install = CliParser.decode_install_preview(response)
151
+
152
+ deps_after_install
153
+ rescue SharedHelpers::HelperSubprocessFailed => error
154
+ # 5) We bump our dep but elm-package blows up
155
+ handle_elm_package_errors(error)
156
+ end
157
+ end
158
+
159
+ def run_shell_command(command)
160
+ raw_response = nil
161
+ IO.popen(command, err: %i(child out)) do |process|
162
+ raw_response = process.read
163
+ end
164
+
165
+ # Raise an error with the output from the shell session if Elm
166
+ # returns a non-zero status
167
+ return raw_response if $CHILD_STATUS.success?
168
+
169
+ raise SharedHelpers::HelperSubprocessFailed.new(
170
+ raw_response,
171
+ command
172
+ )
173
+ end
174
+
175
+ def handle_elm_package_errors(error)
176
+ if error.message.include?("I cannot find a set of packages that " \
177
+ "works with your constraints")
178
+ raise Dependabot::DependencyFileNotResolvable, error.message
179
+ end
180
+
181
+ # I don't know any other errors
182
+ raise error
183
+ end
184
+
185
+ def write_temporary_dependency_files(target_version:)
186
+ dependency_files.each do |file|
187
+ path = file.name
188
+ FileUtils.mkdir_p(Pathname.new(path).dirname)
189
+
190
+ File.write(
191
+ path,
192
+ updated_elm_package_content(file.content, target_version)
193
+ )
194
+ end
195
+ end
196
+
197
+ def updated_elm_package_content(content, version)
198
+ json = JSON.parse(content)
199
+
200
+ new_requirement = RequirementsUpdater.new(
201
+ requirements: dependency.requirements,
202
+ latest_resolvable_version: version.to_s
203
+ ).updated_requirements.first[:requirement]
204
+
205
+ json["dependencies"][dependency.name] = new_requirement
206
+ JSON.dump(json)
207
+ end
208
+
209
+ def original_dependency_details
210
+ @original_dependency_details ||=
211
+ FileParsers::Elm::ElmPackage.new(
212
+ dependency_files: dependency_files,
213
+ source: nil
214
+ ).parse
215
+ end
216
+
217
+ def current_version
218
+ return unless dependency.version
219
+
220
+ version_class.new(dependency.version)
221
+ end
222
+
223
+ def version_class
224
+ Utils::Elm::Version
225
+ end
226
+
227
+ def requirement_class
228
+ Utils::Elm::Requirement
229
+ end
230
+ end
231
+ end
232
+ end
233
+ end
234
+ end
@@ -0,0 +1,198 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/shared_helpers"
4
+ require "dependabot/errors"
5
+ require "dependabot/file_parsers/elm/elm_package"
6
+ require "dependabot/update_checkers/elm/elm_package"
7
+ require "dependabot/update_checkers/elm/elm_package/cli_parser"
8
+ require "dependabot/update_checkers/elm/elm_package/requirements_updater"
9
+ require "dependabot/utils/elm/requirement"
10
+
11
+ module Dependabot
12
+ module UpdateCheckers
13
+ module Elm
14
+ class ElmPackage
15
+ class Elm19VersionResolver
16
+ class UnrecoverableState < StandardError; end
17
+
18
+ def initialize(dependency:, dependency_files:)
19
+ @dependency = dependency
20
+ @dependency_files = dependency_files
21
+ end
22
+
23
+ def latest_resolvable_version(unlock_requirement:)
24
+ unless %i(none own all).include?(unlock_requirement)
25
+ raise "Invalid unlock setting: #{unlock_requirement}"
26
+ end
27
+
28
+ # Elm has no lockfile, so we will never create an update PR if
29
+ # unlock requirements are `none`. Just return the current version.
30
+ return current_version if unlock_requirement == :none
31
+
32
+ # Otherwise, we gotta check a few conditions to see if bumping
33
+ # wouldn't also bump other deps in elm-package.json
34
+ fetch_latest_resolvable_version(unlock_requirement)
35
+ end
36
+
37
+ def updated_dependencies_after_full_unlock
38
+ changed_deps = install_metadata
39
+
40
+ original_dependency_details.map do |original_dep|
41
+ new_version = changed_deps.fetch(original_dep.name, nil)
42
+ next unless new_version
43
+
44
+ old_reqs = original_dep.requirements.map do |req|
45
+ requirement_class.new(req[:requirement])
46
+ end
47
+
48
+ next if old_reqs.all? { |req| req.satisfied_by?(new_version) }
49
+
50
+ new_requirements =
51
+ RequirementsUpdater.new(
52
+ requirements: original_dep.requirements,
53
+ latest_resolvable_version: new_version.to_s
54
+ ).updated_requirements
55
+
56
+ Dependency.new(
57
+ name: original_dep.name,
58
+ version: new_version.to_s,
59
+ requirements: new_requirements,
60
+ previous_version: original_dep.version,
61
+ previous_requirements: original_dep.requirements,
62
+ package_manager: original_dep.package_manager
63
+ )
64
+ end.compact
65
+ end
66
+
67
+ private
68
+
69
+ attr_reader :dependency, :dependency_files
70
+
71
+ def fetch_latest_resolvable_version(unlock_requirement)
72
+ changed_deps = install_metadata
73
+
74
+ result = check_install_result(changed_deps)
75
+ version_after_install = changed_deps.fetch(dependency.name)
76
+
77
+ # If the install was clean then we can definitely update
78
+ return version_after_install if result == :clean_bump
79
+
80
+ # Otherwise, we can still update if the result was a forced full
81
+ # unlock and we're allowed to unlock other requirements
82
+ return version_after_install if unlock_requirement == :all
83
+
84
+ current_version
85
+ end
86
+
87
+ def check_install_result(changed_deps)
88
+ other_deps_bumped =
89
+ changed_deps.
90
+ keys.
91
+ reject { |name| name == dependency.name }
92
+
93
+ return :forced_full_unlock_bump if other_deps_bumped.any?
94
+
95
+ :clean_bump
96
+ end
97
+
98
+ def install_metadata
99
+ @install_metadata ||=
100
+ SharedHelpers.in_a_temporary_directory do
101
+ write_temporary_dependency_files
102
+
103
+ # Elm package install outputs a preview of the actions to be
104
+ # performed. We can use this preview to calculate whether it
105
+ # would do anything funny
106
+ command = "yes n | elm19 install #{dependency.name}"
107
+ response = run_shell_command(command)
108
+
109
+ CliParser.decode_install_preview(response)
110
+ rescue SharedHelpers::HelperSubprocessFailed => error
111
+ # 5) We bump our dep but elm blows up
112
+ handle_elm_errors(error)
113
+ end
114
+ end
115
+
116
+ def run_shell_command(command)
117
+ raw_response = nil
118
+ IO.popen(command, err: %i(child out)) do |process|
119
+ raw_response = process.read
120
+ end
121
+
122
+ # Raise an error with the output from the shell session if Elm
123
+ # returns a non-zero status
124
+ return raw_response if $CHILD_STATUS.success?
125
+
126
+ raise SharedHelpers::HelperSubprocessFailed.new(
127
+ raw_response,
128
+ command
129
+ )
130
+ end
131
+
132
+ def handle_elm_errors(error)
133
+ if error.message.include?("OLD DEPENDENCIES") ||
134
+ error.message.include?("BAD JSON")
135
+ raise Dependabot::DependencyFileNotResolvable, error.message
136
+ end
137
+
138
+ # Raise any unrecognised errors
139
+ raise error
140
+ end
141
+
142
+ def write_temporary_dependency_files
143
+ dependency_files.each do |file|
144
+ path = file.name
145
+ FileUtils.mkdir_p(Pathname.new(path).dirname)
146
+
147
+ File.write(path, updated_elm_json_content(file.content))
148
+ end
149
+ end
150
+
151
+ def updated_elm_json_content(content)
152
+ json = JSON.parse(content)
153
+
154
+ # Delete the dependency from the elm.json, so that we can use
155
+ # `elm install <dependency_name>` to generate the install plan
156
+ %w(dependencies test-dependencies).each do |type|
157
+ if json.dig(type, dependency.name)
158
+ json[type].delete(dependency.name)
159
+ end
160
+
161
+ %w(direct indirect).each do |category|
162
+ if json.dig(type, category, dependency.name)
163
+ json[type][category].delete(dependency.name)
164
+ end
165
+ end
166
+ end
167
+
168
+ json["source-directories"] = []
169
+
170
+ JSON.dump(json)
171
+ end
172
+
173
+ def original_dependency_details
174
+ @original_dependency_details ||=
175
+ FileParsers::Elm::ElmPackage.new(
176
+ dependency_files: dependency_files,
177
+ source: nil
178
+ ).parse
179
+ end
180
+
181
+ def current_version
182
+ return unless dependency.version
183
+
184
+ version_class.new(dependency.version)
185
+ end
186
+
187
+ def version_class
188
+ Utils::Elm::Version
189
+ end
190
+
191
+ def requirement_class
192
+ Utils::Elm::Requirement
193
+ end
194
+ end
195
+ end
196
+ end
197
+ end
198
+ end