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,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/dependency_file"
4
+ require "dependabot/file_parsers/ruby/bundler"
5
+ require "dependabot/file_updaters/ruby/bundler/gemspec_sanitizer"
6
+
7
+ module Dependabot
8
+ module FileParsers
9
+ module Ruby
10
+ class Bundler
11
+ class FilePreparer
12
+ def initialize(dependency_files:)
13
+ @dependency_files = dependency_files
14
+ end
15
+
16
+ def prepared_dependency_files
17
+ files = []
18
+
19
+ gemspecs.compact.each do |file|
20
+ files << DependencyFile.new(
21
+ name: file.name,
22
+ content: sanitize_gemspec_content(file.content),
23
+ directory: file.directory
24
+ )
25
+ end
26
+
27
+ files += [
28
+ gemfile,
29
+ *evaled_gemfiles,
30
+ lockfile,
31
+ ruby_version_file,
32
+ *imported_ruby_files
33
+ ].compact
34
+ end
35
+
36
+ private
37
+
38
+ attr_reader :dependency_files
39
+
40
+ def gemfile
41
+ dependency_files.find { |f| f.name == "Gemfile" } ||
42
+ dependency_files.find { |f| f.name == "gems.rb" }
43
+ end
44
+
45
+ def evaled_gemfiles
46
+ dependency_files.
47
+ reject { |f| f.name.end_with?(".gemspec") }.
48
+ reject { |f| f.name.end_with?(".lock") }.
49
+ reject { |f| f.name.end_with?(".ruby-version") }.
50
+ reject { |f| f.name == "Gemfile" }.
51
+ reject { |f| f.name == "gems.rb" }.
52
+ reject { |f| f.name == "gems.locked" }
53
+ end
54
+
55
+ def lockfile
56
+ dependency_files.find { |f| f.name == "Gemfile.lock" } ||
57
+ dependency_files.find { |f| f.name == "gems.locked" }
58
+ end
59
+
60
+ def gemspecs
61
+ dependency_files.select { |f| f.name.end_with?(".gemspec") }
62
+ end
63
+
64
+ def ruby_version_file
65
+ dependency_files.find { |f| f.name == ".ruby-version" }
66
+ end
67
+
68
+ def imported_ruby_files
69
+ dependency_files.
70
+ select { |f| f.name.end_with?(".rb") }.
71
+ reject { |f| f.name == "gems.rb" }
72
+ end
73
+
74
+ def sanitize_gemspec_content(gemspec_content)
75
+ # No need to set the version correctly - this is just an update
76
+ # check so we're not going to persist any changes to the lockfile.
77
+ FileUpdaters::Ruby::Bundler::GemspecSanitizer.
78
+ new(replacement_version: "0.0.1").
79
+ rewrite(gemspec_content)
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "parser/current"
4
+ require "dependabot/file_parsers/ruby/bundler"
5
+
6
+ module Dependabot
7
+ module FileParsers
8
+ module Ruby
9
+ class Bundler
10
+ # Checks whether a dependency is declared in a Gemfile
11
+ class GemfileChecker
12
+ def initialize(dependency:, gemfile:)
13
+ @dependency = dependency
14
+ @gemfile = gemfile
15
+ end
16
+
17
+ def includes_dependency?
18
+ return false unless Parser::CurrentRuby.parse(gemfile.content)
19
+
20
+ Parser::CurrentRuby.parse(gemfile.content).children.any? do |node|
21
+ deep_check_for_gem(node)
22
+ end
23
+ end
24
+
25
+ private
26
+
27
+ attr_reader :dependency, :gemfile
28
+
29
+ def deep_check_for_gem(node)
30
+ return true if declares_targeted_gem?(node)
31
+ return false unless node.is_a?(Parser::AST::Node)
32
+
33
+ node.children.any? do |child_node|
34
+ deep_check_for_gem(child_node)
35
+ end
36
+ end
37
+
38
+ def declares_targeted_gem?(node)
39
+ return false unless node.is_a?(Parser::AST::Node)
40
+ return false unless node.children[1] == :gem
41
+
42
+ node.children[2].children.first == dependency.name
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,213 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "toml-rb"
4
+
5
+ require "dependabot/dependency"
6
+ require "dependabot/file_parsers/base"
7
+ require "dependabot/utils/rust/requirement"
8
+ require "dependabot/utils/rust/version"
9
+ require "dependabot/errors"
10
+
11
+ # Relevant Cargo docs can be found at:
12
+ # - https://doc.rust-lang.org/cargo/reference/manifest.html
13
+ # - https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html
14
+ module Dependabot
15
+ module FileParsers
16
+ module Rust
17
+ class Cargo < Dependabot::FileParsers::Base
18
+ require "dependabot/file_parsers/base/dependency_set"
19
+
20
+ DEPENDENCY_TYPES =
21
+ %w(dependencies dev-dependencies build-dependencies).freeze
22
+
23
+ def parse
24
+ check_rust_workspace_root
25
+
26
+ dependency_set = DependencySet.new
27
+ dependency_set += manifest_dependencies
28
+ dependency_set += lockfile_dependencies if lockfile
29
+
30
+ dependencies = dependency_set.dependencies
31
+
32
+ # TODO: Handle patched dependencies
33
+ dependencies.reject! { |d| patched_dependencies.include?(d.name) }
34
+
35
+ # TODO: Currently, Dependabot can't handle dependencies that have
36
+ # multiple source types. Fix that!
37
+ dependencies.reject do |dep|
38
+ dep.requirements.map { |r| r.dig(:source, :type) }.uniq.count > 1
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def check_rust_workspace_root
45
+ cargo_toml = dependency_files.find { |f| f.name == "Cargo.toml" }
46
+ workspace_root = parsed_file(cargo_toml).dig("package", "workspace")
47
+ return unless workspace_root
48
+
49
+ msg = "This project is part of a Rust workspace but is not the "\
50
+ "workspace root."\
51
+
52
+ if cargo_toml.directory != "/"
53
+ msg += "Please update your settings so Dependabot points at the "\
54
+ "workspace root instead of #{cargo_toml.directory}."
55
+ end
56
+ raise Dependabot::DependencyFileNotEvaluatable, msg
57
+ end
58
+
59
+ def manifest_dependencies
60
+ dependency_set = DependencySet.new
61
+
62
+ DEPENDENCY_TYPES.each do |type|
63
+ manifest_files.each do |file|
64
+ parsed_file(file).fetch(type, {}).each do |name, requirement|
65
+ next if lockfile && !version_from_lockfile(name, requirement)
66
+
67
+ dependency_set << Dependency.new(
68
+ name: name,
69
+ version: version_from_lockfile(name, requirement),
70
+ package_manager: "cargo",
71
+ requirements: [{
72
+ requirement: requirement_from_declaration(requirement),
73
+ file: file.name,
74
+ groups: [type],
75
+ source: source_from_declaration(requirement)
76
+ }]
77
+ )
78
+ end
79
+ end
80
+ end
81
+
82
+ dependency_set
83
+ end
84
+
85
+ def lockfile_dependencies
86
+ dependency_set = DependencySet.new
87
+ return dependency_set unless lockfile
88
+
89
+ parsed_file(lockfile).fetch("package", []).each do |package_details|
90
+ next unless package_details["source"]
91
+
92
+ # TODO: This isn't quite right, as it will only give us one
93
+ # version of each dependency (when in fact there are many)
94
+ dependency_set << Dependency.new(
95
+ name: package_details["name"],
96
+ version: version_from_lockfile_details(package_details),
97
+ package_manager: "cargo",
98
+ requirements: []
99
+ )
100
+ end
101
+
102
+ dependency_set
103
+ end
104
+
105
+ def patched_dependencies
106
+ root_manifest = manifest_files.find { |f| f.name == "Cargo.toml" }
107
+ return [] unless parsed_file(root_manifest)["patch"]
108
+
109
+ parsed_file(root_manifest)["patch"].values.flat_map(&:keys)
110
+ end
111
+
112
+ def requirement_from_declaration(declaration)
113
+ if declaration.is_a?(String)
114
+ return declaration == "" ? nil : declaration
115
+ end
116
+ unless declaration.is_a?(Hash)
117
+ raise "Unexpected dependency declaration: #{declaration}"
118
+ end
119
+ return declaration["version"] if declaration["version"]
120
+
121
+ nil
122
+ end
123
+
124
+ def source_from_declaration(declaration)
125
+ return if declaration.is_a?(String)
126
+ unless declaration.is_a?(Hash)
127
+ raise "Unexpected dependency declaration: #{declaration}"
128
+ end
129
+
130
+ return git_source_details(declaration) if declaration["git"]
131
+ return { type: "path" } if declaration["path"]
132
+ end
133
+
134
+ def version_from_lockfile(name, declaration)
135
+ return unless lockfile
136
+
137
+ candidate_packages =
138
+ parsed_file(lockfile).fetch("package", []).
139
+ select { |p| p["name"] == name }
140
+
141
+ if (req = requirement_from_declaration(declaration))
142
+ req = Utils::Rust::Requirement.new(req)
143
+
144
+ candidate_packages =
145
+ candidate_packages.
146
+ select { |p| req.satisfied_by?(version_class.new(p["version"])) }
147
+ end
148
+
149
+ candidate_packages =
150
+ candidate_packages.
151
+ select do |p|
152
+ git_req?(declaration) ^ !p["source"]&.start_with?("git+")
153
+ end
154
+
155
+ package =
156
+ candidate_packages.
157
+ max_by { |p| version_class.new(p["version"]) }
158
+
159
+ return unless package
160
+
161
+ version_from_lockfile_details(package)
162
+ end
163
+
164
+ def git_req?(declaration)
165
+ source_from_declaration(declaration)&.fetch(:type, nil) == "git"
166
+ end
167
+
168
+ def git_source_details(declaration)
169
+ {
170
+ type: "git",
171
+ url: declaration["git"],
172
+ branch: declaration["branch"],
173
+ ref: declaration["tag"] || declaration["rev"]
174
+ }
175
+ end
176
+
177
+ def version_from_lockfile_details(package_details)
178
+ unless package_details["source"]&.start_with?("git+")
179
+ return package_details["version"]
180
+ end
181
+
182
+ package_details["source"].split("#").last
183
+ end
184
+
185
+ def check_required_files
186
+ raise "No Cargo.toml!" unless get_original_file("Cargo.toml")
187
+ end
188
+
189
+ def parsed_file(file)
190
+ @parsed_file ||= {}
191
+ @parsed_file[file.name] ||= TomlRB.parse(file.content)
192
+ rescue TomlRB::ParseError
193
+ raise Dependabot::DependencyFileNotParseable, file.path
194
+ end
195
+
196
+ def manifest_files
197
+ @manifest_files ||=
198
+ dependency_files.
199
+ select { |f| f.name.end_with?("Cargo.toml") }.
200
+ reject { |f| f.type == "path_dependency" }
201
+ end
202
+
203
+ def lockfile
204
+ @lockfile ||= get_original_file("Cargo.lock")
205
+ end
206
+
207
+ def version_class
208
+ Utils::Rust::Version
209
+ end
210
+ end
211
+ end
212
+ end
213
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "dependabot/file_updaters/ruby/bundler"
4
+ require "dependabot/file_updaters/python/pip"
5
+ require "dependabot/file_updaters/java_script/npm_and_yarn"
6
+ require "dependabot/file_updaters/java/maven"
7
+ require "dependabot/file_updaters/java/gradle"
8
+ require "dependabot/file_updaters/php/composer"
9
+ require "dependabot/file_updaters/git/submodules"
10
+ require "dependabot/file_updaters/docker/docker"
11
+ require "dependabot/file_updaters/elixir/hex"
12
+ require "dependabot/file_updaters/rust/cargo"
13
+ require "dependabot/file_updaters/dotnet/nuget"
14
+ require "dependabot/file_updaters/go/dep"
15
+ require "dependabot/file_updaters/go/modules"
16
+ require "dependabot/file_updaters/elm/elm_package"
17
+
18
+ module Dependabot
19
+ module FileUpdaters
20
+ @file_updaters = {
21
+ "bundler" => FileUpdaters::Ruby::Bundler,
22
+ "npm_and_yarn" => FileUpdaters::JavaScript::NpmAndYarn,
23
+ "maven" => FileUpdaters::Java::Maven,
24
+ "gradle" => FileUpdaters::Java::Gradle,
25
+ "pip" => FileUpdaters::Python::Pip,
26
+ "composer" => FileUpdaters::Php::Composer,
27
+ "submodules" => FileUpdaters::Git::Submodules,
28
+ "docker" => FileUpdaters::Docker::Docker,
29
+ "hex" => FileUpdaters::Elixir::Hex,
30
+ "cargo" => FileUpdaters::Rust::Cargo,
31
+ "nuget" => FileUpdaters::Dotnet::Nuget,
32
+ "dep" => FileUpdaters::Go::Dep,
33
+ "go_modules" => FileUpdaters::Go::Modules,
34
+ "elm-package" => FileUpdaters::Elm::ElmPackage
35
+ }
36
+
37
+ def self.for_package_manager(package_manager)
38
+ file_updater = @file_updaters[package_manager]
39
+ return file_updater if file_updater
40
+
41
+ raise "Unsupported package_manager #{package_manager}"
42
+ end
43
+
44
+ def self.register(package_manager, file_updater)
45
+ @file_updaters[package_manager] = file_updater
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,58 @@
1
+ # File updaters
2
+
3
+ File updaters update a dependency file to use the latest version of a given
4
+ dependency. They rely on information provided to them by update checkers.
5
+
6
+ There is a `Dependabot::FileUpdaters` class for each language Dependabot
7
+ supports.
8
+
9
+ ## Public API
10
+
11
+ Each `Dependabot::FileUpdaters` class implements the following methods:
12
+
13
+ | Method | Description |
14
+ |------------------------------|-----------------------------------------------------------------------------------------------|
15
+ | `.updated_files_regex` | An array of regular expressions matching the names of the files this class updates. Intended to be used by integrators when checking whether a commit may cause merge-conflicts with a dependency update pull request. |
16
+ | `#updated_dependency_files` | Returns an array of updated `Dependabot::DependencyFile` instances, with their content updated to include the updated dependency. |
17
+
18
+ An integration might look as follows:
19
+
20
+ ```ruby
21
+ require 'dependabot/file_updaters'
22
+
23
+ unless update_checker.can_update?(requirements_to_update: :own)
24
+ raise "Dependency doesn't need update!"
25
+ end
26
+ dependencies = update_checker.updated_dependencies(requirements_to_update: :own)
27
+
28
+ file_updater_class = Dependabot::FileUpdaters::Ruby::Bundler
29
+ file_updater = file_updater_class.new(
30
+ dependencies: dependencies,
31
+ dependency_files: files,
32
+ credentials: [{
33
+ "type" => "git_source",
34
+ "host" => "github.com",
35
+ "username" => "x-access-token",
36
+ "password" => "token"
37
+ }]
38
+ )
39
+
40
+ file_updater.updated_dependency_files.each do |file|
41
+ puts "Updated #{file.name} with new content:\n\n#{file.content}"
42
+ end
43
+ ```
44
+
45
+ ## Writing a file updater for a new language
46
+
47
+ All new file updaters should inherit from `Dependabot::FileUpdaters::Base` and
48
+ implement the following methods:
49
+
50
+ | Method | Description |
51
+ |-----------------------------|-------------------------|
52
+ | `.updated_files_regex` | See Public API section. |
53
+ | `#updated_dependency_files` | See Public API section. |
54
+
55
+ To ensure the above are implemented, you should include
56
+ `it_behaves_like "a dependency file updater"` in your specs for the new file
57
+ updater.
58
+